以下几张是lpc的nvic截图,需要开启在线仿真后再截图~
从中可以看出,编号2-16的异常是cm3内核独有的,不是外设芯片的,也就是说,只要是cm3内核就必须有这些异常。
2和3的异常的优先级是固定为-2,-1的不能更改的,见下表的4.8的框图,这个是f10x的内核技术手册,是cm3技术手册的部分摘录说明的,因此也是很不错的参考资料。中文翻译就是:系统异常优先级寄存器吧,并且是字节访问的,SHPR1-SHPR3 are byte accessible.通常情况下,我们可以更该部分优先级的,比如PendSV 和SysTick,尤其是在有rtos的情况下,就需要根据情况来更改两者的优先级。
lpc1768中,我配置systick=31,因为在lpc的参考手册中是使用了5个bit来表示优先级分组或子优先级的。
来看看是怎么分配31的,这里的配置函数:等价于NVIC_SetPriority (-1,31);
这里等价于:SCB->SHP[11] = ((31<<3)&0xff)=0xF8,如此就将这个字节的高5位填充为1,lpc的优先级是比stm32多一位的,stm32只用了4位。
细看,这里的优先级分组是配置SCB_AIRCR的值=0xfa050000,
在Cortex™ -M3 r2p0 Technical Reference Manual手册中是这么描述的。0b000对应了128抢占优先级和2个子优先级,但是我找不到lpc的内核手册,所以无法明确具体的分组情况。因此保留了复位的值,0xfa050000,
另外外设的优先级我配置了9,来看看怎么配置的,
/* preemption = 1, sub-priority = 1 */
NVIC_SetPriority(TIMER1_IRQn, ((0x01 << 3) | 0x01));
===等价于
/* preemption = 1, sub-priority = 1 */
NVIC_SetPriority(2, ((0x01 << 3) | 0x01));
转到:下面的语句
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); }
===等价于
NVIC->IP[2] = 0x48,cm3内核规定的总共240个优先级寄存器,0x48就是他的优先级使用的高五位的。
下面是stm32的nvic截图,systick中断优先级=240,其实之用了高4位,就是0xf=15