STM32-NVIC中断嵌套优先级管理器

发布者:快乐旅途最新更新时间:2022-04-22 来源: eefocus关键字:STM32  NVIC  中断嵌套 手机看文章 扫描二维码
随时随地手机看文章

NVIC简介

NVIC(Nested Vectored Interrupt Controller),中断嵌套向量控制器,是 Cortex‐M3 不可分离的一部分,它与 CM3 内核共同完成对中断的响应。在了解NVIC之前最好简单了解一下CM3内核的中断系统,传送。


NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQn),每个中断有最高256(最低8)级的优先级,具体的中断数和优先级级数由芯片厂商在设计芯片时决定(STM32F1支持60个外部中断,16级优先级)。此外,NVIC 还支持一个“永垂不朽”的不可屏蔽中断(NMI)输入。NMI 的实际功能亦由芯片制造商决定。在某些情况下,NMI 无法由外部中断源控制。


NVIC相关寄存器

在内核文件core_cm3.h中定义了NVIC相关的寄存器,


/** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC

  memory mapped structure for Nested Vectored Interrupt Controller (NVIC)

  @{

 */

typedef struct

{

  __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */

       uint32_t RESERVED0[24];                                   

  __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */

       uint32_t RSERVED1[24];                                    

  __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */

       uint32_t RESERVED2[24];                                   

  __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */

       uint32_t RESERVED3[24];                                   

  __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */

       uint32_t RESERVED4[56];                                   

  __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */

       uint32_t RESERVED5[644];                                  

  __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */

}  NVIC_Type;                                               

/*@}*/ /* end of group CMSIS_CM3_NVIC */


中断使能寄存器 ISER[8] (Interrupt Set-Enable Registers),前面提到CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。写1使能该位中断,写0无效。


中断除能寄存器 ICER[8] (Interrupt Clear-Enable Registers),该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。写1清除相应位中断,写0无效。


中断挂起寄存器 ISPR[8] (Interrupt Set-Pending Registers),每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写0无效。


中断解挂寄存器 ICPR[8] (Interrupt Clear-Pending Registers),其作用与 ISPR 相反,对应位也和 ISER 是一样的。写1解挂,写0无效。


中断激活标志位寄存器 IABR[8] (Interrupt Active Bit Registers),只读寄存器,对应位所代表的中断和 ISER 一样,如果为 1,表示该位所对应的中断正在被执行,中断执行完由硬件自动清零。


中断优先级控制的寄存器 IP[240] (Interrupt Priority Registers),与中断分组密切相关,由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,最多共可表示 240 个可屏蔽中断(STM32 只用到了其中的前 60 个,IP[59]~IP[0]分别对应中断 59~0)。每个可屏蔽中断占用的 8bit 并没有全部使用,STM32只用了 4位(高四位[7:4],MSB),这 4 位又分为抢占优先级和子优先级,而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。


应用中断和复位控制寄存器 SCB_AIRCR

[10:8]位就是中断优先级分组的设置位。


这里再啰嗦一遍

中断优先级配置

中断优先级分组相关函数在misc.c/h文件中


void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)//设置中断优先级分组

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) //针对每个特定的中断设置抢占优先级和响应优先级

配置步骤


1.在主函数使用NVIC_PriorityGroupConfig()函数初始化的部分设置中断优先级分组,没有特殊情况的话,一般为分组2,即2位抢占优先级,2位响应优先级。


可选参数


NVIC_PriorityGroup_0 // 0位抢占优先级,4位响应优先级

NVIC_PriorityGroup_1 // 1位抢占优先级,4位响应优先级

NVIC_PriorityGroup_2

NVIC_PriorityGroup_3

NVIC_PriorityGroup_4 // 4位抢占优先级,1位响应优先级

2. 针对每个中断,使用NVIC_Init() 函数设置对应的抢占优先级和响应优先级。


参数为NVIC初始化结构体,其定义如下,包含的参数为:中断请求通道NVIC_IRQChannel、抢占优先级NVIC_IRQChannelPreemptionPriority、响应优先级(亚优先级)NVIC_IRQChannelSubPriority、中断通道使能控制NVIC_IRQChannelCmd。


typedef struct

{

  uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.

                                                   This parameter can be a value of @ref IRQn_Type 

                                                   (For the complete STM32 Devices IRQ Channels list, please

                                                    refer to stm32f10x.h file) */

 

  uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel

                                                   specified in NVIC_IRQChannel. This parameter can be a value

                                                   between 0 and 15 as described in the table @ref NVIC_Priority_Table */

 

  uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified

                                                   in NVIC_IRQChannel. This parameter can be a value

                                                   between 0 and 15 as described in the table @ref NVIC_Priority_Table */

 

  FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel

                                                   will be enabled or disabled. 

                                                   This parameter can be set either to ENABLE or DISABLE */   

} NVIC_InitTypeDef;


设置定时器3的抢占优先级举例如下:


主函数中;


 int main(void)

{

     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:  2位抢占优先级,2位响应优先级

     //×××_Int_Init();  代码:外设中断配置函数

    while(1)

    {

        //...

    }

}

中断配置函数×××_Int_Init() 中:


×××_Int_Init()

{

    NVIC_InitTypeDef NVIC_InitStructure;

 

    //Device Init  代码:外设的初始化配置

 

    NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级3级

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

    NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器

 

    //Enable Device   代码:使能外设

}

关键字:STM32  NVIC  中断嵌套 引用地址:STM32-NVIC中断嵌套优先级管理器

上一篇:STM32-USART串口通信【USART和UART的区别】
下一篇:STM32-异常与中断

推荐阅读最新更新时间:2024-11-11 11:21

使用STM32 ST-LINK Utility 设置读保护后不能运行
前言 有些时候,我们总是按自己的想法,觉得不会有问题的时候,出现了一些看起来奇奇怪怪的问题,只不过最后还是可以发现这是有理可据的。 问题 某客户在其产品的设计中,使用了STM32F411VET6。客户工程师在开发过程中,尝试使用STM32 ST-LINK Utility 软件配合 ST-LINK 给32F411EDISCOVERY 板上的STM32 加上Level 1 的读保护。工程师发 现,原本在板子上正常运行的代码,加上读保护后,就不运行了。按了板上的RESET 按键也无济于事。 调研 1.了解问题 客户工程师使用32F411EDISCOVERY 来验证读保护的功能。 客户打开STM32 ST-LINK Utili
[单片机]
STM32实战五 板载LED显示数据
写到第五章,终于有可以看见的结果了。不过磨刀不误砍柴功。正因为前面的基础,才有今天的成果,而且有一定的实用价值。封装一个BoardLED类,主要功能是利用板载LED显示数据,类似于 Morse code 电报码,以点亮时间的长短表示二进制数据的0和1,最多4位二进制,十进制15,可以扩展到更多。下面的程序显示主循环周期时间,单位1us,实际上可以用来显示设置运行状态。购买或开发不同的开发板,LED对应的脚号不同,修改程序对应的IO号即可。 BoardLED.h 代码中用到了前几章的封装类,需要前面的原程序,全部做完以后做一个总的封包,上传到资源库中。 #ifndef __BOARDLED__ #define __BOARD
[单片机]
<font color='red'>STM32</font>实战五 板载LED显示数据
关于STM32寄存器的理解
我们以STM32F4系列为例, 他有7根控制总线和8根被控总线(S0-7),他们交叉的圆点表示这两根总线之间可以互相通信,M0,M2,M6表示STM32的三种不同启动方式,FLASH启动(包含系统存储器),内部SRAM启动,外部RAM启动。 存储器本身不具有地址,是厂商或者我们用户自己给他分配地址的,这个过程就叫做存储器映射,如果我们给存储器再 分配一个地址,就叫做存储器的重映射。 根据不用的芯片我们可以查阅其DATASHEET中的memory map获得信息。 我们重点要知道BLOCK0,1,2 因为它们分别设计成了 内部FLASH,内部RAM以及片上外设。BLOCK2里又划分了AHB和APB总线,AHB- AHB1和
[单片机]
STM32】串口接收任意字符串
前言 之前写了一篇STM32hal库串口中断接收任意字符 实际上是不完美的,他接收到换行符就完蛋了。 花了点时间深入研究了一下hal库的串口中断函数,发现他其实是不完美的,有一些BUG。 所以查了资料,找了很久,才找到这个博主的文章: STM32CubeMX5.1.0使用教程,以STM32L431为例(三):串口通信 cube配置 设置串口波特率和中断 生成工程文件,去hal库的 stm32l4xx_it 里注释掉串口中断函数(官方有问题,我们自己写!) usart.h: usart.h: /* Define to prevent recursive inclusion -------------------
[单片机]
【<font color='red'>STM32</font>】串口接收任意字符串
STM32之寄存器开发
首先克服心理作用,不要总是默认寄存器开发难,其实寄存器开发和库函数开发所用的方法和难度是一样的, 并不难,下面用以stm32为例解释。 : 1.明确自己需要的功能(库函数开发也需要) 2.查看手册,找到功能对应的单片机资源 3.找到功能所需寄存器(库函数开发需要找到相应的功能函数) 4.根据地址每位对应的功能赋值(库函数开发需要找到相应的入口函数) 5.调试结束。 而且寄存器开发不难但是麻烦,有很多没接触过的名词(有可能是一些英文缩写),所以需要耐心,慢慢品味。如果这些名词弄清楚了,寄存器开发反而会比库函数开发简单、方便。 注:名词或需要整理的步骤太多可以手动记一下,既有利于理清思路,也方便回看时
[单片机]
STM32学习笔记9——结构体赋值问题
采用TCP/IP上报采集数据,用结构体的形式建立数据缓冲区。在对结构体整体赋初值(比如帧头之类的可以先赋值)时,发现结构体只能在定义时整体赋初值,而不能在初始化语句中赋。 比如我定义的结构体为: //帧格式结构体 typedef struct { uint32_t frame_head; //帧标志 uint16_t frame_len;//帧长 stcSystemTime frame_time;//帧时间 stcFrameParameter frame_parameter;//参数列表 uint8_t frame_head_check;//帧头校验码 uint8_t frame_total_check;//整帧校验码 s
[单片机]
STM32(6) STM32时钟系统精讲(正点原子)
讲解内容: 时钟系统框图 时钟配置相关函数 参考资料 《STM32F4开发指南库函数版本》4.3小节STM32F4时钟系统 《STM32F4中文参考手册》第六章 复位和时钟系统 先看开发指南4.3小节的时钟树 时钟框图在中文参考手册的6.2小节,STM32的时钟系统还是很复杂的,为什么ARM的时钟系统要做的这么复杂,采用 多时钟源, 时钟频率越高功耗 越高。 F4与F1类似也有5个时钟来源 1 LSIRC 低速 的内部时钟 2 LSEOSC 低速的外部时钟 3 HSIRC 高速的内部时钟 4 PLLCLK 锁相环时钟输出 5 HSEOSC 也是一个很重要的时钟源,也是我们最常用的
[单片机]
<font color='red'>STM32</font>(6) <font color='red'>STM32</font>时钟系统精讲(正点原子)
stm32程序下载调试之swd
说明: IAR环境版本 IAR ARM 6.30.0 1.swd使用jtag的4根线VCC,GND,JTMS,JTCK 注意 :必须将boot0=0,boot1=x 2.JLINK(20pin)的引脚对应引脚定义如下图 3.iar环境的设置 第一步:Options- Debugger- Setup选项中driver选择Jlink/J-TRAC 第二步: Options- Debugger- Download选项中我习惯选成verify download(其实不选也没关系) 对于use flash loader,这个选项的意思可能是用iar自带的flash loader去下载程序,不选时使用j-l
[单片机]
<font color='red'>stm32</font>程序下载调试之swd

推荐帖子

底层丝印层这样的字打出来是正常的还是翻转的?
底层丝印层这样的字打出来是正常的,现在在底层丝印层,还是翻转的?没打过背面放丝印的板.求助底层丝印层这样的字打出来是正常的还是翻转的?这样打出来是反的。反了+1我一般都是分顶层和底层分别打印,顶层布线和丝印加上机械层或者禁止布线层,底层布线和底层丝印加机械层或禁止布线层,打印底层的时候在选项里选上mirror,打出来的字就是正的了底层放字要镜像设置astwyg发表于2014-2-1821:45反了+1 好,谢谢,改一改就可以去打了.如果用AD软件,可以按
cl17726 PCB设计
DDR3总线信号完整性测试需要关注4点
某工程师写的4点DDR测试注意事项DDR3总线信号完整性测试需要关注4点DDR3总线信号的测试是不是对示波器的带宽要求比较高,,至少1G?
wstt PCB设计
相当急,快又要搞通宵了。WIN CE上的串口编程问题
我写了个程序。在WINDOWCE上跑的,我用VS2008建立了个MFC智能程序。我用串口调试助手测试,助手不停的发送数据。发现助手上能接收CE上发来的消息,可是CE上的程序却一直阻塞(或者我把线程里面的代码改成一直在读的时候。都是没读到任何东西。)第一次写CE,希望哪位大大指点具体代码如下: //按钮事件 OnBnClickedreaddata() { if(!OpenCom()) { Messa
cooler1981 嵌入式系统
TXBUF1这个是啥
单片机里的一个变量好像跟串口通讯有关.用声明吗表示啥意思怎么用有没有相关介绍提供点资料啥的谢TXBUF1这个是啥
linjingui 单片机
以TI的一个SimpliciTI(点对点简单无线数传协议)例程为例,说一下重构
重构,用最简单的说法就是:在不改变代码现有功能的前提下,优化和改善代码。对代码而言,它的优化和改善是多方面的,为了避免这个话题过于庞杂,并且超出我们的能力范围。我们只着重考虑我们所关心的部分代码质量问题。这里说的“代码质量”,是楼主临时想到的一个提法,如字面意思。现阶段,楼主所考虑的代码质量比较简单,只包含:1.代码以功能为单位,尽可能地模块化,子函数化,更低耦合性,更独立——你可以理解成,一旦达成这样的目的,你可以很轻易地把在某个在PC上使用的代码直接放到51程序里而甚至无
辛昕 编程基础
利德华富 东方日立 明阳龙源
小弟对这个行业非常感兴趣,毕竟现在国家大力提倡环保,最近去明阳龙源发现该企业真的不错,技术产品全而广,设计、服务到位,增长速度可观。有志者可多交流交流利德华富东方日立明阳龙源
beh 工控电子
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved