stm32NVIC中断优先管理

    这里简单介绍一下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<<(4-NVIC_Group); 
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf;//取低四位


if(NVIC_Channel<32)NVIC->ISER[0]|=1<<NVIC_Channel;//使能中断位(要清除的话,相反操作就OK)
else NVIC->ISER[1]|=1<<(NVIC_Channel-32);    
NVIC->IPR[IPRADDR]|=temp<<IPROFFSET;//设置响应优先级和抢断优先级         
}

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.抢占优先级相同时,响应优先的执行顺序看谁先触发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值