STM32 异常与中断
STM32 异常与中断
奔跑的夕阳_ 发表于4个月前
STM32 异常与中断
  • 发表于 4个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

    Cortex_M3的内核编号1-15为系统异常,大于等于16的为外部中断。

    所有能打断正常执行流的事件都称为异常。异常是因为内核活动产生的(执行指令或访问存储器),对CM3来讲是同步的。

    中断对CM3核来说是意外突发事件,是来自外设的请求信号,对CM3来讲是异步的。

 

    异常分为不同的优先级,优先级的数值越小,优先级越高。

    CM3支持中断嵌套,使得高优先级异常会抢占低优先级的异常。

    有三个系统异常:复位、NMI、以及硬fault。它们优先级固定且都是负数,使得它们优先级最高。其余的异常的优先级都是可编程的。

    原则上,CM3支持3个固定的高优先级和256个可编程的优先级,支持128级抢占。最少使用三位表达优先级,即最少支持8级优先级。

抢占优先级与子优先级

优先级组把优先级分为高低两段。

    子优先级最少是一位,抢占优先级最多能有7位表示。也就是说CM3原则上支持128级抢占。

    例子:如果只使用 3 个位来表达优先级([7:5]),并且优先级组的值是 5(从比特 5 处分组),则得到 4 级抢占优先级,且在每个抢占优先级的内部有 2 个子优先级。

向量表

    当系统发生异常并要响应该异常的时候,CM3要定位其服务例程的入口地址,这些入口地址就存在向量表中。缺省时,默认位于零地址,各向量占用4字节,故各表项占用4字节。

    零地址一般用于存储引导代码。所以一般将向量表映射到FLASH或者RAM,它们的值在运行时不得被改变。

    为了支持动态重分发中断, CM3 允许向量表重定位——从其它地址处开始定位各异常向量。这些地址对应的区域可以是代码区,但更多是在 RAM 区。在 RAM 区就可以修改向量的入口地址了。为了实现这个功能, NVIC 中有一个寄存器,称为“向量表偏移量寄存器”(在地址 0xE000_ED08 处),通过修改它的值就能重定位向量表。但必须注意的是:向量表的起始地址是有要求的:必须先求出系统中共有多少个向量,再把这个数字向上“圆整”到 2 的整次幂,而起始地址必须对齐到后者的边界上。例如,如果一共有 32 个中断,则共有 32+16(系统异常) =48 个向量,向上圆整到 2 的整次幂后值为 64,因此向量表重定位的地址必须能被 64*4=256 整除,从而合法的起始地址可以是: 0x0, 0x100, 0x200 等。向量表偏移量寄存器的定义如表 7.7 所示。

  

    如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:
 主堆栈指针(MSP)的初始值
 复位向量
 NMI
 硬 fault 服务例程
    后两者也是必需的,因为有可能在引导过程中发生这两种异常。
    可以在 SRAM 中开出一块空间用于存储向量表。在引导期间先填写好各向量,然后在引导完成
后,就可以启用内存中的新向量表,从而实现向量可动态调整的能力。

  中断悬起

    

    当中断输入脚被置为有效(asser) t 后,该中断就被悬起。即使后来中断源撤消了中断请求,已经被标记成悬起的中断也被记录下来。到了系统中它的优先级最高的时候,就会得到响应。
    但是,如果在某个中断得到响应之前,其悬起状态被清除了(例如,在 PRIMASK 或 FAULTMASK置位的时候软件清除了悬起状态标志),则中断被取消。

共有 人打赏支持
粉丝 2
博文 11
码字总数 3649
×
奔跑的夕阳_
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: