STM32F1系列並沒有使用CM3內核的全部東西,而是隻用了它的一部分。
STM32F1系列有84箇中斷,包括16個內核中斷和68個可屏蔽中斷,具有16級可編程的中斷優先級。
STM32F103系列上面,又只有60個可屏蔽中斷(在107系列纔有68個)
中斷管理方法:首先,對STM32中斷進行分組,組0~4。同時,對每個中斷設置一個搶佔優先級和一個響應優先級值。
分組配置是在寄存器SCB->AIRCR中配置:
組 *********AIRCR[10:8]********IP bit[7:4]分配情況**************分配結果
1 ***************110********************1:3***************1位搶佔優先級,3位響應優先級
2 ***************101********************2:2***************2位搶佔優先級,2位響應優先級
3 ***************100********************3:1***************3位搶佔優先級,1位響應優先級
4 ***************011********************4:0***************4位搶佔優先級,0位響應優先級
1>高優先級的搶佔優先級是可以打斷正在進行的低搶佔優先級中斷的。
2>搶佔優先級相同的中斷,高響應優先級不可以打斷低響應優先級的中斷。
3>搶佔優先級相同的中斷,當兩個中斷同時發生的情況下,哪個響應優先級高,哪個先執行。
4>如果兩個中斷的搶佔優先級和響應優先級都是一樣的話,則看哪個中斷先發生就先執行;
1>系統運行後先設置中斷優先級分組。調用函數:
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);// 整個系統執行過程中,只設置一次中斷分組。
2>針對每個中斷,設置對應的搶佔優先級和響應優先級:
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
3>如果需要掛起/解掛,查看中斷當前激活狀態,分別調用相關函數即可。
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寄存器