132 lines
7.1 KiB
C
132 lines
7.1 KiB
C
/** runtime interrupt table
|
|
* @file
|
|
* @author King Kévin <kingkevin@cuvoodoo.info>
|
|
* @copyright SPDX-License-Identifier: GPL-3.0-or-later
|
|
* @date 2018-2020
|
|
*/
|
|
#include "interrupt.h" // own definitions
|
|
|
|
vector_table_entry_t interrupt_table[NVIC_IRQ_COUNT] = {0};
|
|
|
|
/** handler intercepting interrupts and running the function provided in the table */
|
|
static void isr_handler(void)
|
|
{
|
|
// get current IRQ number
|
|
uint8_t irq = 0;
|
|
if (NVIC_IABR(0)) {
|
|
irq = __builtin_ffs(NVIC_IABR(0)) - 1;
|
|
} else if (NVIC_IABR(1)) {
|
|
irq = __builtin_ffs(NVIC_IABR(1)) + 31;
|
|
} else if (NVIC_IABR(2)) {
|
|
irq = __builtin_ffs(NVIC_IABR(2)) + 64;
|
|
} else {
|
|
while (true);
|
|
}
|
|
// check if the it's a valid IRQ number
|
|
if (irq >= NVIC_IRQ_COUNT) {
|
|
while (true);
|
|
}
|
|
// run user provided ISR
|
|
if (interrupt_table[irq]) {
|
|
(*(void(*)(void))(interrupt_table[irq]))();
|
|
} else {
|
|
while (true);
|
|
}
|
|
}
|
|
|
|
/** use the isr_handler as default ISR
|
|
* @note the ISR can still point to other defined function
|
|
* @remark from libopencm3/lib/stm32/f4/vector_nvic.c
|
|
*/
|
|
void nvic_wwdg_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void pvd_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tamp_stamp_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void rtc_wkup_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void flash_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void rcc_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti0_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti2_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti3_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti4_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream0_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream2_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream3_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream4_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream5_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream6_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void adc_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can1_tx_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can1_rx0_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can1_rx1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can1_sce_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti9_5_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim1_brk_tim9_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim1_up_tim10_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim1_trg_com_tim11_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim1_cc_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim2_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim3_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim4_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void i2c1_ev_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void i2c1_er_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void i2c2_ev_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void i2c2_er_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void spi1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void spi2_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void usart1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void usart2_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void usart3_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void exti15_10_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void rtc_alarm_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void usb_fs_wkup_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim8_brk_tim12_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim8_up_tim13_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim8_trg_com_tim14_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim8_cc_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma1_stream7_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void fsmc_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void sdio_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim5_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void spi3_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void uart4_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void uart5_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim6_dac_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void tim7_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream0_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream2_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream3_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream4_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void eth_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void eth_wkup_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can2_tx_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can2_rx0_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can2_rx1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void can2_sce_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void otg_fs_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream5_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream6_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2_stream7_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void usart6_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void i2c3_ev_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void i2c3_er_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void otg_hs_ep1_out_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void otg_hs_ep1_in_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void otg_hs_wkup_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void otg_hs_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dcmi_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void cryp_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void hash_rng_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void fpu_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void uart7_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void uart8_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void spi4_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void spi5_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void spi6_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void sai1_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void lcd_tft_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void lcd_tft_err_isr(void) __attribute__((weak, alias("isr_handler")));
|
|
void dma2d_isr(void) __attribute__((weak, alias("isr_handler")));
|