HEnthusiast 发表于 2019-7-17 11:03:41

关于NVIC的问题

最近开始学习STM32,在学习到NVIC这部分的时候,发现有 NVIC_PriorityGroupConfig() 这个优先级分组的函数。
我现在是这么理解的,如果设置为NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);那么NVIC_IRQChannelPreemptionPriority只有一位,即最大设置值为1;
NVIC_IRQChannelSubPriority 有三位,即最大设置值为7?

但是看官方的例程是如图这样设置的。



是不是这个分组的函数可以不用? 为什么两个优先级的值都达到了0x0f呢?

初学者希望有人能帮忙解答一下,谢谢!!


HEnthusiast 发表于 2019-7-17 16:05:28

有人不 有人不?

HEnthusiast 发表于 2019-7-18 10:27:08

求解答啊

haocheng996 发表于 2019-8-31 13:54:59

这个问题推荐你直接看参考手册的中断的寄存器说明,或看看NVIC_Init(&NVIC_InitStructure);这个函数如何把值写进寄存器的,你就明白了

哀歌与世无争 发表于 2019-9-1 06:48:22

*   @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
*                              4 bits for subpriority
*   @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
*                              3 bits for subpriority
*   @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
*                              2 bits for subpriority
*   @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
*                              1 bits for subpriority
*   @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
*                              0 bits for subpriority
中断位数n,最大能设置的值为2^(n)-1,数值越大优先级越低
NVIC_PriorityGroup_1:1位抢占中断,3位子中断,能设置的最大值分别为1和7,这个你说得没错
但是抢占优先级和子优先级都设置成了0x0F不对了,要么NVIC_PriorityGroup_1: 抢占0x0f,子0x00。
要么NVIC_PriorityGroup_4:抢占0x00,子0x0f,

scfor123456 发表于 2019-9-3 15:48:29

哀歌与世无争 发表于 2019-9-1 06:48
*   @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
*                               ...

/* Configure IT */
/* (8) Set priority for DMA1_Channel2_3_IRQn */
/* (9) Enable DMA1_Channel2_3_IRQn */
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 0); /* (8) */
NVIC_EnableIRQ(DMA1_Channel2_3_IRQn); /* (9) */       

像我这个DMA中断设置,抢占和响应优先级都是0,如果要设置其他的优先级,怎么改?

哀歌与世无争 发表于 2019-9-3 16:24:42

scfor123456 发表于 2019-9-3 15:48
/* Configure IT */
/* (8) Set priority for DMA1_Channel2_3_IRQn */
/* (9) Enable DMA1_Channe ...
第二个参数就是优先级
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 1);//设置优先级1
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 3);//设置优先级3

scfor123456 发表于 2019-9-3 16:43:35

哀歌与世无争 发表于 2019-9-3 16:24
第二个参数就是优先级
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 1);//设置优先级1
NVIC_SetPriority(DMA1 ...

不是还分抢先优先级和响应优先级吗

哀歌与世无争 发表于 2019-9-3 16:59:53

scfor123456 发表于 2019-9-3 16:43
不是还分抢先优先级和响应优先级吗

DMA1_Channel2_3_IRQn我记得是STM32F0里的中断,STM32F0是M0内核,只有4级抢占中断,没有子优先级中断。
如果我搞错了不是F0,那可以用NVIC_Init();中断初始化函数来设置优先级
例如
   NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel= DMA1_Channel7_IRQn;//中断向量
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;//主优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority= 1;//子优先级1
    NVIC_InitStructure.NVIC_IRQChannelCmd= ENABLE;//使能
    NVIC_Init(&NVIC_InitStructure);//初始化
页: [1]
查看完整版本: 关于NVIC的问题