1. 程式人生 > >NVIC 中斷優先順序管理詳解

NVIC 中斷優先順序管理詳解

1.NVIC(內嵌向量中斷控制器)

  1. STM32系列總共有84箇中斷,其中我用的STM32F103系列的板子也有60箇中斷,可想而知STM32一定有一箇中斷的管理機制來管理這麼多中斷,使能中斷並且配置相關中斷的優先順序,這就是NVIC的工作
  2. 優先順序高的中斷可以打斷優先順序低的中斷,這樣一箇中斷執行的時候被另外中斷給打斷,這個中斷執行完再執行上一個中斷,形成中斷之間的巢狀,或許這就是NVIC 名字為內嵌向量中斷控制器來源
  3. NVIC中對於每個中斷需要設定 搶佔優先順序響應優先順序(又稱子優先順序),很明顯多箇中斷會先比較 搶佔優先順序,搶佔優先順序相同的比較響應優先順序,這裡值得注意的是 高搶佔優先順序能夠打斷
    低搶佔優先順序的,但是相同搶佔優先順序的高響應優先順序不能打斷低響應優先順序。
  4. 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中檢視到所有的中斷請求名,根據中斷請求名就基本能寫出中斷處理函式,實在不行再到別的地方查查吧。。咳咳。。
這裡寫圖片描述