STM32及ARM中断详解

HarderHeng Lv5

ARM体系的中断和异常

当一个中断或者异常触发时,先看到这个中断源有没有被启动,以及它的优先级如何,然后进入中断向量表,如果允许进行中断或者异常的处理,就会根据中断向量表进入中断服务程序

在中断服务程序中进行关中断、保存现场、开中断、处理中断和异常、关中断、恢复现场、开中断

在ARM体系中和异常统一由中断向量表管理。

中断向量表

中断向量表有低端和高端向量表两种,低端向量表就是从0x00000000开始,高端向量表处在0xFFFF0000位置。

image-20240508162736933

中断向量表和ResetHandler

ARM中断向量表的位置默认为0x00000000,中断向量表如下。

1
2
3
4
5
6
7
8
9
_start:
ldr pc, =Reset_Handler /* 复位中断 */
ldr pc, =Undefined_Handler /* 未定义指令中断 */
ldr pc, =SVC_Handler /* SVC(Supervisor)中断*/
ldr pc, =PrefAbort_Handler /* 预取终止中断 */
ldr pc, =DataAbort_Handler /* 数据终止中断 */
ldr pc, =NotUsed_Handler /* 保留中断 */
ldr pc, =IRQ_Handler /* IRQ 中断 */
ldr pc, =FIQ_Handler /* FIQ(快速中断) */

当机器上电启动时会从这个代码开始,先进入ResetHandler进行系统的初始化。当进入中断时,会从中断向量表的起始地址(也就是上面_start)开始,根据中断的类型进行偏移,例如如果偏移量为0x08则会执行SVC中断的语句,pc寄存器直接被装入中断向量的地址,跳转到对应的中断处理。

如果要防止中断嵌套,需要在中断服务程序中加入屏蔽中断的代码。

ResetHandler中是机器上电启动后或者复位后进行初始化的代码,初始化后会进入**_main**函数最后才进入main函数。

可以手动设置中断向量表的地址,一般的做法是在ResetHandler中设置。

STM32(Cortex-M)的中断服务程序

对Cortex-M系列来说,并不遵循arm所规定的普通的中断向量表。

1
2
3
4
5
6
7
__Vectors       DCD     __initial_sp              ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler

可以看到,中断向量表的第一行规定着栈初始化程序的地址,也就是说开机后会先初始化栈,然后才进行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