NVIC:嵌套向量中斷控制器
在了解中斷之前,我們先了解搶占優先級和響應優先級
搶占優先級和響應優先級
- 搶占優先級決定能不能打斷,高優先級的搶占可以中斷低優先級的搶占
- 響應優先級在搶占優先級相同時,高響應優先級先執行,響應優先級不能打斷
注:數字越小,搶占和響應的優先級越大
比如說設置中斷優先級組為2,然后設置中斷3的搶占優先級為2,響應優先級為1,中斷6的搶占優先級為3,響應優先級為0,中斷7的搶占優先級為2,響應優先級為0,這三個中斷的優先級順序是:中斷7>中斷3>中斷6
中斷優先級分組
中斷優先級分組可以分成0~4組,每個組可以分成16種情況,因為一共有4位來設置搶占和響應優先級
中斷優先級分組在代碼執行過程中,盡量只設置一次,不然會導致中斷管理混亂,因為對于不同的分組,搶占和響應的優先級個數都是不同的。
中斷優先級設置步驟
- 設置中斷優先級分組
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)
- 針對每個中斷,設置對應的搶占優先級和響應優先級
使用的函數是:
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;
設置一個中斷
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寄存器
設置兩個中斷:
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按鍵WK_UP所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子優先級3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按鍵KEY2所在的外部中斷通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //搶占優先級2, NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子優先級2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中斷通道NVIC_Init(&NVIC_InitStructure);
總結
當我們需要中斷的時候,我們首先要設置中斷優先級分組,然后對每個中斷進行設置。