Cortex-M系列中断和异常(三)


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 ) 
  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值