本文就STM32中断的以下特性进行解析与归纳
- 启动代码中的中断映射
- 系统中断,内部中断,外部中断
- 中断的优先级设置
- DMA中断的设置
在STM32标配的启动代码中,定义了所有的中断入口,并且集中为向量列表在所有代码的初始位置
RESET sectionAREA RESET, DATA, READONLY
__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler 向量的初始位置是以128字节任何地址,其初始地址可以设置SCB的VTOR寄存器 以下代码是对标准中断向量表地址偏移128字节进行的测试
Vectors AddressHandler_Shift_Size EQU 0x00000080
__Vectors_Shift SPACE Handler_Shift_Size __Vectors DCD __initial_sp ; Top of Stack *scb_vtor = addr & 0x3FFFFF80;
所有中断函数共享相同的最简内容,无限循环
Event HandlerWWDG_IRQHandler : : OTG_FS_IRQHandler
B .
ENDP
所有的中断函数以“脆弱”方式对外部公开,如果有其他同名的函数实现,连接时就会覆盖原有函数
Weak HandlerEXPORT RCC_IRQHandler [WEAK] EXPORT EXTI0_IRQHandler [WEAK]
为了精确的实现中断连接,可以将原始的函数实现删除,强制使用外部函数 以下代码是强制使用C语言函数响应中断
Import HandlerIMPORT SysTick_Handler IMPORT EXTI2_IRQHandler
;SysTick_Handler PROC ;EXPORT SysTick_Handler [WEAK]
;EXPORT EXTI2_IRQHandler [WEAK] ;EXTI2_IRQHandler
STM32的中断分为系统中断,内部中断和外部中断 系统中断和内部中断只需设置相关寄存器即可触发中断 系统中断如SysTick是较常用的中断,设置非常简单,且中断响应也只需单纯的用户逻辑 以下代码仅对用户变量加一操作,主程序中读取数据 SysTick Intterupt*systick_ctrl |= 0x1; //systicker enable
void SysTick_Handler(void) { Pub_Tick_Value++; }
|