×
单片机 > 单片机程序设计 > 详情

stm32NVIC中断优先管理

发布时间:2020-08-28 发布时间:
|

这里简单介绍一下STM32的中断分组:STM32 将中断分为5个组,组为0~4,最多设置16个中断优先级。该分组的设置是由SCB->AIRCR寄存器的bit10~8,来定义的,具体分配关系表如下:


第0组 :所有4位用于指定响应优先级


第1组:最高1位用于指定抢占优先级,最低3位用于指定响应优先级


第2组:最高2位用于指定抢占优先级,最低两位用于指定响应优先级


第3组:最高3位用于指定抢占优先级,最低1位用于指定响应优先级


第4组:所有4位用于指定抢占优先级


通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置3,那么此时所有的60个中断,每个中断的中断优先级寄存器的高4位中的最高3位


是抢占优先级,低1位是响应优先级,每个中断,你可以设置抢占优先级为0~7,响应优先级为1或0,抢占优先级别高于响应优先级,数值越小代表优先级越高,


而强占优先级相同时不可以打断低响应优先级的中断,




void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)  //设置分组

u32 temp,temp1; 

temp1=(~NVIC_Group)&0x07;//取后三位

temp1<<=8;

temp=SCB->AIRCR;  //读取先前的设置

temp&=0X0000F8FF; //清空先前分组

temp|=0X05FA0000; //写入钥匙

temp|=temp1;   

SCB->AIRCR=temp;  //设置分组        

}


/设置NVIC 

//NVIC_PreemptionPriority:抢占优先级

//NVIC_SubPriority       :响应优先级

//NVIC_Channel           :中断编号

//NVIC_Group             :中断分组 0~4

//注意优先级不能超过设定的组的范围!否则会有意想不到的错误

//组划分:

//组0:0位抢占优先级,4位响应优先级

//组1:1位抢占优先级,3位响应优先级

//组2:2位抢占优先级,2位响应优先级

//组3:3位抢占优先级,1位响应优先级

//组4:4位抢占优先级,0位响应优先级

//NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先  

void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) 

u32 temp; 

u8 IPRADDR=NVIC_Channel/4;  //每组只能存4个,得到组地址 

u8 IPROFFSET=NVIC_Channel%4;//在组内的偏移

IPROFFSET=IPROFFSET*8+4;    //得到偏移的确切位置

MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组

temp=NVIC_PreemptionPriority<

temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);

temp&=0xf;//取低四位



if(NVIC_Channel

else NVIC->ISER[1]|=1<

NVIC->IPR[IPRADDR]|=temp<

}


MY_NVIC_Init(2,3,EXTI0_IRQChannel,2); //抢占2,子优先级3,组2

MY_NVIC_Init(2,2,EXTI2_IRQChannel,2);//抢占2,子优先级2,组2   

MY_NVIC_Init(2,1,EXTI3_IRQChannel,2);//抢占2,子优先级1,组2   

MY_NVIC_Init(2,0,EXTI4_IRQChannel,2);//抢占2,子优先级0,组2    


总之, 可以归纳为几点:


1.每次程序运行时,只能设置一组中断,但可以设置多个中断


2.抢占优先可以实现中断嵌套,响应优先级不能实现中断嵌套,高抢占优先级可以打断低抢占优先级,响应优先级之间不能打断,


3.抢占优先级相同时,响应优先的执行顺序看谁先触发。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯