參考:
Cortex M3權威指南(中文).pdf
STM32F4xx中文參考手冊.pdf
STM32F4開發指南-寄存器版本_V1.1.pdf
https://blog.csdn.net/rng_uzi_/article/details/90762767
記住:搶佔和響應的值越小級別越高。
首先stm32的中斷有240個,中斷優先級分兩級搶佔和響應。兩種級別,規則如下,需要記住
高搶佔可以打斷低搶佔
高響應不能打斷低響應(同一搶佔級,處理內部的優先級)
中斷7:搶佔:2響應:0
中斷3:搶佔:2響應:1
同搶佔級別,同時發生中斷,響應級別的高先執行,(不是打斷)
中斷6:搶佔:3:響應0
上面例子中的中斷 3 和中斷 7 都可以打斷中斷 6 的中斷。而中斷 7 和中斷 3 卻不可以相互
打斷!
設置搶佔和響應級別
SCB->AIRCR 寄存器和IP寄存器
首先兩者聯繫,SCB->AIRCR 寄存器的10:8位bit,決定了,IP寄存器4:7bit的高四位的搶佔與響應位的分配
讀一讀關於IP寄存器的描述,子優先級就是響應優先級
那麼SCB->AIRCR 寄存器的10:8位bit怎麼決定這個分配呢?
AIRCR 寄存器的10:8位,設置幾位搶佔,幾位響應。舉例如下
AIRCR寄存器8:10 | IP寄存器4:7 | ||
0 | 111 | 搶佔:0bit,響應:4bit | |
1 | 110 | 搶佔:1bit,響應:3bit | |
2 | 101 | 搶佔:2bit,響應:2bit | |
3 | 100 | 搶佔:3bit,響應:1bit | |
4 | 011 | 搶佔:4bit,響應:0bit |
怎麼理解這個表呢?
AIRCR寄存器8:10是111,表示7,即ip寄存器的第四位到第七位爲止是響應級(從0開始),本來就ip寄存器的4:7bit,那4,5,6,7bit,都表示響應級。
AIRCR寄存器8:10是100,表示4,ip寄存器的第四位到第四位表示響應級。即一位表示響應級
實例代碼 0x05FA0000 看上面圖片表D13
SCB->AIRCR = 0x05FA0000 | 0x400; // 04h=0100b 中斷優先級分組 搶佔:響應=3:1
那麼最多就是0:15級搶佔,就是15箇中斷可相互打斷,即011,沒有響應級 ,4組
如果全是響應,那麼哪個高,那個先發生,先執行哪個。即111,第七位以內都是響應級,4:7bit都表示,0組
舉例:這是正點原子外部中斷實驗的優先級設置代碼,兩位的優先級,4,5,即101,第五位以內都是響應級
MY_NVIC_Init(3,2,EXTI2_IRQn,2); //搶佔3,子優先級2,組2
MY_NVIC_Init(2,2,EXTI3_IRQn,2); //搶佔2,子優先級2,組2
MY_NVIC_Init(1,2,EXTI4_IRQn,2); //搶佔1,子優先級2,組2
MY_NVIC_Init(0,2,EXTI0_IRQn,2); //搶佔0,子優先級2,組2
這裏設置爲組2,即:AIRCR寄存器的8:10bit,101。則IP寄存器4:7bit,第6,7bit爲設置搶佔優先級,4,5bit設置響應優先級
那麼就是,4級搶斷,4種響應。所以所有中斷的級別都沒有超過2^2=4。只有0,1,2,3級。
應用:
SCB->AIRCR = 0x05FA0000 | 0x400; //中斷優先級分組 搶佔:響應=3:1
8,9,10bit,爲100,ip寄存器高四位的4位是響應,5,6,7位是搶佔
ip寄存器,8bit寄存器,只用了高四位,111搶佔,1響應。
2^3=8級搶斷,2級響應
NVIC->IP[39] = 0xf0; //最低搶佔優先級,最低響應優先級1111
39號中斷,最高級中斷,沒有中斷的能打斷。
參考手冊表49,查相應中斷的位置。
NVIC->ISER[1] |= (1<<(39-32)); //使能中斷線39,也就是usart3中斷
256箇中斷,每個ISER,32位寄存器,控制32箇中斷。需要8個ISER,即ISER[8]寄存器組。
39號中斷,在ISER[1],32,33,34,335,36,37,38,39。第七位置一
39-32=7