從第二個函數NVIC_PriorityGroupConfig()中瞭解Cortex-M3的中斷

在第一個函數SystemInit()的下一行,會有常見的另外一個函數NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X)(X表明數字1,2,3...)。此函數跟中斷配置相關,配置中斷優先級,包括搶佔優先級與子優先級。安全

關於NVIC(中斷向量控制器)的介紹STM32參考手冊中是找不到的。須要看《Cortex-M3權威指南》,這本書是着重描述此M3內核相關的東西。NVIC也在其中,由於它是內核中很重要的一部分。函數

看了下這本書,對於NVIC描述的很詳細。我就直接截圖咯。ui

跟NVIC打交道的寄存器截圖說明。操做NVIC,這些寄存器都是須要掌握的,尤爲是須要「掛號」的那四個寄存器。spa

關於中斷使能與禁能code

這個的話Cortex-M3分別使用了兩個寄存器控制,一個負責使能與禁能,不像一些簡單的單片機一個BIT位就搞定這兩個功能,此功能帶來的好處就是安全了,不用懼怕擔憂本身的誤操做。由於此寄存器都是寫1有效,寫0無效。使能某寄存器則需向使能寄存器寫1,禁能需向禁能寄存器寫1。ci

下面的截圖說的是關於懸起與解懸寄存器it


中斷優先級io

每一個外部中斷的優先級寄存器佔8位,可是容許最少只使用最高3位。STM32的話就是使用了最高4位。而且4個相鄰的優先級寄存器拼接成一個32位寄存器。中斷優先級又分爲搶佔優先級和子優先級。STM32中,優先級寄存器中高四位中的高兩位說明搶佔優先級,低兩位說明子優先級。搶佔優先級的話就是能打斷低搶佔優先級的中斷,從而實現中斷嵌套。class

下面也是截圖看看優先級有哪幾種分配狀況配置


下面的截圖說明優先級如何肯定和嵌套規則


關於那幾個須要掌握的與中斷寄存器,還有一個截圖:



下面的截圖關於中斷是如何創建的



固然還有一些其它跟中斷相關的寄存器,不是很經常使用,就沒寫在這裏了。

那麼如今具體說說這個優先級配置函數,函數定義實現以下:

/**
  * @brief  Configures the priority grouping: pre-emption priority and subpriority.
  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length. 
  *   This parameter can be one of the following values:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority
  * @retval None
  */
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

此函數在misc.c原文件中,函數只有兩句話。其中

assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));

assert_param是定義的一個宏,用來檢測表達式的正確性。若是表達式正確則什麼也不作,繼續執行下面的語句。若是參數有錯,就會在當前行報錯。這裏主要檢測咱們輸入的NVIC配置優先級是否有效。

/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;

這句話纔是關鍵,實現了優先級的配置。其中AIRCR_VECTKEY_MASK至關於個鑰匙,用一個宏實現。在此源文件的開始處聲明,其值爲:

#define AIRCR_VECTKEY_MASK    ((uint32_t)0x05FA0000)


由於NVIC是個很關鍵的寄存器,不能隨便配置,因而須要一個輸入標記才能進行正確配置,此標記就至關於一把鑰匙。其中NVIC_PriorityGroup值的選擇就是函數上方中那些宏,一共有5種狀況。

/**
  * @brief  Configures the priority grouping: pre-emption priority and subpriority.
  * @param  NVIC_PriorityGroup: specifies the priority grouping bits length. 
  *   This parameter can be one of the following values:
  *     @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
  *                                4 bits for subpriority
  *     @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
  *                                3 bits for subpriority
  *     @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
  *                                2 bits for subpriority
  *     @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
  *                                1 bits for subpriority
  *     @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
  *                                0 bits for subpriority
  * @retval None
  */
另外發現如今有不少實時系統都是根據Cortex-M3內核量身訂造的,想必其強大的NVIC就是其中一個緣由吧。
相關文章
相關標籤/搜索