最近开始学习STM32,在学习到NVIC这部分的时候,发现有 NVIC_PriorityGroupConfig() 这个优先级分组的函数。 我现在是这么理解的,如果设置为NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 那么NVIC_IRQChannelPreemptionPriority只有一位,即最大设置值为1; NVIC_IRQChannelSubPriority 有三位,即最大设置值为7? 但是看官方的例程是如图这样设置的。 是不是这个分组的函数可以不用? 为什么两个优先级的值都达到了0x0f呢? 初学者希望有人能帮忙解答一下,谢谢!! |
* 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,
/* 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,如果要设置其他的优先级,怎么改?
第二个参数就是优先级
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 1);//设置优先级1
NVIC_SetPriority(DMA1_Channel2_3_IRQn, 3);//设置优先级3
不是还分抢先优先级和响应优先级吗
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);//初始化