NVIC 中斷優先順序管理詳解
阿新 • • 發佈:2019-02-02
1.NVIC(內嵌向量中斷控制器)
- STM32系列總共有84箇中斷,其中我用的STM32F103系列的板子也有60箇中斷,可想而知STM32一定有一箇中斷的管理機制來管理這麼多中斷,使能中斷並且配置相關中斷的優先順序,這就是NVIC的工作
- 優先順序高的中斷可以打斷優先順序低的中斷,這樣一箇中斷執行的時候被另外中斷給打斷,這個中斷執行完再執行上一個中斷,形成中斷之間的巢狀,或許這就是NVIC 名字為內嵌向量中斷控制器來源
- NVIC中對於每個中斷需要設定 搶佔優先順序 和 響應優先順序(又稱子優先順序),很明顯多箇中斷會先比較 搶佔優先順序,搶佔優先順序相同的比較響應優先順序,這裡值得注意的是 高搶佔優先順序能夠打斷
- NVIC利用四個位來儲存搶佔優先順序和響應優先順序
我們可以自由設定用幾個位來儲存搶佔優先順序和響應優先順序,例如我們全部用這4個位 全部儲存響應優先順序,那麼響應優先順序可以設定為0~15中的任何一個值,這就是優先順序分組0,這就是,搶佔優先全部一樣,我們也可以設定1個位來儲存搶佔優先順序3個位儲存響應優先順序,這樣搶佔優先順序就可以設定為0和1,響應優先順序就可以設定為0至7,這就是優先順序分組1,順便一提,值越小代表優先順序越高
中斷優先順序分組 | 分配結果 | 搶佔優先順序取值 | 響應優先順序取值 |
---|---|---|---|
0 | 0位搶佔優先順序,4位響應優先順序 | 0~0 | 0~15 |
1 | 1位搶佔優先順序,3位響應優先順序 | 0~1 | 0~7 |
2 | 2位搶佔優先順序,2位響應優先順序 | 0~3 | 0~3 |
3 | 3位搶佔優先順序,1位響應優先順序 | 0~7 | 0~1 |
4 | 4位搶佔優先順序,0位響應優先順序 | 0~15 | 0~0 |
提示:我們最好一個程式就用就只指定一箇中斷分組,否則容易混餚!
2.NVIC配置詳情
這裡利用定時器3舉例
//定時器3中斷初始化,指定搶佔優先順序與響應優先順序
void MY_TIM3_Interrupt_Init(u8 preemptionPriority,u8 subPriority){
// 1.這裡是配置允許定時器中斷
NVIC_InitTypeDef NVIC_Initstructure;
//第一個引數指定具體是那種中斷,定時器3(TIM3就是) TIM3_TRQn,例如串列埠1是USART1_IRQn
NVIC_Initstructure.NVIC_IRQChannel = TIM3_IRQn; //設定為定時器3中斷
NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE; //中斷使能
//指定搶佔式優先順序
NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = preemptionPriority;
//指定響應式優先順序(子優先順序)
NVIC_Initstructure.NVIC_IRQChannelSubPriority = subPriority;
NVIC_Init(&NVIC_Initstructure);
}
//我們這裡只是允許TIM3中斷,定時器有更新中斷,輸入捕獲中斷等
//所以我們還需要在配置定時器的時候指定定時器具體中斷請求,這裡其實和NVIC配置沒關係了(題外話)
//例如:
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允許更新中斷
//另外最好在主函式配置中斷優先順序分組,設定完一次就不要再配置了!
NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2);//後面的值不僅可以為2,還可以為0,1,3,4
//***************************************************
//***************************************************
/*中斷處理函式*/
//每一種中斷處理函式名字都是固定的!我們必須寫對中斷處理函式名才能讓中斷得到處理
void TIM3_IRQHandler(void){
//1.判斷是什麼中斷
// 1.1 如果是定時器更新中斷
if(TIM_GetITStatus(TIM3,TIM_IT_Update)){
//處理中斷事件....
// 1.2 最後將中斷標誌位都清理掉
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}
}
3.NVIC常用的中斷請求名和中斷函式處理名
這裡就不一一列舉所有的中斷請求名和中斷函式處理名,例如我的微控制器是STM32F10系列,我就可以在stm32f10x.h中檢視到所有的中斷請求名,根據中斷請求名就基本能寫出中斷處理函式,實在不行再到別的地方查查吧。。咳咳。。