在第一個函數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; }
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;
#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就是其中一個緣由吧。