STM32F103XXX 中断优先级设置或配置
STM32 中断系统系统是非常复杂的。如果是搞不清楚计算机底层硬件或计算机工作原理的人,是很难搞懂中断系统。作为普通程序员只要会使用也未尝不可呀!我认为会使用就很好了,因为越是底层东西厂商也不需要用户去深入去理解,会用行就行。
STM32F103XXX系列的中断有如下几个问题你搞明白了,就很容易使用它了。
中断分组NVIC_PriorityGroup:既然要分组,你就会问STM32F103XXX系列能分几组?能分五组。它的组号是从零开始的。不同的组号还有老大、老二、老三、老四、老五区分。组0号是老大,组4号是老五。中间就是老二 老三 老四。注意没有组 5号的存在。在STM32库函数里它们都有自己的英文名字。
老大的英文名称:NVIC_PriorityGroup_0
老二的英文名称:NVIC_PriorityGroup_1
老三的英文名称:NVIC_PriorityGroup_2
老四的英文名称:NVIC_PriorityGroup_3
老五的英文名称:NVIC_PriorityGroup_4
*STM32F103XXX中有两个优先级的概念:抢占优先级和响应优先级,也有把响应优先级称作“亚优先级”或“副优先级,每个中断源都需要被指定这两种优先级,在STM32库函数里它们都有自己的名字*
抢占优先级英文名称:Preemptionpriority。
响应优先级英文名称:SubPriority。
一旦分组确定,这个组可以提供的抢占优先级的个数和响应优先级大的个数
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
NVIC_PriorityGroup_0大于NVIC_PriorityGroup_1大于NVIC_PriorityGroup_2大于NVIC_PriorityGroup_3大于NVIC_PriorityGroup_4大于NVIC_PriorityGroup_4
在不同的组里分配(NVIC_PriorityGroup)可以分配到抢占优先级和响应优先级英是不同的。请看下表
组 bit[7-4](共4位 分配结果
0 0:4 0位抢占优先级,4位响应优先级
1 1:3 1位抢占优先级,3位响应优先级
2 2:2 2位抢占优先级,2位响应优先级
3 3:1 3位抢占优先级,1位响应优先级
4 4:0 4位抢占优先级,0位响应优先级
/* 配置GPIO中断 */
void STM32EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_ClearITPendingBit(EXTI_Line5);// 清除EXTI线路挂起位
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);// 选择GPIO管脚用作外部中断线路
EXTI_InitStructure.EXTI_Line = EXTI_Line5;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);// 初始化外设EXTI寄存器
}
/* STM32配置抢占优先级和响应优先级 */
void STM32NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断分组
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //设置通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}