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-17 11:27

STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击
前言 状态机是一种根据当前状态来执行相应动作,根据输入去改变状态的方法,出处应该在数字电路中。 我们利用状态机的思想来实现按键的消抖和一些其他功能的实现 一、状态图 我们的按键实验,就是以此状态图为基础,然后做延申,实现长短按和双击。 二、Cubemax配置 1、IO口配置 这个配置很简单,看自己的板子上按键的IO口是哪个,我这里以KEY0做演示 配置PH3为输出IO,而且由电路图可知,应该设置为上拉。 2、定时器配置 我们需要配置一个10ms的定时器,以10ms去检测按键的状态 三、代码 1、编写有关按键的结构体和定义相关参数 #define IOSTATE HAL_GPIO_ReadPin(GPI
[单片机]
<font color='red'>STM32</font> Cubemax(十二) ——利用状态机实现按键的长短按和双击
STM32基础2--SMT32CubeMX的 code目录
1.0:Code的目录结构 在上一篇文章生成代码后,通过MDK打开项目,可以看到如下的项目结构。对于GPIO来说,我们只需要关注两个文件 main.h , main.c , gpio.h , gpio.c 。 2.0:main.h main.h 可以看到引入头文件#include stm32f4xx_hal.h ,以及对GPIO进行了宏定义。 GPIO宏定义是由于在配置GPIO引脚时使用User Label /* USER CODE BEGIN Header */ /** ************************************************************************
[单片机]
<font color='red'>STM32</font>基础2--SMT32CubeMX的 code目录
STm32 使用 stm32cube GPIO 点亮 led 的
一、API说明 HAL库一共包含如下6个IO操作函数: 1、读取某个引脚的电平状态: HAL_GPIO_ReadPin() 2、写入某个引脚的电平状态: HAL_GPIO_WritePin() 3、翻转某个引脚的电平状态: HAL_GPIO_TogglePin() 4、锁定某个引脚的配置状态(直到下次复位): HAL_GPIO_LockPin() 5、外部中断服务函数: HAL_GPIO_EXTI_IRQHandler() 6、外部中断回调函数: HAL_GPIO_EXTI_Callback() 具体使用方法参见 STM32F4xx HAL驱动说明书 。 二、GPIO使用示例 示例功能:使用按键(PC13)翻转LED(PA5)
[单片机]
<font color='red'>STm32</font> 使用 stm32cube GPIO 点亮 led 的
STM32的串口中断
总的来说,STM32单片机的串口还是很好理解的,编程也不算复杂。当然我更愿意希望其中断系统和51单片机一样的简单。 对于接收终端,就是RXNE了,这只在接收完成后才产生,在执行USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)代码时不会进入ISR。但麻烦的就是发送有关的中断了:TXE或者TC,根据资料和测试的结果,TXE在复位后就是置1的,即在执行USART_ITConfig(USART1, USART_IT_TXE, ENABLE)后会立即产生中断请求。因此这造成一个麻烦的问题:如果没有真正的发送数据,TXE中断都会发生,而且没有休止,这将占用很大部分的CPU时间,甚至影响其他程
[单片机]
STM32-系统时钟
1. STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,RC振荡器,频率为8MHz; (2)HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围是4MHz – 16MHz; (3)LSI是低速内部时钟,RC振荡器,频率为40KHz; (4)LSE是低速外部时钟,接频率为32.768KHz的石英晶体; (5)PLL为锁相环倍频输出,严格的来说并不算一个独立的时钟源,PLL的输入可以接HSI/2、HSE或者HSE/2。倍频可选择为2 – 16倍,但是其输出频率最大不得超过72MHz。 其中,40kHz的LSI供独立看门狗IWDG使用,另外
[单片机]
基于STM32的远程温控系统设计
温度控制 是工业控制的主要对象之一,常用的温控数学模型是一阶惯性加上纯滞后环节,但其随着加热对象和环境条件的不同,会存在着较大的差异。因为温控对象这种较为普遍的含有纯滞后环节的特点,容易引起系统超调和持续的振荡,温度控制对象的参数会发生幅度较大的变化。因此无法采用传统的控制方法(如常规的PID控制)对温度进行有效的控制,而智能控制不需要对象的精确数学模型就可以对系统实施控制 。温度控制多采用由单片机系统来实现温度控制,其缺点是远程控制系统复杂,可靠性差,特别是当控制点较多、距离较远时,采取总线方式的通讯出错概率较高,影响到温度的控制精度 。   目前,多家厂商(如日本导电、岛通)均推出精度可达0.1级的基于PID算法的 智能型
[单片机]
基于<font color='red'>STM32</font>的远程温控系统设计
采用STM32的心电采集系统电路设计
  心血管类疾病已经成为威胁人类身体健康的重要疾病之一,而清晰有效的心电图为诊断这类疾病提供了依据,心电采集电路是心电采集仪的 关键部分,心电信号属于微弱信号,其频率范围在0.03~100 Hz之间,幅度在0~5 mV之间,同时心电信号还掺杂有大量的干扰信号,因此,设计良好的滤波电路和选择合适的控制器是得到有效心电信号的关键。基于此,本文设计了以STM32 为控制核心,AD620和OP07为模拟前端的心电采集仪,本设计简单实用,噪声干扰得到了有效抑制。   主控模块电路设计   主控模块的STM32F103VET单片机是控制器的核心,该单片机是ST意法半导体公司生产的32位高性能、低成本和低功耗的增强型单片机,其内核采用 ARM公
[单片机]
采用<font color='red'>STM32</font>的心电采集系统电路设计
个人对STM32 SysTick的总结(寄存器操作)
一、概述: SysTick是一个简单的递减24位计数器。如果你不需要再应用程序中嵌入操作系统,SysTick可以作为简单的延时和产生周期性的中断。 状态控制寄存器的第0位可以使能计数器,当前值寄存器随着时钟一直递减,当他减到0的时候,重装载寄存器就会重新装载这只的值,计数器继续从这个值递减。 二、相关寄存器: 2.1SysTick- CTRL 状态和控制寄存器 位16:当前值寄存器递减到0,位16置1 位2:时钟源选择位,0:使用外部参考时钟;1:使用内核时钟 位1:使能SysTick中断,当前值寄存器递减到0时产生中断 位0:SysTick时钟使能 2.2SysTick- LOAD 重装载值寄存器 当前值寄存器为
[单片机]
个人对<font color='red'>STM32</font> SysTick的总结(寄存器操作)

推荐帖子

【麦昆试用】主要功能对应驱动引脚
因为没有原理图,初步整理了一下microbit对应麦昆的功能,方便大家使用。左LEDP8右LEDP12红外接收器P16超声波传感器P1、P2蜂鸣器P0左寻线传感器P13右寻线传感器P14WS2812P15电机I2C(P19、P20)【麦昆试用】主要功能对应驱动引脚电机用P19,P20?2路电机吗 2路电机,通过I2C控制。是什么驱动芯片? 参考这个帖子:https://bbs.eeworld.com.cn/t
dcexpert MicroPython开源版块
本周精彩博文分享
TI参展2018年上海汽车灯具展览会TI在3月28日至29日于上海召开的十三届汽车灯具产业发展技术论坛暨第四届上海国际汽车灯具展览会(ALE)上展出了最新的汽车外部照明解决方案。ALE上海是一个年度汽车灯展,顶尖创新者和公司可在展会上分享汽车外部照明领域最新的技术。〉〉〉点击查看详情【超强技术干货来袭】工业、汽车18个终端应用解决方案各位“攻城狮”们!TI工程师精心整理了18篇技术解决方案,
橙色凯 模拟与混合信号
【DigiKey“智造万物,快乐不停”创意大赛】MAIX BIT KIT上“九子贤棋”的核心逻辑
正在调试九子贤棋的自动求解代码,发现有bug,修复后觉得有必要梳理一下规则的实现方法。这里贴一下lucky9starClass和调用求解方法的代码:#################################################################################lucky9starClass########################################
nemon DigiKey得捷技术专区
MC9S08DZ60做IIC从机的配置和程序
MC9S08DZ60做IIC从机的初始化配置和程序,编程环境是codewarrior,C语言。MC9S08DZ60做IIC从机的配置和程序
liulongzp NXP MCU
布局 线宽 间距 走线 泪滴 过孔 【快速提升PCB板Layout质量的6个细节】
前言现在很多的PCBLayout工程师都是按照硬件工程师或者PISI工程师给出的约束规则来完成布局布线的,俗称的拉线工。如不想被当做拉线工来看待。要具备一定的电路理解能与SI/PI工程师做PI/SI分析的能力。PCBLayout是一项技术活,也是经验活。学习一些有用的经验,往往可以让人受益匪浅。
成都亿佰特 PCB设计
【2024 DigiKey 创意大赛】 键鼠统一管家(1) 软件算法及实现
#【2024DigiKey创意大赛】键鼠统一管家(1)软件算法及实现##1.引言我此次使用OPENMVH7开发板来实现人脸检测,并根据人脸中心位置与预设标定位置的比较来判断人脸朝向。因此在本文将介绍人脸识别算法原理、算法实现流程以及测试结果。##2.算法原理Haar级联分类器是一种用于对象检测的机器学习算法,由PaulViola和MichaelJones在2001年提出。它的核心思想是使用大量的正样本(包含人脸的图像)和负样本(不包含人脸的图像)来训练一个级联函数,这
lzhan DigiKey得捷技术专区
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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