2019-07-21 04:17发布
warship 发表于 2018-8-2 16:08 粗看了一下,你的意思是不需要左移8吗? 优先级分组的三位是从第8bit开始的,当然要左移8才能设
hougeqvjing 发表于 2018-8-2 16:31 我的意思是,比如我选择group0,那么因为#define group0 0x700。所以我觉得uint32_t PriorityGroupTmp = ...
warship 发表于 2018-8-2 18:34 我所使用的函数体是这样的(供参考): //设置NVIC优先级组,一般程序只设一次组,优先组确定后,要根据 ...
最多设置5个标签!
我的意思是,比如我选择group0,那么因为#define group0 0x700。所以我觉得uint32_t PriorityGroupTmp = (PriorityGroup & 0x07);应该改为:uint32_t PriorityGroupTmp = PriorityGroup; reg_value = (reg_value |
(0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(PriorityGroupTmp << 8));
应该改为: reg_value = (reg_value |
(0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(PriorityGroupTmp));
不知理解得对不对。
按照你的理解有点道理,
但是没有#define group0 0x700这个定义,
并且你调用函数给参数的时候也不是给的是0x700或者group0
而是直接使用MY_NVIC_PriorityGroupConfig(2); //给的是组号数值,
所以用& 0x07只取三个有效位,然后再左移8位。
假如你的程序中,有#define group0 0x700
而调用的语句是MY_NVIC_PriorityGroupConfig(group0);
函数体就应该像您说的那么写了。
我所使用的函数体是这样的(供参考):
//设置NVIC优先级组,一般程序只设一次组,优先组确定后,要根据组的要求,为系统的每一个中断确定其在组中的地位
//输入参数NVIC_Group: NVIC分组 0~4 总共5组
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
u32 temp,temp1;
temp1=(~NVIC_Group)&0x07;//取后三位 运算结果是0-111 1-110 2-101 3-100 4-011
temp1<<=8; //运算结果为0x700/600/500/400/300其中的位10:8就是设置值
temp=SCB->AIRCR; //读取先前的优先级分组设置
temp&=0X0000F8FF; //清空先前分组F8FF=11111000 11111111,正好清除BIT10:8
temp|=0X05FA0000; //写入钥匙,规定的套路
temp|=temp1;
SCB->AIRCR=temp; //设置分组
}
嗯呢,我的程序中有宏定义,不是传递的0,1,2,3,4.这样理解 就通了。
一周热门 更多>