1 异常
M3支持15个系统异常,240个外部异常IRQ,其中NMI,复位,hardfault三个异常的优先级固定不可更改且是负数,其余的都可编程。
M3的异常分为抢占优先级和子优先级。
2 关于中断优先级
M3中,除了复位,NMI以及硬fault有固定的优先级,其他优先级都是可编程的。原则上,CM3支持3个固定的高优先级和多达256级的可编程优先级,并且支持128级抢占。但是,绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数会更少,如8级,16级,32级等。它们在设计时会裁掉表达优先级的几个低端有效位。
如使用3个位表示优先级则配置寄存器的结构如图所示:
(https://img-blog.youkuaiyun.com/20150918210348709)
在M3中,优先级分为两个部分,一个是抢占优先级优先级,一个是子优先级。在计算抢占优先级和子优先级的有效位数时,必须要知道
1、芯片实际使用了多少位来表达优先级
2、优先级组是如何划分的。
举个例子,如果只使用3个位来表达优先级([7:5]),并且优先级组的值是5(从比特5处分组),则得到4级抢占优先级,且在每个抢占优先级的内部有2个子优先级,
(https://img-blog.youkuaiyun.com/20150918210522808)
当然也可设置全部是抢占优先级没有子优先级
(https://img-blog.youkuaiyun.com/20150918210552871)
在编写应用程序的时候,只需要系统所需要的中断分组和组内优先级即可,直接调用m3提供的API函数即可。
在CM3中,允许使用3个位到8个位来表达优先级。为了确定具体的位数,可以先往一个优先级寄存器中写0xFF,再读回来,读出多少个1,就表示使用多少个位来表达优先级。
关于中断配置基础
每个外部中断都在NVIC的下列寄存器中“挂号”:
1. 使能与除能寄存器
2. 悬起与“解悬”寄存器
3. 优先级寄存器
4. 活动状态寄存器
5. 异常掩蔽寄存器(PRIMASK, FAULTMASK以及BASEPRI)
另外,下列寄存器也对中断处理有重大影响
1. 向量表偏移量寄存器