vector.c (5477B)
1 2 /* 3 * Source: libopencm3 library: https://github.com/libopencm3/libopencm3 4 */ 5 6 #include "vector.h" 7 8 void blocking_handler(void); 9 void null_handler(void); 10 void reset_handler(void); 11 int main(void); 12 13 void nmi_handler(void) __attribute__((weak, alias("null_handler"))); 14 void hard_fault_handler(void) __attribute__((weak, alias("blocking_handler"))); 15 void sv_call_handler(void) __attribute__((weak, alias("null_handler"))); 16 void pend_sv_handler(void) __attribute__((weak, alias("null_handler"))); 17 void systick_handler(void) __attribute__((weak, alias("null_handler"))); 18 void mem_manage_handler(void) __attribute__((weak, alias("blocking_handler"))); 19 void bus_fault_handler(void) __attribute__((weak, alias("blocking_handler"))); 20 void usage_fault_handler(void) __attribute__((weak, alias("blocking_handler"))); 21 void debug_monitor_handler(void) __attribute__((weak, alias("null_handler"))); 22 23 void wdt_isr(void) __attribute__((weak, alias("blocking_handler"))); 24 void timer0_isr(void) __attribute__((weak, alias("blocking_handler"))); 25 void timer1_isr(void) __attribute__((weak, alias("blocking_handler"))); 26 void timer2_isr(void) __attribute__((weak, alias("blocking_handler"))); 27 void timer3_isr(void) __attribute__((weak, alias("blocking_handler"))); 28 void uart0_isr(void) __attribute__((weak, alias("blocking_handler"))); 29 void uart1_isr(void) __attribute__((weak, alias("blocking_handler"))); 30 void uart2_isr(void) __attribute__((weak, alias("blocking_handler"))); 31 void uart3_isr(void) __attribute__((weak, alias("blocking_handler"))); 32 void pwm_isr(void) __attribute__((weak, alias("blocking_handler"))); 33 void i2c0_isr(void) __attribute__((weak, alias("blocking_handler"))); 34 void i2c1_isr(void) __attribute__((weak, alias("blocking_handler"))); 35 void i2c2_isr(void) __attribute__((weak, alias("blocking_handler"))); 36 void spi_isr(void) __attribute__((weak, alias("blocking_handler"))); 37 void ssp0_isr(void) __attribute__((weak, alias("blocking_handler"))); 38 void ssp1_isr(void) __attribute__((weak, alias("blocking_handler"))); 39 void pll0_isr(void) __attribute__((weak, alias("blocking_handler"))); 40 void rtc_isr(void) __attribute__((weak, alias("blocking_handler"))); 41 void eint0_isr(void) __attribute__((weak, alias("blocking_handler"))); 42 void eint1_isr(void) __attribute__((weak, alias("blocking_handler"))); 43 void eint2_isr(void) __attribute__((weak, alias("blocking_handler"))); 44 void eint3_isr(void) __attribute__((weak, alias("blocking_handler"))); 45 void adc_isr(void) __attribute__((weak, alias("blocking_handler"))); 46 void bod_isr(void) __attribute__((weak, alias("blocking_handler"))); 47 void usb_isr(void) __attribute__((weak, alias("blocking_handler"))); 48 void can_isr(void) __attribute__((weak, alias("blocking_handler"))); 49 void gpdma_isr(void) __attribute__((weak, alias("blocking_handler"))); 50 void i2s_isr(void) __attribute__((weak, alias("blocking_handler"))); 51 void ethernet_isr(void) __attribute__((weak, alias("blocking_handler"))); 52 void rit_isr(void) __attribute__((weak, alias("blocking_handler"))); 53 void motor_pwm_isr(void) __attribute__((weak, alias("blocking_handler"))); 54 void qei_isr(void) __attribute__((weak, alias("blocking_handler"))); 55 void pll1_isr(void) __attribute__((weak, alias("blocking_handler"))); 56 void usb_act_isr(void) __attribute__((weak, alias("blocking_handler"))); 57 void can_act_isr(void) __attribute__((weak, alias("blocking_handler"))); 58 59 #define IRQ_HANDLERS \ 60 [NVIC_WDT_IRQ] = wdt_isr, \ 61 [NVIC_TIMER0_IRQ] = timer0_isr, \ 62 [NVIC_TIMER1_IRQ] = timer1_isr, \ 63 [NVIC_TIMER2_IRQ] = timer2_isr, \ 64 [NVIC_TIMER3_IRQ] = timer3_isr, \ 65 [NVIC_UART0_IRQ] = uart0_isr, \ 66 [NVIC_UART1_IRQ] = uart1_isr, \ 67 [NVIC_UART2_IRQ] = uart2_isr, \ 68 [NVIC_UART3_IRQ] = uart3_isr, \ 69 [NVIC_PWM_IRQ] = pwm_isr, \ 70 [NVIC_I2C0_IRQ] = i2c0_isr, \ 71 [NVIC_I2C1_IRQ] = i2c1_isr, \ 72 [NVIC_I2C2_IRQ] = i2c2_isr, \ 73 [NVIC_SPI_IRQ] = spi_isr, \ 74 [NVIC_SSP0_IRQ] = ssp0_isr, \ 75 [NVIC_SSP1_IRQ] = ssp1_isr, \ 76 [NVIC_PLL0_IRQ] = pll0_isr, \ 77 [NVIC_RTC_IRQ] = rtc_isr, \ 78 [NVIC_EINT0_IRQ] = eint0_isr, \ 79 [NVIC_EINT1_IRQ] = eint1_isr, \ 80 [NVIC_EINT2_IRQ] = eint2_isr, \ 81 [NVIC_EINT3_IRQ] = eint3_isr, \ 82 [NVIC_ADC_IRQ] = adc_isr, \ 83 [NVIC_BOD_IRQ] = bod_isr, \ 84 [NVIC_USB_IRQ] = usb_isr, \ 85 [NVIC_CAN_IRQ] = can_isr, \ 86 [NVIC_GPDMA_IRQ] = gpdma_isr, \ 87 [NVIC_I2S_IRQ] = i2s_isr, \ 88 [NVIC_ETHERNET_IRQ] = ethernet_isr, \ 89 [NVIC_RIT_IRQ] = rit_isr, \ 90 [NVIC_MOTOR_PWM_IRQ] = motor_pwm_isr, \ 91 [NVIC_QEI_IRQ] = qei_isr, \ 92 [NVIC_PLL1_IRQ] = pll1_isr, \ 93 [NVIC_USB_ACT_IRQ] = usb_act_isr, \ 94 [NVIC_CAN_ACT_IRQ] = can_act_isr 95 96 __attribute__ ((section(".vectors"))) 97 vector_table_t vector_table = { 98 .initial_sp_value = &_stack, 99 .reset = reset_handler, 100 .nmi = nmi_handler, 101 .hard_fault = hard_fault_handler, 102 .memory_manage_fault = mem_manage_handler, 103 .bus_fault = bus_fault_handler, 104 .usage_fault = usage_fault_handler, 105 .sv_call = sv_call_handler, 106 .debug_monitor = debug_monitor_handler, 107 .pend_sv = pend_sv_handler, 108 .systick = systick_handler, 109 .irq = { IRQ_HANDLERS }, 110 }; 111 112 void reset_handler(void) { 113 unsigned int *src, *dest; 114 115 for (src = &_data_lma, dest = &_data; 116 dest < &_edata; 117 src++, dest++) { 118 *dest = *src; 119 } 120 121 while (dest < &_ebss) { 122 *dest++ = 0; 123 } 124 125 (void)main(); 126 127 blocking_handler(); 128 } 129 130 void blocking_handler(void) { 131 while(1) {} 132 } 133 134 void null_handler(void) { } 135