参考:
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