MY_NVIC_Init和 MY_NVIC_PriorityGroupConfig函数的理解

  • MY_NVIC_PriorityGroupConfig 函数的理解

实现分组

//设置 NVIC 分组
//NVIC_Group:NVIC 分组 0~4 总共 5 组 
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; //设置分组
}

这里我们设置分组为3   即0011    取反 1100  再和0x07(0111)与运算   得到temp1的二进制为100  

这张图的上面的部分是不完全寄存器手册中的图,下面的是权威指南中的图!

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

这段代码主要实现的是 上部分的图到下部分图的转换!

  • 函数 MY_NVIC_Init的理解

分组后 抢占优先级和响应优先级的具体写入

MY_NVIC_Init函数和 MY_NVIC_PriorityGroupConfig函数配套使用 !

  • MY_NVIC_PriorityGroupConfig函数     实现分组
  • MY_NVIC_Init 函数                              分组后 对所占抢占优先级和响应优先级的具体写入!

例: 设置分组3        3位抢占优先级,1位响应优先级

这里有个大前提,具体看下面IP寄存器中的说明  IP寄存器中只使用了高4位

u32 temp;
MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
temp=NVIC_PreemptionPriority<<(4-NVIC_Group); 
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
temp&=0xf; //取低四位

分析上面程序,分组为3的时候,

抢占优先级(NVIC_PreemptionPriority)左移一位, 

子优先级(NVIC_SubPriority)只保留最后一位。

然后只保留temp的低4位,然后将这低4位整体左移4位,即移到有效的高4位!

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

上面的两行程序就确定了中断的使能,中断的优先级的设置

附:

ISER 这段中说到CM3支持256个中断,意味着同时也是可以使能16个内核中断,

但在stm32中,ISER[0]的bit0~31分别对应中断的0~31   (是从中断0开始!)

在stm32f10x.h中找到对应的中断0~31,没有包括负数中断!

 

 

 

IP[240]  从下面的话中看出,一个中断X对应着一个IP[X]   来设置相应的中断的优先级!

疑问点:

这里有个疑问,从上图中看出内核中断,中只有Reset MNI 和HardFault优先级是固定的,剩下的内核中断应该是可以编程的啊!

那么在stm32中,IP[240]具体的指的是那240个可屏蔽中断呢?

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值