STM32及ARM中断详解
ARM体系的中断和异常
当一个中断或者异常触发时,先看到这个中断源有没有被启动,以及它的优先级如何,然后进入中断向量表,如果允许进行中断或者异常的处理,就会根据中断向量表进入中断服务程序。
在中断服务程序中进行关中断、保存现场、开中断、处理中断和异常、关中断、恢复现场、开中断
在ARM体系中和异常统一由中断向量表管理。
中断向量表
中断向量表有低端和高端向量表两种,低端向量表就是从0x00000000开始,高端向量表处在0xFFFF0000位置。
中断向量表和ResetHandler
ARM中断向量表的位置默认为0x00000000,中断向量表如下。
1 | _start: |
当机器上电启动时会从这个代码开始,先进入ResetHandler进行系统的初始化。当进入中断时,会从中断向量表的起始地址(也就是上面_start)开始,根据中断的类型进行偏移,例如如果偏移量为0x08则会执行SVC中断的语句,pc寄存器直接被装入中断向量的地址,跳转到对应的中断处理。
如果要防止中断嵌套,需要在中断服务程序中加入屏蔽中断的代码。
ResetHandler中是机器上电启动后或者复位后进行初始化的代码,初始化后会进入**_main**函数最后才进入main函数。
可以手动设置中断向量表的地址,一般的做法是在ResetHandler中设置。
STM32(Cortex-M)的中断服务程序
对Cortex-M系列来说,并不遵循arm所规定的普通的中断向量表。
1 | __Vectors DCD __initial_sp ; Top of Stack |
可以看到,中断向量表的第一行规定着栈初始化程序的地址,也就是说开机后会先初始化栈,然后才进行ResetHandler。
- Title: STM32及ARM中断详解
- Author: HarderHeng
- Created at : 2024-05-08 15:59:41
- Updated at : 2024-11-05 21:04:43
- Link: https://harderheng.life/2024/05/08/STM32及ARM中断详解/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments