进来讨论一下,NVIC寄存器组中的中断挂起SETPEND与消除CLRPEND,与外部中断挂起寄存器EXTI_PR有何关系?

2019-07-21 04:17发布

本帖最后由 warship 于 2018-7-27 19:32 编辑

如题,讨论一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
warship
1楼-- · 2019-07-24 13:36
 精彩回答 2  元偷偷看……
hougeqvjing
2楼-- · 2019-07-24 19:23
warship 发表于 2018-8-2 16:08
粗看了一下,你的意思是不需要左移8吗?

优先级分组的三位是从第8bit开始的,当然要左移8才能设

我的意思是,比如我选择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));
不知理解得对不对。
warship
3楼-- · 2019-07-25 00:39
hougeqvjing 发表于 2018-8-2 16:31
我的意思是,比如我选择group0,那么因为#define group0  0x700。所以我觉得uint32_t PriorityGroupTmp = ...

按照你的理解有点道理,
但是没有#define group0  0x700这个定义,
并且你调用函数给参数的时候也不是给的是0x700或者group0
而是直接使用MY_NVIC_PriorityGroupConfig(2);   //给的是组号数值,
所以用& 0x07只取三个有效位,然后再左移8位。

假如你的程序中,有#define group0  0x700
而调用的语句是MY_NVIC_PriorityGroupConfig(group0);
函数体就应该像您说的那么写了。
warship
4楼-- · 2019-07-25 01:03
本帖最后由 warship 于 2018-8-2 18:35 编辑
hougeqvjing 发表于 2018-8-2 16:31
我的意思是,比如我选择group0,那么因为#define group0  0x700。所以我觉得uint32_t PriorityGroupTmp = ...

我所使用的函数体是这样的(供参考):
//设置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;  //设置分组                                                         
}
hougeqvjing
5楼-- · 2019-07-25 02:22
warship 发表于 2018-8-2 18:34
我所使用的函数体是这样的(供参考):
//设置NVIC优先级组,一般程序只设一次组,优先组确定后,要根据 ...

嗯呢,我的程序中有宏定义,不是传递的0,1,2,3,4.这样理解 就通了。
warship
6楼-- · 2019-07-25 05:12
 精彩回答 2  元偷偷看……

一周热门 更多>