K60 使用CM4内核的NVIC中断优先级洗系统。每个中断都可以配置自己的优先级
首先解释2个名词:
但是NVIC本身又比较复杂。首先要将优先级分组(整个芯片的优先级系统分组),可以分成4组
#define NVIC_PriorityGroup_0 ((uint32_t)0x7) /*!< 0 bits for pre-emption priority 4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((uint32_t)0x6) /*!< 1 bits for pre-emption priority 3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((uint32_t)0x5) /*!< 2 bits for pre-emption priority 2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((uint32_t)0x4) /*!< 3 bits for pre-emption priority 1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((uint32_t)0x3) /*!< 4 bits for pre-emption priority 0 bits for subpriority */
首先解释2个名词:
- pre-emption priority 将占优先级: 比子优先级高端。。 也就是说,抢占优先级高的(0比1高,越小越高) 可以打断正在执行的低抢占优先级中断。
- subpriority 子优先级。 只有2个中断具有相同的抢占优先级的情况下,才有意义。这种情况下,同时2个中断发生时,子优先级高的先发生。
说白了就是,我抢占优先级高的,我就是霸权~ 比我抢占优先级低的,你们子优先级是多少也没用。我一律最优先。但是和我同属一个抢占优先级的中断我就搞不定了,那就看我们谁子优先级高谁先发生吧。。。
例子:
printf("NVIC Test\r\n");
uint32_t PreemptPriority, SubPriority;
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);
printf("SystemPrioirityGroup:%d\r\n", NVIC_GetPriorityGrouping());
NVIC_SetPriority(PORTA_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 1));
NVIC_SetPriority(PORTB_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 2));
NVIC_SetPriority(PORTA_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 2, 1));
这句啥意思呢, NVIC_SetPriority 和 NVIC_EncodePriority 都是ARM系统库函数,EncodePrioirity 需要3个参数,原型如下
uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)
<span style="color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(245, 245, 245);">第一个参数,中断分组,直接用</span><span style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(247, 247, 247);">NVIC_GetPriorityGrouping() 获得即可,其实就是2.</span><br style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(245, 245, 245);" /><span style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(247, 247, 247);">PreemptPriority,</span><span style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(247, 247, 247);">SubPriority 我就不用说了吧, 他们每个的取值范围都是0-3 这里 </span><span style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(247, 247, 247);">PreemptPriority = 2; </span><span style="word-wrap: break-word; color: rgb(68, 68, 68); font-family: Tahoma, 'Microsoft Yahei', Simsun; font-size: 14px; line-height: 12px; background-color: rgb(247, 247, 247);">SubPriority = 1;</span>