STM32-NVIC

NVIC

  • 一、NVIC是什么
  • 二、NVIC优先级分组
  • 三、优先级计算
  • 二、NVIC结构体参数


提示:以下是本篇文章正文内容,下面案例可供参考

一、NVIC是什么

NVIC(Nested Vectored Interrupt Controller)是嵌套向量中断控制器,用于管理STM32微控制器中的中断。它控制着整个STM32芯片中断相关的功能,与Cortex-M3内核紧密联系,是内核里面的一个外设。
‘ ‘ 可 看 作 中 断 排 序 器 ‘ ‘ ``可看作中断排序器` `

NVIC的主要功能包括:

  • 管理中断的使能和禁用
  • 设置中断优先级
  • 处理中断请求和中断响应

二、NVIC优先级分组

抢占优先级(Preemption Priority)
作用:决定中断的抢占能力。
效果:高优先级的中断可以打断低优先级的中断。
数值越小,优先级越高:抢占优先级为0的中断比抢占优先级为1的中断优先级高。
示例:如果一个高优先级中断发生时,CPU正在处理一个低优先级中断,高优先级中断会打断低优先级中断,先处理高优先级中断。

响应优先级(Sub Priority)
作用:在抢占优先级相同的情况下,决定中断的处理顺序。
效果:仅在抢占优先级相同的情况下生效,高优先级的中断会先被处理。
数值越小,优先级越高:响应优先级为0的中断比响应优先级为1的中断优先级高。
示例:如果多个中断的抢占优先级相同,响应优先级高的中断会先被处理。如果响应优先级也相同,则按中断号(IRQn)从小到大的顺序处理。
NVIC的优先级分组用于配置中断的抢占优先级和响应优先级。STM32的NVIC使用4位寄存器来设置优先级,这4位可以分为抢占优先级和子优先级。不同的分组方式决定了这4位如何分配:

即:抢占可以打断,响应只是排队

注:级别是从0开始

  1. 优先级分组0
    抢占优先级位数:0位
    响应优先级位数:4位
    优先级级别:16级响应优先级(0-15)
    适用场景:不需要抢占优先级区分,所有中断共享相同的抢占优先级,仅通过响应优先级区分。
  2. 优先级分组1
    抢占优先级位数:1位
    响应优先级位数:3位
    优先级级别:2级抢占优先级(0,1),8级响应优先级(0-7)
    适用场景:需要简单抢占优先级区分,可以区分两个优先级层次。
  3. 优先级分组2
    抢占优先级位数:2位
    响应优先级位数:2位
    优先级级别:4级抢占优先级(0-3),4级响应优先级(0-3)
    适用场景:需要中等程度抢占优先级区分,可以区分四个优先级层次。
  4. 优先级分组3
    抢占优先级位数:3位
    响应优先级位数:1位
    优先级级别:8级抢占优先级,2级响应优先级
    适用场景:需要较细致抢占优先级区分,可以区分八个优先级层次。
  5. 优先级分组4
    抢占优先级位数:4位
    响应优先级位数:0位
    优先级级别:16级抢占优先级
    适用场景:需要非常细致抢占优先级区分,所有中断共享相同的响应优先级。

例如,选择第1组优先级分组:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 选择第1组优先级分组

三、优先级计算

有效优先级计算公式:

  • 优先级分组0:EffectivePriority=SubPriority
  • 优先级分组1:EffectivePriority=(PreemptionPriority×8)+SubPriority
  • 优先级分组2:EffectivePriority=(PreemptionPriority×4)+SubPriority
  • 优先级分组3:EffectivePriority=(PreemptionPriority×2)+SubPriority
  • 优先级分组4:EffectivePriority=PreemptionPriority

优先级顺序:

  • 抢占优先级不同:抢占优先级高的中断先处理。
  • 抢占优先级相同:响应优先级高的中断先处理。
  • 抢占优先级和响应优先级都相同:按照中断号(IRQn)从小到大的顺序处理。

示例:假设你有以下中断配置:

中断A:抢占优先级1,响应优先级1
中断B:抢占优先级0,响应优先级0
中断C:抢占优先级1,响应优先级0
中断D:抢占优先级1,响应优先级1
计算有效优先级:
中断A:(1×8)+1=9
中断B:(0×8)+0=0
中断C:(1×8)+0=8
中断D:(1×8)+1=9
优先级顺序:
中断B:有效优先级0
中断C:有效优先级8
中断A:有效优先级9
中断D:有效优先级9

二、NVIC结构体参数

注:IRQn 是 "Interrupt Request Number" 的缩写,即中断请求号。
NVIC_InitTypeDef是一个结构体,用于配置和初始化中断控制器(NVIC)的相关参数。该结构体包含以下成员:

  • NVIC_IRQChannel:表示中断通道号,用于指定要配置的中断通道。这些通道号定义在stm32f10x.h文件的IRQn_Type枚举中。(过多此处不展开列举了)
  • NVIC_IRQChannelPreemptionPriority:表示抢占优先级,用于指定中断的抢占优先级,数值越低表示优先级越高。
  • NVIC_IRQChannelSubPriority:表示子优先级(响应优先级),用于指定中断的子优先级,数值越低表示优先级越高。
  • NVIC_IRQChannelCmd:表示中断使能或禁止的控制标志位,用于指定中断的使能状态。

例如,配置EXTI0中断:

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; // 选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道
NVIC_Init(&NVIC_InitStructure); // 初始化NVIC

声明:
本文为本人的学习笔记,旨在记录和分享个人在学习过程中的心得体会和原创代码。由于本人刚入门,对相关知识的理解可能还存在不足之处,文章中难免会有错误或不准确的地方。在此,我诚挚地欢迎各位读者在阅读过程中,如果发现任何问题或有其他建议,随时在评论区或通过其他方式与我交流。我将虚心听取大家的意见,及时修正和改进文章内容,以便更好地学习和成长。感谢大家的关注和支持!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值