无基础也可以了解,NVIC中断优先级分组
Posted stmplayer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无基础也可以了解,NVIC中断优先级分组相关的知识,希望对你有一定的参考价值。
STM32f103系列具有60个可屏蔽的中断,数量较多,所以需要对中断进行管理。
STM32可以将中断分为5组,如下表。
组号 | 分配结果 |
0 | 0位抢占优先级,4位相应优先级 |
1 | 1位抢占优先级,3位相应优先级 |
2 | 2位抢占优先级,2位相应优先级 |
3 | 3位抢占优先级,1位相应优先级 |
4 | 4位抢占优先级,0位相应优先级 |
从表中我们可以看到组 0~4 对应的配置关系,例如组设置为 3,那么此时 所有的 60 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是 响应优先级。所用的中断都可以设置抢占优先级为 0~7(2的3次方个),响应优先级为 1 或 0(2的1次方个)。抢占优先级的 级别高于响应优先级。而数值越小所代表的优先级就越高。
下面有这几种情况需要强调:
1、抢占优先级与响应优先级相同的情况下,先来的先服务。
2、抢占优先级相同,与响应优先级不同的情况下,还是不能打断先发生的中断。
3、抢占优先级高的可以打断抢占优先级低的中断。
例(参考正点原子的资料):
假定设置中断优先级组为 2,然后设置中断 3(RTC 中断)的抢占优先级 为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外 部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中 断 3>中断 6。 上面例子中的中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互 打断!
那么如何在STM32里使用中断优先级分组?下面将联系代码。
1、首先在main函数里对中断进行分组。利用下面这个函数(分为组2):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
2、在函数里对中断进行初始化(以串口1的代码为例子):
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure);
3、编写中断处理函数:
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET);
{
.......
}
}
如果判断到串口接收到了数据,进入中断对数据进行处理。
中断处理函数不需要在主函数里面调用,直接写在串口的函数下面就可以。如果有触发中断响应的事件时,中断处理函数会直接被调用。
ADC,定时器等其他模块的中断处理设置与USART串口的设置大同小异,根据这个设置其他的就好。
有什么错误或者问题随时提出,互相进步。
以上是关于无基础也可以了解,NVIC中断优先级分组的主要内容,如果未能解决你的问题,请参考以下文章
STM32F407开发板用户手册第21章 STM32F407的NVIC中断分组和配置(重要)