sysTick系統嘀嗒定時器並非STM32獨有的,它是Cortex內核的部分,CM3為它專門開出一個異常類型,並且在中斷向量表中占有一席之地(異常號15)。這樣它可以很方便的移植到不同廠商出CM3內核的芯片上,尤其對於有實時操作系統的軟件,它一般會作為整個系統的時基,所以這個對操作系統非常重要
1 systick屬於內核異常中斷應該用SHPR設置其優先級;外設中斷屬於ISR應該按NVIC_IPRx來設置優先級。
2STM32用4個位(共16級優先級)來管理所有的中斷優先級(內核中斷systick也用此安排),中斷向量表中用inline的方式規定死了SYSTICK的優先級為最低:15。但可以通過NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - x); //默認X=1
3那么如何理解systick在采用比如優先級2組時(搶占2位共4級(0~3);子2位共4級(0~3))呢?答:15即搶占=3;子優先級=3;也就是說始終都是15看你分組怎么分,它總是排在最后。
總結:這也就說明了在移植UCOS時如何看待外設中斷與軟件定時器及任務的優先級的問題:如果不修改默認systick的硬件優先級,則優先級順序為:外設中斷、軟件定時器(各軟件定時器暫時沒有分優先級按照FIFO順序)、任務級優先級。特殊說明:
1 如果外設中斷的優先級也分成了15(無論你怎么分組:GROUP2(3:3)/GROUP3(7:1))則此時SYSTICK優先級高於同優先級的外設(畢竟內核異常優先級高於外設中斷)
2如果想要精確定時也可使用以下函數將systick整成最高優先級)NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 15);