1. 程式人生 > 其它 >STM32學習筆記-NVIC中斷知識點

STM32學習筆記-NVIC中斷知識點

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) **