stm32 SCB->AIRCR 寄存器和中断优先级寄存器使用理解

参考:

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
  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

发布了82 篇原创文章 · 获赞 72 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/fzf1996/article/details/97815100