文章目录
Cortex-M系列中断和异常
在CMSIS-Core中,中断和异常的相关寄存器不止存在于NVIC数据结构中,还有一部分在系统控制块(SCB)的数据结构中。
1.1 SCB中的寄存器
下面是SCB中的寄存器一览表,这些是所有的寄存器,这里面只有一部分与中断和异常有关:
1.1.1 中断控制和状态寄存器(SCB->ICSR)
ICSR=>Interrupt Control State Register,此寄存器的主要作用:
- 设置和清除系统异常的挂起状态,和NVIC中断挂起寄存器差不多,异常包括Systick、PendSV、NMI;
- 通过读取VECTACTIVE=>Vector Active域,可以确定当前执行的异常/中断编号,VECTACTIVE域和上一节提到的IPSR相同;
1.1.2 向量表偏移寄存器(SCB->VTOR)
向量表偏移寄存器地址为0xE000ED0C,可由CMSIS-Core中的SCB->VTOR来访问。这个寄存器里面始终存着要使用的向量表。具体说明如下:
1.1.3 应用中断和复位控制寄存器(SCB->AIRCR)
AIRCR=>Application Interrupt Reset Control Register。多数情况下,可以使用CMSIS-Core函数NVIC_SetPriorityGrouping和NVIC_GetPriorityGrouping来访问PRIGROUP,如下图。VECTRESET和VECTCLRACTIVE位域是为调试器设计的,尽管软件可以利用VECTRESET触发一次处理器复位,不过由于它不会复位外设等系统中的其他部分,因此多数应用程序是不大会用到它的。若想产生一次系统复位,多数情况下(取决于芯片设计和应用复位需求)应该使用SYSRESETREQ。
有一点要注意,VECTRESET和VECTCLRACTIVE不应同时置位,非要这么做的话会导致Cortex-M3/M4设备的复位电路出错,这是因为VECTRESET信号会复位SYSRESETREQ。根据微控制器复位电路设计,将1写入SYSRESETREQ后,处理器可能会在复位实际产生前继续执行几条指令,因此,通常要在系统复位请求后加上一个死循环,保证不会执行后面的代码。
1.1.4 系统处理优先级寄存器(SCB->SHP[0~11])
这个寄存器组和中断优先级寄存器组类似,但是SHP寄存器是用于系统的异常,配置系统异常优先级同样可以用CMSIS-Core的接口,NVIC_SetPriority和NVIC_GetPriority。具体的寄存器如下:
注意这一组寄存器都是一个字节8bit的,在很多的操作系统中会把systick和pendsv系统异常配置为最低的优先级,具体的代码如下:
// FreeRTOS
#define configKERNEL_INTERRUPT_PRIORITY 255
#define portNVIC_PENDSV_PRI ( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )