1.知識點說明:
1)中斷異常向量表中的優(yōu)先級應該是指的中斷、異常的硬件優(yōu)先級,如果兩個或更多的中斷指定了相同的優(yōu)先級,則由它們的硬件優(yōu)先級來決定處理器對它們進行處理時的順序。(源于cortex-M3技術(shù)參考手冊)
2)Systick屬于內(nèi)核中斷,“handled by system handlers”,優(yōu)先級由Systemhandler priority registers (SHPRx)來設置;(摘自cortex-M3內(nèi)核編程手冊)
3)timer、串口等屬于外設中斷,“handled by ISRs(Interrupt ServiceRoutines(ISRs))”優(yōu)先級由Interruptpriority registers (NVIC_IPRx)來設置;(源于cortex-M3內(nèi)核編程手冊)
4)STM32有16個可編程的優(yōu)先等級(使用了4位中斷優(yōu)先級),(摘自STM3210X參考手冊)。此處的4位就是“STM3210x.h”中的__NVIC_PRIO_BITS,是4);
5)Systemhandler priority registers (SHPRx)說明:The SHPR1-SHPR3 registers set the priority level, 0 to 15 of the exceptionhandlers that have configurable priority.即代表內(nèi)核中斷優(yōu)先級可以在這16個優(yōu)先等級中選擇,那么就和外設中斷一樣,可以統(tǒng)一設定優(yōu)先等級。(摘自cortex-M3內(nèi)核編程手冊)
2.分析:
有了以上知識點下面來分析systick的初始化,程序中對其優(yōu)先級進行重新設定。
systick配置函數(shù)中包含中斷優(yōu)先級的設置,如下:
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的中斷優(yōu)先級是最低的。
3.問題:
在對外設中斷優(yōu)先級設定時用此函數(shù):
如果外設設置了主次優(yōu)先級,以下三種情況中任一個:
那么優(yōu)先級就沒有15這一級了,該如何理解systick的優(yōu)先級呢。
答案是:
不管 PriorityGroup
高 PriorityGroup 位就是搶占優(yōu)先級,低 4 - PriorityGroup
假設是下列情況:
優(yōu)先級15 == 主優(yōu)先級為1,亞優(yōu)先級為7