關於STM32 NVIC 中斷優先級管理 也是由一系列寄存器組組成的
對於初學者而言,很對寄存器是不需要太深的研究,因為系統默認已經配置好了,但這里也給大家簡單介紹一下
如 ISER[8]: ISER 全稱是: Interrupt Set-Enable Registers,這是一個中斷使能寄存器組。
ICER[8]:全稱是: Interrupt Clear-Enable Registers,是一個中斷除能寄存器組
ISPR[8]:全稱是: Interrupt Set-Pending Registers,是一個中斷掛起控制寄存器組
ICPR[8]:全稱是: Interrupt Clear-Pending Registers,是一個中斷解掛控制寄存器組
IABR[8]:全稱是: Interrupt Active Bit Registers,是一個中斷激活標志位寄存器組
IP[240]:全稱是: Interrupt Priority Registers,是一個中斷優先級控制的寄存器組
對於每個寄存器后面中括號 數字標識的意義是 該中斷組是由幾個32位的寄存器所組成 stm32是由一個很強大的系統中斷所組成的,每個IO都對應一個中斷
而每個寄存器的每一位同樣控制着不同的中斷 對於更細致的對應關系讀者可根據查看相應的參考手冊。
對於初學者,主要所掌握的寄存器,IP[240]中斷優先級控制的寄存器組,前邊所講的基本也是廢話,接下來就是今天所要掌握的。
(IP[240]STM32 的中斷分組與這個寄存器組密切相關。 IP 寄存器組由 240 個 8bit 的寄
存器組成,每個可屏蔽中斷占用 8bit,這樣總共可以表示 240 個可屏蔽中斷。 而 STM32 只用到
了其中的前 60 個。 IP[59]~IP[0]分別對應中斷 59~0。 而每個可屏蔽中斷占用的 8bit 並沒有全部
使用,而是 只用了高 4 位。這 4 位,又分為搶占優先級和子優先級。搶占優先級在前,子優先
級在后。而這兩個優先級各占幾個位又要根據 SCB->AIRCR 中的中斷分組設置來決定.)
每個中斷都是由該寄存器組中寄存器的高四位來控制中斷處理優先級,而這四位對於兩種中斷響應的控制關系並不是固定的。
以搶占優先級所占位數為理解可分0、1、2、3、4 共五種情況
要知道的是搶占優先是大於響應優先的,了解了中斷響應分組原理對相應函數的使用就會更輕松。接下來看一下相應函數的使用。
首先要講解的是中斷優先級分組函數 NVIC_PriorityGroupConfig,其函數申明如下:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
看一下函數定義
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
這個函數唯一目的就是通過設置 SCB->AIRCR 寄存器來設置中斷優先級分組,而且這個函數在系統中只能被調用一次,一旦分組確定就最好不要更改。
同樣系統也已經宏定義好了各分組名稱,只需要調用就可以。
比如我們設置整個系統的中斷優先級分組值為 2,那么方法是:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
中斷優先級分組是與多個中斷密不可分的,在后續中斷中其作用會很明顯。
設置好了系統中斷分組,那么對於每個中斷我們又怎么確定他的搶占優先級和響應優先級
呢?下面我們講解一個重要的函數為中斷初始化函數 NVIC_Init();
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
其中 NVIC_InitTypeDef 是一個結構體,我們可以看看結構體的成員變量:
typedef struct
{
uint8_t NVIC_IRQChannel; // 定義初始化的是哪個中斷
uint8_t NVIC_IRQChannelPreemptionPriority; //定義這個中斷的搶占優先級別
uint8_t NVIC_IRQChannelSubPriority; //定義這個中斷的子優先級別
FunctionalState NVIC_IRQChannelCmd; //該中斷是否使能
}NVIC_InitTypeDef;
比如我們要使能串口 1 的中斷,同時設置搶占優先級為 1,子優先級位 2,初始化的方法是:
NVIC_InitTypeDef | NVIC_InitStructure; |
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口 1 中斷 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 搶占優先級為 1 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子優先級位 2 |
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; | //IRQ 通道使能 |
NVIC_Init(&NVIC_InitStructure); | //根據上面指定的參數初始化 NVIC 寄存器 |
這里優先級分組為分組2
則搶占優先級可設置為0-3 子優先級為0-3 搶占>響應 同優先級 數值小優先中斷。
數值
中斷響應
有幾個