stm32的中断嵌套优先级

stm32的中断嵌套优先级

stm32NVIC优先级分组

这里写图片描述

中断优先级配置寄存器NVIC_IPRx描述抢占优先级与响应优先级 ,在Cortex_m3中,该寄存器被定义为8bit,考虑stm32允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此把指定中断优先级的寄存器位阉割为4位(AIRCR高四位)。
这里写图片描述
具体分组:

  • NVIC_PriorityGroup_0: 0 bits for pre-emption priority 4 bits for subpriority
  • NVIC_PriorityGroup_1: 1 bits for pre-emption priority 3 bits for subpriority
  • NVIC_PriorityGroup_2: 2 bits for pre-emption priority 2 bits for subpriority
  • NVIC_PriorityGroup_3: 3 bits for pre-emption priority 1 bits for subpriority
  • NVIC_PriorityGroup_4: 4 bits for pre-emption priority 0 bits for subpriority

组别’,‘抢占优先级’,‘响应优先级’?

组别优先顺序:

NVIC_PriorityGroup_0->NVIC_PriorityGroup_1->NVIC_PriorityGroup_2->NVIC_PriorityGroup_3->NVIC_PriorityGroup_4

三个概念之间的‘先后’关系

‘组优先’>’抢占优先’>’响应优先’

抢占优先与响应优先的联系
1. 在同一个组别优先级下,不同的抢占优先级间,高优先级的可以打断低优先级。
2. 抢占优先级相同,不能抢占对方(同抢占优先级不存在嵌套),在两者同时响应的时候,高响应优先级的先响应。
3. 抢占优先级与响应优先级均相同的情况下,同时发生时,根据具体的硬件编号先后执行。

典型应用配置

static void NVIC_Configuration1(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;       
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

static void NVIC_Configuration2(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;       
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); 
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

在第0组中,4个位均配置响应优先级,统一组别且相同的抢占优先级的情况下,USART2的响应优先级高于USART3,故两者的同时发生时先响应USART2。这样设置还有一个好处就是两者在正常运行时不会存在相互干扰。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,中断嵌套是指在处理一个中断时,能够中断当前中断处理程序处理更高优先级的中断。这是通过NVIC(Nested Vectored Interrupt Controller)来实现的。 要实现中断嵌套,首先需要配置每个中断的优先级优先级较高的中断会在优先级较低的中断之前被处理。可以使用NVIC的相关函数来设置中断的优先级,例如`NVIC_SetPriority()`函数。 当一个中断请求发生时,中断控制器会根据中断的优先级来决定是否中断当前正在执行的中断处理程序。如果新中断的优先级高于当前中断的优先级,那么当前中断会被挂起,处理新中断,然后再返回到原来的中断处理程序。 在处理完高优先级中断后,中断控制器会自动恢复之前被挂起的低优先级中断,并继续执行原来的中断处理程序。 下面是一个示例代码,演示了如何在STM32中实现中断嵌套: ```c // 配置中断优先级 NVIC_SetPriority(USART1_IRQn, 1); // 设置USART1中断的优先级为1 NVIC_SetPriority(USART2_IRQn, 2); // 设置USART2中断的优先级为2 // 中断处理函数 void USART1_IRQHandler(void) { // 处理USART1中断 // 检查是否有更高优先级的中断发生 if (NVIC_GetPendingIRQ(USART2_IRQn)) { // 挂起当前中断,处理USART2中断 NVIC_SetPendingIRQ(USART2_IRQn); } // 继续执行原来的中断处理程序 } void USART2_IRQHandler(void) { // 处理USART2中断 // 继续执行原来的中断处理程序 } ``` 在上面的示例中,当USART1中断发生时,首先会处理USART1中断,然后检查是否有更高优先级的中断USART2发生。如果有,就挂起当前的USART1中断,处理USART2中断,然后再返回到原来的USART1中断处理程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值