STM32學習筆記-NVIC中斷知識點總結
中斷優先級設置步驟
1. 系統運行后先設置中斷優先級分組
函數:void NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup)
分組配置寄存器SCB->AIRCR
組 | AIRCR[10:8] | IP bit[7:4]分配情況 | 分配結果 |
---|---|---|---|
0 | 111 | 0:4 | 0位搶占優先級,4位 |
1 | 110 | 1:3 | 1位搶占優先級,3位響應優先級 |
2 | 101 | 2:2 | 2位搶占優先級,2位 |
3 | 100 | 3:1 | 3位搶占優先級,1位響應優先級 |
4 | 100 | 4:0 | 4位搶占優先級,0位響應優先級 |
搶占優先級&響應優先級區別:
- 首先判斷搶占優先級,搶占優先級越高越先響應,高搶占優先級可以打斷低響應優先級
- 搶占優先級相同的情況下當同時發生時響應優先級越高的先發生,高響應優先級不能打算低響應優先級
- 都相同的情況下哪個先來哪個先發生
2. 針對每個中斷設置對應的搶占優先級和響應優先級
函數:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
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寄存器
3. 如需掛起/解掛,查看當前激活狀態,分別調用相關函數即可
函數:
- **static _INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn) **
- **static _INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn) **
- **static _INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn) **