1.知识点说明:
1)Systick属于内核中断,“handled by system handlers”,优先级由Systemhandler priority registers (SHPRx)来设置;(摘自cortex-M3内核编程手册)
2)timer、串口等属于外设中断,“handled by ISRs(Interrupt ServiceRoutines(ISRs))”优先级由Interruptpriority registers (NVIC_IPRx)来设置;(源于cortex-M3内核编程手册)
3)STM32有16个可编程的优先等级(使用了4位中断优先级),(摘自STM3210X参考手册)。此处的4位就是“STM3210x.h”中的__NVIC_PRIO_BITS,是4);
4)Systemhandler priority registers (SHPRx)说明:The SHPR1-SHPR3 registers set the priority level, 0 to 15 of the exceptionhandlers that have configurable priority.即代表内核中断优先级可以在这16个优先等级中选择,那么就和外设中断一样,可以统一设定优先等级。(摘自cortex-M3内核编程手册)
2.分析:
有了以上知识点下面来分析systick的初始化,程序中对其优先级进行重新设定。
systick配置函数中包含中断优先级的设置,如下:
static __INLINE uint32_tSysTick_Config(uint32_t ticks)
{
…………
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
…………
}
由于__NVIC_PRIO_BITS定义为4,上式中(1<<__NVIC_PRIO_BITS)- 1)=15,所以systick的中断优先级是最低的。
3.问题:
在对外设中断优先级设定时用此函数: NVIC_Init(&NVIC_InitStructure);
如果外设设置了主次优先级,以下三种情况中任一个:
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
* 2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
* 1 bits for subpriority
那么优先级就没有15这一级了,该如何理解systick的优先级呢。
答案是:
不管 PriorityGroup是多少,4bit 就意味着 priority 的范围从 0~15
高 PriorityGroup 位就是抢占优先级,低 4 - PriorityGroup位就是亚优先级
假设是下列情况:
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
优先级15 == 主优先级为1,亚优先级为7