您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

无基础也可以了解,NVIC中断优先级分组

STM32f103系列具有60个可屏蔽的中断,数量较多,所以需要对中断进行管理。

STM32可以将中断分为5组,如下表。

组号分配结果
00位抢占优先级,4位相应优先级
11位抢占优先级,3位相应优先级
22位抢占优先级,2位相应优先级
33位抢占优先级,1位相应优先级
44位抢占优先级,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串口的设置大同小异,根据这个设置其他的就好。

有什么错误或者问题随时提出,互相进步。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进