Cortex-M3异常中断及向量表定义

1、Cortex-M3异常类型

Cortex-M3支持256个中断(或异常),包括16-4-1=11个系统异常(编号为1-15),和最多240个外部中断(编号大于16)——简称IRQ。具体使用了这240个中断源中的多少个,则由芯片制造商决定。由外设产生的中断信号,除了SysTick的之外,全都连接到NVIC的中断输入信号线。典型情况下,处理器一般支持16到32个中断,当然也有在此之外的。

所有能打断正常执行的事件均可称为异常或中断,CM3中异常与中断的区别在于:

中断:240个中断对CM3核来说都是“意外突发事件”, 也就是说该请求信号来CM3内核的外面,来自各种片上外设和外扩的外设,对CM3来说是“异步”的。

异常:异常是因CM3内核的活动产生的,即在执行指令或访问存储器时产生的,对CM3来说是“同步”的。

下表列出了Cortex-M3可以支持的所有异常和外部中断清单。有一定数量的系统异常是用于fault处理的,它们可以由多种错误条件引发。NVIC还提供了一些fault状态寄存器,以便于fault服务例程找出导致异常的具体原因。

Cortex-M3异常中断及向量表定义_第1张图片

Cortex-M3异常中断及向量表定义_第2张图片

在NVIC的中断控制及状态寄存器中,有一个VECTACTIVE位段;另外,还有一个特殊功能寄存器IPSR。在它们二者的里面,都记录了当前正服务的异常,给出了它的编号。

如果一个发生的异常不能被即刻响应,就称它被“悬起”(pending)。不过,少数fault异常是不允许被悬起的。一个异常被悬起的原因,可能是系统当前正在执行一个更高优先级异常的服务例程,或者因相关掩蔽位的设置导致该异常被除能。对于每个异常源,在被悬起的情况下,都会有一个对应的“悬起状态寄存器”保存其异常请求。待到该异常能够响应时,执行其服务例程,这与传统的ARM是完全不同的。在以前,是由产生中断的设备保持住请求信号;CM3则由NVIC的悬起状态寄存器来解决这个问题。于是,哪怕设备在后来已经释放了请求信号,曾经的中断请求也不会错失。


2、Cortex-M3向量表

当CM3内核响应了一个发生的异常后,对应的异常服务例程(ESR)就会执行。为了决定ESR的入口地址,CM3使用了“向量表查表机制”。这里使用一张向量表。向量表其实是一个WORD(32位整数)数组,每个下标对应一种异常,该下标元素的值则是该ESR的入口地址。向量表在地址空间中的位置是可以设置的,通过NVIC中的一个重定位寄存器来指出向量表的地址。在复位后,该寄存器的值为0。因此,在地址0处必须包含一张向量表,用于初始时的异常分配。

Cortex-M3异常中断及向量表定义_第3张图片

举个例子,如果发生了异常11(SVC),则NVIC会计算出偏移移量是11x4=0x2C,然后从那里取出服务例程的入口地址并跳入。要注意的是这里有个另类:0号类型并不是什么入口地址,而是给出了复位后MSP的初值。

你可能感兴趣的:(STM32)