static __INLINE uint32_t SysTick_Config(uint32_t ticks) { // 判斷 tick 的值是否大於 2^24,如果大於,則不符合規則 if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); // 初始化reload寄存器的值 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //之所以要減1 個人認為是因為計數是從零開始的 // 配置中斷優先級,配置為15,默認為最低的優先級 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //(1<<4為16,—1為15) // 初始化counter的值為0 SysTick->VAL = 0; // 配置 systick 的時鍾為 72M // 使能中斷 // 使能systick SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; return (0);
Systick模塊初始化配置函數(Systick_config)中設定模塊中斷優先級的函數為:
NVIC_SetPriority((SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
參數SysTick_IRQn為systick基址,這個沒什么好說的
關鍵在參數 (1<<__NVIC_PRIO_BITS) - 1);這個參數即占先優先級值,其中—NVIC_PRIO_BITS是stm32.h中的宏定義,庫函數默認為4,表示用4位表示占先優先級,因為m3內核只有4位用來表示占先優先級和響應優先級,那么響應優先級就剩下0位了,也就是沒有響應優先級之分,
按照上式計算若NVIC_PRIO_BITS為4則占先優先級為15,即最低優先級值
依次可類推,即 (1<<__NVIC_PRIO_BITS) - 1);表示的是可用的最低優先級(1<<4為16,—1為15),將后面那個紅色的1改為其他值即可改變此模塊占先優先級