您的位置:首页 > 其它

关于STM32的NVIC问题

2014-10-04 10:00 127 查看
转载自: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 未使用的中断向量处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: