无基础也可以了解,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串口的设置大同小异,根据这个设置其他的就好。

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

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西邮小菜机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值