STM32關於優先級設定的理解 NVIC_SetPriority()


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改為其他值即可改變此模塊占先優先級


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM