diff options
author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2012-08-07 16:50:46 +0200 |
---|---|---|
committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2012-08-07 16:50:46 +0200 |
commit | e586c178073b9a0fee90d5fc8e795d266ebd7b7d (patch) | |
tree | ca9a9c40bab37d5af440c80833755223e2bdd946 /interrupt/interrupt.cpp |
Initial import.
Most sources are split off from suzumebachi project revision 2fc77d2 as is with some path changes. New build rules introduced.
Diffstat (limited to 'interrupt/interrupt.cpp')
-rw-r--r-- | interrupt/interrupt.cpp | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/interrupt/interrupt.cpp b/interrupt/interrupt.cpp new file mode 100644 index 0000000..cebfed7 --- /dev/null +++ b/interrupt/interrupt.cpp @@ -0,0 +1,187 @@ +#include "interrupt.h" + +namespace Interrupt { + MFP mf_vectors[16 + NUM_IRQs]; +}; + +void entry(); + +void member_function_interrupt_gate() { + uint32_t interrupt_num; + asm ("mrs %0, ipsr" : "=r" (interrupt_num)); + + Interrupt::mf_vectors[interrupt_num].func_p(Interrupt::mf_vectors[interrupt_num].instance_p); +} + +extern "C" void unused_interrupt() { + member_function_interrupt_gate(); + //while(1); +} + +template<> void interrupt<Interrupt::NMI>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::HardFault>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::MemManage>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::BusFault>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::UsageFault>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::SVCall>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::PendSV>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::SysTick>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::WWDG>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::PVD>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TAMPER>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::RTC>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::FLASH>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::RCC>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI0>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI1>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI4>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel1>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel4>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel5>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel6>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA1_Channel7>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::ADC1_2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::USB_HP_CAN_TX>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::USB_LP_CAN_RX0>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::CAN_RX1>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::CAN_SCE>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI9_5>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM1_BRK>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM1_UP>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM1_TRG_COM>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM1_CC>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM4>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::I2C1_EV>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::I2C1_ER>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::I2C2_EV>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::I2C2_ER>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::SPI1>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::SPI2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::USART1>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::USART2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::USART3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::EXTI15_10>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::RTCAlarm>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::USBWakeup>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM8_BRK>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM8_UP>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM8_TRG_COM>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM8_CC>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::ADC3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::FSMC>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::SDIO>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM5>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::SPI3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::UART4>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::UART5>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM6>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::TIM7>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA2_Channel1>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA2_Channel2>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA2_Channel3>() __attribute__ ((weak, alias ("unused_interrupt"))); +template<> void interrupt<Interrupt::DMA2_Channel4_5>() __attribute__ ((weak, alias ("unused_interrupt"))); + +typedef void (*vector_t)(); + +vector_t vectors[] __attribute__((section(".vectors"))) = { + (vector_t)0x20004ffc, + entry, + interrupt<Interrupt::NMI>, + interrupt<Interrupt::HardFault>, + interrupt<Interrupt::MemManage>, + interrupt<Interrupt::BusFault>, + interrupt<Interrupt::UsageFault>, + 0, + 0, + 0, + 0, + interrupt<Interrupt::SVCall>, + 0, + 0, + interrupt<Interrupt::PendSV>, + interrupt<Interrupt::SysTick>, + interrupt<Interrupt::WWDG>, + interrupt<Interrupt::PVD>, + interrupt<Interrupt::TAMPER>, + interrupt<Interrupt::RTC>, + interrupt<Interrupt::FLASH>, + interrupt<Interrupt::RCC>, + interrupt<Interrupt::EXTI0>, + interrupt<Interrupt::EXTI1>, + interrupt<Interrupt::EXTI2>, + interrupt<Interrupt::EXTI3>, + interrupt<Interrupt::EXTI4>, + interrupt<Interrupt::DMA1_Channel1>, + interrupt<Interrupt::DMA1_Channel2>, + interrupt<Interrupt::DMA1_Channel3>, + interrupt<Interrupt::DMA1_Channel4>, + interrupt<Interrupt::DMA1_Channel5>, + interrupt<Interrupt::DMA1_Channel6>, + interrupt<Interrupt::DMA1_Channel7>, + interrupt<Interrupt::ADC1_2>, + interrupt<Interrupt::USB_HP_CAN_TX>, + interrupt<Interrupt::USB_LP_CAN_RX0>, + interrupt<Interrupt::CAN_RX1>, + interrupt<Interrupt::CAN_SCE>, + interrupt<Interrupt::EXTI9_5>, + interrupt<Interrupt::TIM1_BRK>, + interrupt<Interrupt::TIM1_UP>, + interrupt<Interrupt::TIM1_TRG_COM>, + interrupt<Interrupt::TIM1_CC>, + interrupt<Interrupt::TIM2>, + interrupt<Interrupt::TIM3>, + interrupt<Interrupt::TIM4>, + interrupt<Interrupt::I2C1_EV>, + interrupt<Interrupt::I2C1_ER>, + interrupt<Interrupt::I2C2_EV>, + interrupt<Interrupt::I2C2_ER>, + interrupt<Interrupt::SPI1>, + interrupt<Interrupt::SPI2>, + interrupt<Interrupt::USART1>, + interrupt<Interrupt::USART2>, + interrupt<Interrupt::USART3>, + interrupt<Interrupt::EXTI15_10>, + interrupt<Interrupt::RTCAlarm>, + interrupt<Interrupt::USBWakeup>, + interrupt<Interrupt::TIM8_BRK>, + interrupt<Interrupt::TIM8_UP>, + interrupt<Interrupt::TIM8_TRG_COM>, + interrupt<Interrupt::TIM8_CC>, + interrupt<Interrupt::ADC3>, + interrupt<Interrupt::FSMC>, + interrupt<Interrupt::SDIO>, + interrupt<Interrupt::TIM5>, + interrupt<Interrupt::SPI3>, + interrupt<Interrupt::UART4>, + interrupt<Interrupt::UART5>, + interrupt<Interrupt::TIM6>, + interrupt<Interrupt::TIM7>, + interrupt<Interrupt::DMA2_Channel1>, + interrupt<Interrupt::DMA2_Channel2>, + interrupt<Interrupt::DMA2_Channel3>, + interrupt<Interrupt::DMA2_Channel4_5>, + 0, // 60 + 0, // 61 + 0, // 62 + 0, // 63 + 0, // 64 + 0, // 65 + 0, // 66 + 0, // 67 + 0, // 68 + 0, // 69 + 0, // 70 + 0, // 71 + 0, // 72 + 0, // 73 + 0, // 74 + 0, // 75 + 0, // 76 + interrupt<(Interrupt::IRQ)77>, // 77 +}; |