转载自:http://www.amobbs.com/thread-4409925-1-1.html
不喜欢用库函数,喜欢自己折腾寄存器,能做到心中有数。这两天折腾中断的事情,中断向量表自定义的问题遇到点麻烦,现在解决了,贴出来跟大家分享一下。 刚开始,根据IAR的手册,将 cstartup_M.c 拷贝到了我的工程目录下,编译没有问题, 但是仿真运行的时候,总是提示 __vector_table 找不到,初始化 MSP 以及 PC 都是错误的,程序乱跑, 加 volatile 也没有用,开来不是优化问题。后来在网上找到一个文件,试验一下可以了。于是把 STM32 所有中断都定义了,方便以后使用。 下面的文件定义的向量表,反汇编后,跟数据手册全部对比过,中断向量地址没有问题。 //========================================================================== // 文件名称: stm32_vector_table.h // 程序功能: STM32 中断向量表定义 // 微控制器: STM32 // 系统时钟: // 版权所有: XXX // 编辑软件: UE13.0 // 编译环境:IAR Embedded Workbench for ARM 5.50 // 编写时间: 2010-11-23 // 程序版本: 1.0 // 程序作者: XXX // 程序修改: // 修改日期: // 修改内容: //========================================================================== //========================================================================== // STM32 中断向量数据类型定义 //========================================================================== typedef void( *intfunc )( void ); // typedef union { intfunc __fun; void * __ptr; } intvec_elem; // #ifdef __ICCARM__ // #pragma language=extended // #if (__VER__ < 500) // #pragma segment="CSTACK" // extern void __program_start(void); // #else // #pragma section="CSTACK" // extern void __iar_program_start(void); // #endif // #if (__VER__ < 500) #endif // #ifdef __ICCARM__ #ifdef __CC_ARM // extern unsigned int Image$$CSTACK$$ZI$$Limit; // extern void __main(void); // #endif // //========================================================================== // STM32 中断函数声明 //========================================================================== void irq_nmi_handler (void); // -02: NMI 不可屏蔽中断 void irq_hard_fault_handler (void); // -01: Hard Fault 硬件失效 void irq_mem_manage_handler (void); // 00: Mem_Manage 存储管理 void irq_bus_fault_handler (void); // 01: Bus Fault 总线实效 void irq_usage_fault_handler (void); // 02: Usage Fault 用法错误,未定义指令或非法状态 void irq_sv_call_handler (void); // 03: SV CALL SWI指令系统服务调用,软中断 void irq_debug_monitor_handler (void); // 04: Debug Monitor 调试监控器 void irq_pend_sv_handler (void); // 05: Pend SV 可挂起系统服务 void irq_sys_tick_handler (void); // 06: Sys Tick 系统滴答定时器 void irq_wwdg_handler (void); // 07: WWDG 窗看门狗定时器中断 void irq_pvd_handler (void); // 08: PVD 电源检测中断,连接到EXIT void irq_tamper_handler (void); // 09: TAMPER 侵入检测中断 void irq_rtc_handler (void); // 10: RTC 实时时钟全局中断 void irq_flash_handler (void); // 11: FLASH 闪存全局中断 void irq_rcc_handler (void); // 12: RCC 时钟检测中断,注意连接到 NMI void irq_exti0_handler (void); // 13: EXTI0 外部中断0,EXTI线0中断 void irq_exti1_handler (void); // 14: EXTI1 外部中断0,EXTI线1中断 void irq_exti2_handler (void); // 15: EXTI2 外部中断0,EXTI线2中断 void irq_exti3_handler (void); // 16: EXTI3 外部中断0,EXTI线3中断 void irq_exti4_handler (void); // 17: EXTI4 外部中断0,EXTI线4中断 void irq_dma1_ch1_handler (void); // 18: DMA1 CH1 DMA1通道1全局中断 void irq_dma1_ch2_handler (void); // 19: DMA1 CH2 DMA1通道2全局中断 void irq_dma1_ch3_handler (void); // 20: DMA1 CH3 DMA1通道3全局中断 void irq_dma1_ch4_handler (void); // 21: DMA1 CH4 DMA1通道4全局中断 void irq_dma1_ch5_handler (void); // 22: DMA1 CH5 DMA1通道5全局中断 void irq_dma1_ch6_handler (void); // 23: DMA1 CH6 DMA1通道6全局中断 void irq_dma1_ch7_handler (void); // 24: DMA1 CH7 DMA1通道7全局中断 void irq_adc1_adc2_handler (void); // 25: ADC1 ADC2 模数转换1、2全局中断 void irq_usb_hp_can_tx_handler (void); // 26: USB HP CAN TX USB高优先级 或 CAN发送中断 void irq_usb_lp_can_rx0_handler (void); // 27: USB LP CAN RX0 USB低优先级 或 CAN接收0中断 void irq_can_rx1_handler (void); // 28: CAN RX1 CAN接收1中断 void irq_can_sce_handler (void); // 29: CAN SCE CAN SCE 中断 void irq_exti5_to_9_handler (void); // 30: EXTI5...9 外部中断5-9,EXTI线5-9中断 void irq_tim1_brk_handler (void); // 31: TIM1 BRK TIM1 刹车中断 void irq_tim1_up_handler (void); // 32: TIM1 UP TIM1 更新中断 void irq_tim1_trg_com_handler (void); // 33: TIM1 TRG COM TIM1 触发 和 通信 中断 void irq_tim1_cc_handler (void); // 34: TIM1 CC TIM1 捕获比较中断 void irq_tim2_handler (void); // 35: TIM2 TIM2 全局中断 void irq_tim3_handler (void); // 36: TIM3 TIM3 全局中断 void irq_tim4_handler (void); // 37: TIM4 TIM4 全局中断 void irq_i2c1_ev_handler (void); // 38: I2C1 EV I2C1 事件中断 void irq_i2c1_er_handler (void); // 39: I2C1 ER I2C1 错误中断 void irq_i2c2_ev_handler (void); // 40: I2C2 EV I2C2 事件中断 void irq_i2c2_er_handler (void); // 41: I2C2 ER I2C2 错误中断 void irq_spi1_handler (void); // 42: SPI1 SPI1 全局中断 void irq_spi2_handler (void); // 43: SPI2 SPI2 全局中断 void irq_usart1_handler (void); // 44: USART1 USART1 全局中断 void irq_usart2_handler (void); // 45: USART2 USART2 全局中断 void irq_usart3_handler (void); // 46: USART3 USART3 全局中断 void irq_exti10_to_15_handler (void); // 47: EXTI10...15 外部中断10-15,EXTI线10-15中断 void irq_rtc_alarm_handler (void); // 48: RTC Alarm RTC 闹钟中断,连接到 EXTI void irq_usb_weekup_handler (void); // 49: USB Weekup USB 待机唤醒中断,连接到 EXTI void irq_tim8_brk_handler (void); // 50: TIM8 BRK TIM8 刹车中断 void irq_tim8_up_handler (void); // 51: TIM8 UP TIM8 更新中断 void irq_tim8_trg_com_handler (void); // 52: TIM8 TRG COM TIM8 触发 和 通信 中断 void irq_tim8_cc_handler (void); // 53: TIM8 CC TIM8 捕获比较中断 void irq_adc3_handler (void); // 54: ADC3 ADC3 全局中断 void irq_fsmc_handler (void); // 55: FSMC FSMC 全局中断 void irq_sdio_handler (void); // 56: SDIO SDIO 全局中断 void irq_tim5_handler (void); // 57: TIM5 TIM5 全局中断 void irq_spi3_handler (void); // 58: SPI3 SPI3 全局中断 void irq_usart4_handler (void); // 59: USART4 USART4 全局中断 void irq_usart5_handler (void); // 60: USART5 USART5 全局中断 void irq_tim6_handler (void); // 61: TIM6 TIM6 全局中断 void irq_tim7_handler (void); // 62: TIM7 TIM7 全局中断 void irq_dma2_ch1_handler (void); // 63: DMA2 CH1 DMA2通道1全局中断 void irq_dma2_ch2_handler (void); // 64: DMA2 CH2 DMA2通道2全局中断 void irq_dma2_ch3_handler (void); // 65: DMA2 CH3 DMA2通道3全局中断 void irq_dma2_ch4_5_handler (void); // 66: DMA2 CH4 CH5 DMA2通道4、5全局中断 void irq_not_used_handler (void); // : Not Used 未使用的中断向量处理 //========================================================================== // STM32 中断向量表定义 //========================================================================== #ifdef __ICCARM__ // #if (__VER__ < 500) // #pragma location = "INTVEC" // #else // #pragma location = ".intvec" // #endif // #if (__VER__ < 500) #endif // #ifdef __ICCARM__ #ifdef __CC_ARM // #pragma arm section rodata = "INTVEC" // #endif // const intvec_elem __vector_table[] = // { // #ifdef __ICCARM__ // { .__ptr = __sfe( "CSTACK" ) }, // #if (__VER__ < 500) // __program_start, // #else // __iar_program_start, // #endif // #if (__VER__ >= 500) #endif // #ifdef __ICCARM__ #ifdef __CC_ARM // (intfunc) &Image$$CSTACK$$ZI$$Limit, // __main, // #endif // irq_nmi_handler , // -02: NMI 不可屏蔽中断 irq_hard_fault_handler , // -01: Hard Fault 硬件失效 irq_mem_manage_handler , // 00: Mem_Manage 存储管理 irq_bus_fault_handler , // 01: Bus Fault 总线实效 irq_usage_fault_handler , // 02: Usage Fault 用法错误,未定义指令或非法状态 irq_not_used_handler , // 未定义 irq_not_used_handler , // 未定义 irq_not_used_handler , // 未定义 irq_not_used_handler , // 未定义 irq_sv_call_handler , // 03: SV CALL SWI指令系统服务调用,软中断 irq_debug_monitor_handler , // 04: Debug Monitor 调试监控器 irq_not_used_handler , // 未定义 irq_pend_sv_handler , // 05: Pend SV 可挂起系统服务 irq_sys_tick_handler , // 06: Sys Tick 系统滴答定时器 irq_wwdg_handler , // 07: WWDG 窗看门狗定时器中断 irq_pvd_handler , // 08: PVD 电源检测中断,连接到EXIT irq_tamper_handler , // 09: TAMPER 侵入检测中断 irq_rtc_handler , // 10: RTC 实时时钟全局中断 irq_flash_handler , // 11: FLASH 闪存全局中断 irq_rcc_handler , // 12: RCC 时钟检测中断,注意连接到 NMI irq_exti0_handler , // 13: EXTI0 外部中断0,EXTI线0中断 irq_exti1_handler , // 14: EXTI1 外部中断0,EXTI线1中断 irq_exti2_handler , // 15: EXTI2 外部中断0,EXTI线2中断 irq_exti3_handler , // 16: EXTI3 外部中断0,EXTI线3中断 irq_exti4_handler , // 17: EXTI4 外部中断0,EXTI线4中断 irq_dma1_ch1_handler , // 18: DMA1 CH1 DMA1通道1全局中断 irq_dma1_ch2_handler , // 19: DMA1 CH2 DMA1通道2全局中断 irq_dma1_ch3_handler , // 20: DMA1 CH3 DMA1通道3全局中断 irq_dma1_ch4_handler , // 21: DMA1 CH4 DMA1通道4全局中断 irq_dma1_ch5_handler , // 22: DMA1 CH5 DMA1通道5全局中断 irq_dma1_ch6_handler , // 23: DMA1 CH6 DMA1通道6全局中断 irq_dma1_ch7_handler , // 24: DMA1 CH7 DMA1通道7全局中断 irq_adc1_adc2_handler , // 25: ADC1 ADC2 模数转换1、2全局中断 irq_usb_hp_can_tx_handler , // 26: USB HP CAN TX USB高优先级 或 CAN发送中断 irq_usb_lp_can_rx0_handler , // 27: USB LP CAN RX0 USB低优先级 或 CAN接收0中断 irq_can_rx1_handler , // 28: CAN RX1 CAN接收1中断 irq_can_sce_handler , // 29: CAN SCE CAN SCE 中断 irq_exti5_to_9_handler , // 30: EXTI5...9 外部中断5-9,EXTI线5-9中断 irq_tim1_brk_handler , // 31: TIM1 BRK TIM1 刹车中断 irq_tim1_up_handler , // 32: TIM1 UP TIM1 更新中断 irq_tim1_trg_com_handler , // 33: TIM1 TRG COM TIM1 触发 和 通信 中断 irq_tim1_cc_handler , // 34: TIM1 CC TIM1 捕获比较中断 irq_tim2_handler , // 35: TIM2 TIM2 全局中断 irq_tim3_handler , // 36: TIM3 TIM3 全局中断 irq_tim4_handler , // 37: TIM4 TIM4 全局中断 irq_i2c1_ev_handler , // 38: I2C1 EV I2C1 事件中断 irq_i2c1_er_handler , // 39: I2C1 ER I2C1 错误中断 irq_i2c2_ev_handler , // 40: I2C2 EV I2C2 事件中断 irq_i2c2_er_handler , // 41: I2C2 ER I2C2 错误中断 irq_spi1_handler , // 42: SPI1 SPI1 全局中断 irq_spi2_handler , // 43: SPI2 SPI2 全局中断 irq_usart1_handler , // 44: USART1 USART1 全局中断 irq_usart2_handler , // 45: USART2 USART2 全局中断 irq_usart3_handler , // 46: USART3 USART3 全局中断 irq_exti10_to_15_handler , // 47: EXTI10...15 外部中断10-15,EXTI线10-15中断 irq_rtc_alarm_handler , // 48: RTC Alarm RTC 闹钟中断,连接到 EXTI irq_usb_weekup_handler , // 49: USB Weekup USB 待机唤醒中断,连接到 EXTI irq_tim8_brk_handler , // 50: TIM8 BRK TIM8 刹车中断 irq_tim8_up_handler , // 51: TIM8 UP TIM8 更新中断 irq_tim8_trg_com_handler , // 52: TIM8 TRG COM TIM8 触发 和 通信 中断 irq_tim8_cc_handler , // 53: TIM8 CC TIM8 捕获比较中断 irq_adc3_handler , // 54: ADC3 ADC3 全局中断 irq_fsmc_handler , // 55: FSMC FSMC 全局中断 irq_sdio_handler , // 56: SDIO SDIO 全局中断 irq_tim5_handler , // 57: TIM5 TIM5 全局中断 irq_spi3_handler , // 58: SPI3 SPI3 全局中断 irq_usart4_handler , // 59: USART4 USART4 全局中断 irq_usart5_handler , // 60: USART5 USART5 全局中断 irq_tim6_handler , // 61: TIM6 TIM6 全局中断 irq_tim7_handler , // 62: TIM7 TIM7 全局中断 irq_dma2_ch1_handler , // 63: DMA2 CH1 DMA2通道1全局中断 irq_dma2_ch2_handler , // 64: DMA2 CH2 DMA2通道2全局中断 irq_dma2_ch3_handler , // 65: DMA2 CH3 DMA2通道3全局中断 irq_dma2_ch4_5_handler , // 66: DMA2 CH4 CH5 DMA2通道4、5全局中断 }; // //========================================================================== // STM32 中断函数 //========================================================================== __weak void irq_nmi_handler (void) {}; // -02: NMI 不可屏蔽中断 __weak void irq_hard_fault_handler (void) {}; // -01: Hard Fault 硬件失效 __weak void irq_mem_manage_handler (void) {}; // 00: Mem_Manage 存储管理 __weak void irq_bus_fault_handler (void) {}; // 01: Bus Fault 总线实效 __weak void irq_usage_fault_handler (void) {}; // 02: Usage Fault 用法错误,未定义指令或非法状态 __weak void irq_sv_call_handler (void) {}; // 03: SV CALL SWI指令系统服务调用,软中断 __weak void irq_debug_monitor_handler (void) {}; // 04: Debug Monitor 调试监控器 __weak void irq_pend_sv_handler (void) {}; // 05: Pend SV 可挂起系统服务 __weak void irq_sys_tick_handler (void) {}; // 06: Sys Tick 系统滴答定时器 __weak void irq_wwdg_handler (void) {}; // 07: WWDG 窗看门狗定时器中断 __weak void irq_pvd_handler (void) {}; // 08: PVD 电源检测中断,连接到EXIT __weak void irq_tamper_handler (void) {}; // 09: TAMPER 侵入检测中断 __weak void irq_rtc_handler (void) {}; // 10: RTC 实时时钟全局中断 __weak void irq_flash_handler (void) {}; // 11: FLASH 闪存全局中断 __weak void irq_rcc_handler (void) {}; // 12: RCC 时钟检测中断,注意连接到 NMI __weak void irq_exti0_handler (void) {}; // 13: EXTI0 外部中断0,EXTI线0中断 __weak void irq_exti1_handler (void) {}; // 14: EXTI1 外部中断0,EXTI线1中断 __weak void irq_exti2_handler (void) {}; // 15: EXTI2 外部中断0,EXTI线2中断 __weak void irq_exti3_handler (void) {}; // 16: EXTI3 外部中断0,EXTI线3中断 __weak void irq_exti4_handler (void) {}; // 17: EXTI4 外部中断0,EXTI线4中断 __weak void irq_dma1_ch1_handler (void) {}; // 18: DMA1 CH1 DMA1通道1全局中断 __weak void irq_dma1_ch2_handler (void) {}; // 19: DMA1 CH2 DMA1通道2全局中断 __weak void irq_dma1_ch3_handler (void) {}; // 20: DMA1 CH3 DMA1通道3全局中断 __weak void irq_dma1_ch4_handler (void) {}; // 21: DMA1 CH4 DMA1通道4全局中断 __weak void irq_dma1_ch5_handler (void) {}; // 22: DMA1 CH5 DMA1通道5全局中断 __weak void irq_dma1_ch6_handler (void) {}; // 23: DMA1 CH6 DMA1通道6全局中断 __weak void irq_dma1_ch7_handler (void) {}; // 24: DMA1 CH7 DMA1通道7全局中断 __weak void irq_adc1_adc2_handler (void) {}; // 25: ADC1 ADC2 模数转换1、2全局中断 __weak void irq_usb_hp_can_tx_handler (void) {}; // 26: USB HP CAN TX USB高优先级 或 CAN发送中断 __weak void irq_usb_lp_can_rx0_handler (void) {}; // 27: USB LP CAN RX0 USB低优先级 或 CAN接收0中断 __weak void irq_can_rx1_handler (void) {}; // 28: CAN RX1 CAN接收1中断 __weak void irq_can_sce_handler (void) {}; // 29: CAN SCE CAN SCE 中断 __weak void irq_exti5_to_9_handler (void) {}; // 30: EXTI5...9 外部中断5-9,EXTI线5-9中断 __weak void irq_tim1_brk_handler (void) {}; // 31: TIM1 BRK TIM1 刹车中断 __weak void irq_tim1_up_handler (void) {}; // 32: TIM1 UP TIM1 更新中断 __weak void irq_tim1_trg_com_handler (void) {}; // 33: TIM1 TRG COM TIM1 触发 和 通信 中断 __weak void irq_tim1_cc_handler (void) {}; // 34: TIM1 CC TIM1 捕获比较中断 __weak void irq_tim2_handler (void) {}; // 35: TIM2 TIM2 全局中断 __weak void irq_tim3_handler (void) {}; // 36: TIM3 TIM3 全局中断 __weak void irq_tim4_handler (void) {}; // 37: TIM4 TIM4 全局中断 __weak void irq_i2c1_ev_handler (void) {}; // 38: I2C1 EV I2C1 事件中断 __weak void irq_i2c1_er_handler (void) {}; // 39: I2C1 ER I2C1 错误中断 __weak void irq_i2c2_ev_handler (void) {}; // 40: I2C2 EV I2C2 事件中断 __weak void irq_i2c2_er_handler (void) {}; // 41: I2C2 ER I2C2 错误中断 __weak void irq_spi1_handler (void) {}; // 42: SPI1 SPI1 全局中断 __weak void irq_spi2_handler (void) {}; // 43: SPI2 SPI2 全局中断 __weak void irq_usart1_handler (void) {}; // 44: USART1 USART1 全局中断 __weak void irq_usart2_handler (void) {}; // 45: USART2 USART2 全局中断 __weak void irq_usart3_handler (void) {}; // 46: USART3 USART3 全局中断 __weak void irq_exti10_to_15_handler (void) {}; // 47: EXTI10...15 外部中断10-15,EXTI线10-15中断 __weak void irq_rtc_alarm_handler (void) {}; // 48: RTC Alarm RTC 闹钟中断,连接到 EXTI __weak void irq_usb_weekup_handler (void) {}; // 49: USB Weekup USB 待机唤醒中断,连接到 EXTI __weak void irq_tim8_brk_handler (void) {}; // 50: TIM8 BRK TIM8 刹车中断 __weak void irq_tim8_up_handler (void) {}; // 51: TIM8 UP TIM8 更新中断 __weak void irq_tim8_trg_com_handler (void) {}; // 52: TIM8 TRG COM TIM8 触发 和 通信 中断 __weak void irq_tim8_cc_handler (void) {}; // 53: TIM8 CC TIM8 捕获比较中断 __weak void irq_adc3_handler (void) {}; // 54: ADC3 ADC3 全局中断 __weak void irq_fsmc_handler (void) {}; // 55: FSMC FSMC 全局中断 __weak void irq_sdio_handler (void) {}; // 56: SDIO SDIO 全局中断 __weak void irq_tim5_handler (void) {}; // 57: TIM5 TIM5 全局中断 __weak void irq_spi3_handler (void) {}; // 58: SPI3 SPI3 全局中断 __weak void irq_usart4_handler (void) {}; // 59: USART4 USART4 全局中断 __weak void irq_usart5_handler (void) {}; // 60: USART5 USART5 全局中断 __weak void irq_tim6_handler (void) {}; // 61: TIM6 TIM6 全局中断 __weak void irq_tim7_handler (void) {}; // 62: TIM7 TIM7 全局中断 __weak void irq_dma2_ch1_handler (void) {}; // 63: DMA2 CH1 DMA2通道1全局中断 __weak void irq_dma2_ch2_handler (void) {}; // 64: DMA2 CH2 DMA2通道2全局中断 __weak void irq_dma2_ch3_handler (void) {}; // 65: DMA2 CH3 DMA2通道3全局中断 __weak void irq_dma2_ch4_5_handler (void) {}; // 66: DMA2 CH4 CH5 DMA2通道4、5全局中断 __weak void irq_not_used_handler (void) {}; // : Not Used 未使用的中断向量处理 |