stm32-NVIC中断优先级管理(以古代官职角度分析)

这篇具有很好参考价值的文章主要介绍了stm32-NVIC中断优先级管理(以古代官职角度分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

讲在前面的话:

博主在学习正点原子这一章节的时候很是懵,感觉摸不到门路,于是在网上找了一些相关的视频讲解,将他们的内容整合了一下,并尽量用易懂的话讲解。(本文基于stm32f103ZET6)

一、预备知识 

  • CM3 内核支持256个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。
  •  STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。
  • STM32 有84个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。
  • 我们常用这68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。

所以在此我们就只针对 STM32F103 系列这 60 个可屏蔽中断进行介绍。

 学过51单片机的我们都知道他只有定时器中断、外部中断、串口中断,一般只有五个基本中断源。

而stm32里面有60个中断,这么多的中断我们如何管理呢?

所以这里就需要NVIC中断优先级分组。

 二、NVIC中断优先级分组

NVIC(Nested vectoredinterrupt controller):嵌套向量中断控制器。

那它是如何管理中断的呢?

首先你想想看,你手底下有60号人,如果是你你打算怎么管理?

那当然是分而治之啊!拉拢一帮人给予高地位(官职),让他们帮你遏制另一些人。

换到stm32里面分配地位的就是IP[240]。

IP[240](Interrupt Priority Registers)是一个中断优先级控制的寄存器组。这个寄存器组相当重要!毕竟是分配地位的,STM32 的中断分组就与这个寄存器组有关。

IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断,而本文 STM32 只用到 了其中的前 60 个。

IP[59]~IP[0]分别对应中断 59~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位,这高4位是给予中断地位的关键。

好,现在这 4 位开始设置官职,它把中断分为不同品级(抢占优先级),同一品级又划分了不同品阶(子优先级)。看官职先看你的品级(抢占优先级在前),品级一样看你的品阶(子优先级在后)。

好了,现在官职倒是定好了,那么如何分配呢?

前面说了高四位是给予官职的关键,所以这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

STM32 将中断分为 5 个组,组 0~4。该分组的设置是由SCB->AIRCR 寄存器的 bit10~8 来定义的。至于这个寄存器到底如何操作,目前我们先不用关心。

stm32-NVIC中断优先级管理(以古代官职角度分析),stm32学习,stm32,嵌入式硬件,单片机

这个响应优先级就是子优先级。

抢占优先级和子优先级有什么区别呢? 

前面我们提到过,我们把抢占优先级称为官职的品级,响应优先级称为品阶。

官职品级和品阶的概念不用我多说了吧。

抢占优先级和响应优先级有0~4, 在官职里面对于抢占优先级,我们称它有零品~四品,在官职里面数字越小地位越高,所以有一品大员的称呼。当然实际上是没有零品的,这是我造的,这里0最小,所以它地位最高,零品大员!

对于响应优先级,我们称它有零品阶~四品阶,也是数字越小地位越高。

高优先级的抢占优先级可以打断正在进行的低抢占优先级中断;

(因为我品级高,地位高,可以打断你,先做我的事)

抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;

(咱俩品级一样,虽然你的品阶比我高,但是咱俩的级别一样,你好歹不能直接打断我做事,这不是不给我面子吗?我做完后你才能做事) 

抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;

 (咱们品级一样,级别相同,现在咱俩同时要做一件事,你的品阶高,地位也就比我高了一点,不是我怂,只是客气还是你先做吧,你做完我再做)

 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行。

 (品级一样,品阶一样,你先接手,那你先做事)

 好,现在分析图中的意思。组 0~4意思就是这高四位中有几位可以设置抢占优先级。比如:

组0:这四位全部只能设置响应优先级;

组1:这四位的高一位可以设置抢占优先级,剩下三位可以设置响应优先级。

组2:这四位高两位可以设置抢占优先级,剩下两位可以设置响应优先级。

组4:这四位全部用来设置抢占优先级。

看个例子:

假定设置中断优先级组为2(高两位设置抢占优先级,后两位设置响应优先级),然后设置
中断3(RTC中断)的抢占优先级为2(高两位设置为1 0),响应优先级为1(低两位设置为0 1);
中断6(外部中断0)的抢占优先级为3(高两位设置为1 1),响应优先级为0(低两位设置为0 0);
中断7(外部中断1)的抢占优先级为2(高两位设置为1 0),响应优先级为0(低两位设置为0  0)。
结合前面所学 ,这3个中断的优先级顺序为:中断7>中断3>中断6。

请注意: 

一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。 

三、相关配置函数

3.1 中断优先级分组函数

 中断优先级分组函数:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

看其命名NVIC Priority(优先级) Group(组) Config(配置)

转入他的释义看:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

可以看到有配置SCB->AIRCR 寄存器的语句。

这个中断优先级分组函数括号里面可以填上自己想要的中断分组,比如组2

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

分组设置好之后如何设置单个中断的抢占优先级和响应优先级呢?

这其中涉及很多寄存器,先一起看看吧。

3.2相关寄存器

中断设置相关寄存器:

typedef struct
{
  __IO uint32_t ISER[8];                     
       uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                     
       uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];                      
       uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                     
       uint32_t RESERVED3[24];                                   
  __IO uint32_t IABR[8];                      
       uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];                      
       uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;                         
}  NVIC_Type;  

__IO uint8_t  IP[240]; //中断优先级控制的寄存器组

__IO uint32_t ISER[8]; //中断使能寄存器组

__IO uint32_t ICER[8]; //中断失能寄存器组

__IO uint32_t ISPR[8]; //中断挂起寄存器组

__IO uint32_t ICPR[8]; //中断解挂寄存器组

__IO uint32_t IABR[8]; //中断激活标志位寄存器组

先眼熟一下这些寄存器,然后我们再来说怎么设置。

其实在目录二中已经提到过,就是IP[240] (Interrupt Priority Registers)

中断优先级控制的寄存器组:IP[240]

 他有240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F10x系列一共60个可屏蔽中断,所以只使用IP[59]~IP[0]。IP[59]~IP[0]分别对应中断 59~0,而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位

忘记的小伙伴可以往前翻一下。

在库函数中设置抢占和响应优先级是用这个函数:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

这个函数有一个指针类型成员变量,现在去看看NVIC_InitTypeDef*的释义:

typedef struct
{
  uint8_t NVIC_IRQChannel;                    
                                                  
  uint8_t NVIC_IRQChannelPreemptionPriority;  

  uint8_t NVIC_IRQChannelSubPriority;         

  FunctionalState NVIC_IRQChannelCmd;        
} NVIC_InitTypeDef;

这里面有4个成员变量:

NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在 stm32f10x.h 中找到 每个中断对应的名字。例如 USART1_IRQn。

NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。

NVIC_IRQChannelSubPriority:定义这个中断的响应优先级别。

NVIC_IRQChannelCmd:该中断是否使能。

比如我们要使能串口 1 的中断,同时设置抢占优先级为 1,子优先级位 2,初始化的方法是:

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); //根据上面指定的参数初始化 NVIC 寄存器

中断使能寄存器组:ISER[8]

ISER[8]: 中断使能寄存器组

它是32位寄存器,每个位控制一个中断的使能。STM32F10x只有60个可屏蔽中断,所以只使用了

其中的ISER[0]和ISER[1]。ISER[0]的bit0~bit31分别对应中断0~31,ISER[1]的bit0~27对应中断32~59。

他的作用是使能中断,哎,这个作用是不是在哪里听过?

再看看他用的函数也是:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

所以它对应的是指针类型成员变量的第四个成员变量使能:

FunctionalState NVIC_IRQChannelCmd

 所以配置这个成员变量就相当于配置这个寄存器

对应的还有中断失能寄存器组。

中断失能寄存器组:ICER[8]

ICER[8]:中断失能寄存器组

他的作用是用来失能中断。

他也是32位寄存器,每个位控制一个中断的失能。STM32F10x只有60个可屏蔽中断,所以只使用

了其中的ICER[0]和ICER[1]。ICER[0]的bit0~bit31分别对应中断0~31。ICER[1]的bit0~27对应中断

32~59,配置方法跟ISER一样。也使用函数:

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

配置第四个成员变量失能,就是配置这个寄存器。 

下面几个寄存器用的少,混个眼熟先:
中断挂起控制寄存器组:ISPR[8]

作用:用来挂起中断 

 中断解挂控制寄存器组:ICPR[8]

作用:用来解挂中断 

中断激活标志位寄存器组:IABR [8]

作用:只读,通过它可以知道当前在执行的中断是哪一个,如果对应位为1,说明该中断正在执行。 

3.3总结步骤

先设置中断优先级分组,比如设置为组2:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

注意:整个系统执行过程中,只能设置一次,不要用着用着突然改了 

然后针对每个中断,设置对应的抢占优先级和响应优先级,例如:

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); //根据上面指定的参数初始化 NVIC 寄存器

最后如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

这个我们先不做探究。

待补充,待更新...文章来源地址https://www.toymoban.com/news/detail-835026.html

到了这里,关于stm32-NVIC中断优先级管理(以古代官职角度分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 三、STM32中systick中断的优先级

    systick为内核外设中断,与普通外设中断的优先级有些区别,并没有抢占优先级和子优先级的说法。 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器:SHPRx(x=1.2.3)来配置。 内核外设的中断优先级可编程为0~15,数值越低,优先级越高。 在SysTick_Config中,配置优先

    2024年02月11日
    浏览(28)
  • NVIC 简介、抢占优先级和响应优先级

    NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。 如果医院只有医生的话,当看病的人很多时,医生就得安排一下先看谁,后看谁,如果有紧急的病人,那还得让紧急的病人最先来,这个安排先后次序的任务很繁琐,

    2024年02月05日
    浏览(37)
  • MSP432学习笔记6:中断优先级管理

    所用型号:MSP432P401R 今日继续我的MSP432电赛速通之路。 主要学习的是: 中断优先级管理、软件挂起中断、屏蔽中断优先级 目录 MSP432具有8级可编程的中断优先级。  中断优先级管理库函数:

    2024年02月05日
    浏览(40)
  • 中断处理优先级和中断响应优先级的区别

      中断响应优先级是针对同时到达的中断请求先处理谁的规定。比如A、B同时向CPU发出中断请求,而中断响应优先级是AB,那么CPU就会先处理A,再处理B。   如下图:   中断处理优先级是解决中断嵌套情况下优先处理谁的问题。比如A、B两个中断的中断处理优先级是BA,

    2024年02月11日
    浏览(28)
  • 【FreeRTOS】——中断优先级设置&中断相关寄存器&临界段代码保护&调度器挂起与恢复

    目录 前言: 一、中断优先级设置 二、中断相关寄存器(STM32-Cortex M3) 三、临界段代码保护 四、任务调度器的挂起和恢复 总结: 博客笔记根据正点原子视频教程编辑,仅供学习交流使用! ①中断概念回顾 让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中

    2024年02月10日
    浏览(35)
  • 【STM32】中断与NVIC以外部中断为例

    在stm32中姑且可以认为,异常就是中断 单片机上电之后,首先执行启动文件,开辟堆栈之后,开始初始化中断向量表。 NVIC NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是 内核 里面的一个外设。 ####三个寄存器 ISER 、 ICER 和 IP NVIC 结构体

    2024年02月10日
    浏览(23)
  • STM32 中断NVIC详解,配置及示例

             NVIC 全称 Nested Vectored Controller 嵌套向量中断控制器         它是一种硬件设备,用于管理和协调处理器的中断请求。NVIC可以管理多个中断请求,并按优先级处理它们。当一个中断请求到达时,NVIC会确定其优先级并决定是否应该中断当前执行的程序,以便及时

    2024年02月03日
    浏览(31)
  • Nacos配置文件管理、微服务获取Nacos配置文件、热更新、配置共享、配置优先级等

    传统项目中,当我们需要修改配置文件时,需要修改配置文件,停掉服务,重启服务,这样不利于提升用户体验; 而使用Nacos进行项目的配置文件管理,则可以实现热更新配置文件,在Nacos中修改之后,Nacos会通知项目新的配置文件。 添加配置文件 第一步,点击添加配置:

    2023年04月11日
    浏览(29)
  • JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

    不同配置文件,配置同一个属性谁有效 propertiesymlyaml 命令行参数Java系统属性 项目打包后要改变属性: 红色是Java系统属性,绿色是命令行参数 ‘ 获取IOC容器:applicationContext就是IOC容器对象 IOC容器中bean是默认单例的只有一个,这样三个获取的bean是同一个 单例还是多例取决

    2024年04月23日
    浏览(34)
  • 【明解STM32】中断系统理论基础知识篇之中断基本原理及NVIC

    目录 一、前言 二、基本原理概述 1、中断的作用 2、中断和异常 3、NVIC中断控制器 4、中断的分类 三、中断管理机制 1、中断向量 2、中断优先级 3、中断嵌套 四、中断处理流程 五、总结         中断是什么?举个例子来说,当我们正在工作时,突然电话响了,这时你会把

    2024年02月05日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包