转载自:http://blog.chinaunix.net/space.php?uid=20745340&do=blog&cuid=2354876
对STM32 NIVC的了解 (2010-10-14 17:37)
用STM32做项目已经有段时间了,但是我忽然发现我对NVIC其实一点都不了解,所以今天补习了一下NVIC的知识以及我自己对NVIC中断优先级设置的了解,希望对大家有所帮助:
对于NVIC中断优先级的设置一直都不是很清楚;
具体函数如下:
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 优先级组设置
/* Timer2中断*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; // 通道设置
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 抢占优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 响应优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
上面就是简单的一个中断使能及优先级设置过程。
其中NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 是优先级组设置
对于STM32只支持4位即5种模式的优先级组设置,而在CM3的权威指南里说了他支持8位即256个分级
这说明STM32删减了CM3的优先级别;
STM32中描述的分别为:
NVIC_PriorityGroup_0 (0 位的抢占优先级,4 位响应优先级)
NVIC_PriorityGroup_1 (1 位的抢占优先级,3 位响应优先级)
NVIC_PriorityGroup_2 (2 位的抢占优先级,2 位响应优先级)
NVIC_PriorityGroup_3 (3 位的抢占优先级,1 位响应优先级)
NVIC_PriorityGroup_4 (4 位的抢占优先级,0 位响应优先级)
(上面关于 PriorityGroup 的说法与 CM3 权威指南上的 Group 不同,STM 把这个 group 重新做了定义。)
这里需要介绍下:
0位抢占优先级说明,没有抢占优先级只有响应优先级,并且也支持此2的4次方16个优先级别
在这16个优先级别里没有抢占试优先级都是,响应优先级,也就是说优先级没有嵌套能力,中断来了只能按照
响应优先级的顺序排列执行;
0位响应优先级说明16个优先级都是抢占优先级,无论当前是哪个中断只要来了比他优先级高的中断进来都可以实现中断嵌套,嵌套层数为16;
举例说明:
对于系统中的两个中断设置如下:
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Timer2中断*/
/*
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
/* UART5中断*/
NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
因为想要TIM2的优先级高于UART5的优先级不能设置NVIC_PriorityGroup_0
只能设置1,2,3,4组,该例子中设置组1则 他有两个抢占优先级别,所以在两个中断中一个抢占优先级写0,一个写1,写0的优先级高于写1的 ,然后对于响应优先级有2的3次方8个响应优先级,这样既可达到要求