94.STM32外部中断

news2024/11/27 6:40:33

目录

1.什么是 NVIC?

2.NVIC寄存器 

3.中断优先级 

4.NVIC的配置 

设置中断分组​编辑

配置某一个中断的优先级

5.什么是EXTI

6.EXTI和NVIC之间的关系 

7.SYSCFG 的介绍 


1.什么是 NVIC?

        NVIC是一种中断控制器,主要用于处理 ARM Cortex-M 微控制器的中断管理。NVIC 负责处理中断优先级、中断向量表以及中断使能和禁止等任务。

  1. 中断向量表: NVIC 维护了中断向量表,其中包含了中断服务程序的入口地址。当中断发生时,CPU会根据中断号(或中断向量)在中断向量表中查找相应的中断服务程序的入口地址。

  2. 中断优先级: NVIC 允许为每个中断配置优先级。这些优先级决定了中断在系统中的响应顺序。Cortex-M架构中,中断优先级通常是基于位宽的,较低位的值表示较高的优先级。

  3. 嵌套中断: NVIC 支持嵌套中断,即在处理某个中断时,如果发生更高优先级的中断请求,系统可以中断当前中断服务程序,处理更高优先级的中断,然后返回继续处理低优先级的中断。这种特性对于实时系统和复杂任务处理非常有用。

  4. 中断使能和禁止: NVIC 允许对每个中断进行使能和禁止。这使得可以在运行时动态地配置系统中的中断。

  5. 中断状态: NVIC 提供了一些寄存器用于查询和管理中断状态,例如检查某个中断是否处于挂起状态。

  6. 中断控制寄存器: NVIC 通过一系列寄存器(如 NVIC_ISER、NVIC_ICER、NVIC_ISPR、NVIC_ICPR)提供中断的使能、禁止、挂起和清除等功能。

2.NVIC寄存器 

typedef struct
{
    __IOM uint32_t ISER[8U]; /* 中断使能寄存器 */
    uint32_t RESERVED0[24U];
    __IOM uint32_t ICER[8U]; /* 中断清除使能寄存器 */
    uint32_t RSERVED1[24U];
    __IOM uint32_t ISPR[8U]; /* 中断使能挂起寄存器 */
    uint32_t RESERVED2[24U];
    __IOM uint32_t ICPR[8U]; /* 中断解挂寄存器 */
    uint32_t RESERVED3[24U];
    __IOM uint32_t IABR[8U]; /* 中断有效位寄存器 */
    uint32_t RESERVED4[56U];
    __IOM uint8_t IP[240U]; /* 中断优先级寄存器(8Bit 位宽) */
    uint32_t RESERVED5[644U];
    __OM uint32_t STIR; /* 中断触发中断寄存器 */
} NVIC_Type;

STM32F407 的中断在这些寄存器的控制下有序的执行的。只有了解这些中断寄存器,才能
方便的使用 STM32F407 的中断。下面重点介绍这几个寄存器:

1.ISER[8](Interrupt Set Enable Register):中断使能寄存器
2.ICER[8](Interrupt Clear Enable Registers):中断除能寄存器

3.ISPR[8](Interrupt Set Pending Registers):中断使能挂起控制寄存器,通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。写 0 是⽆效的。
4.ICPR[8](Interrupt Clear Pending Registers):中断解除挂起控制寄存器

5.IABR[8](Interrupt Active Bit Registers):是⼀个中断激活标志位寄存器组。对应位所代表的中断和 ISER ⼀样,如果为 1,则表示该位所对应的中断正在被执行。这是⼀个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
6.IP [240](Interrupt Priority Registers):中断优先级控制寄存器组。由240个8bit的寄存器组成,每个可屏蔽中断占用8bit。但我们只用IP[81] - IP[0]这82个。并且,每个中断通道占用的8bit并没有全部使用,而是只用了高4位。

3.中断优先级 

        STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:
        抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
        响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
        还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循
自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
        在 NVIC 中由寄存器 NVIC_IPR0-NVIC_IPR59 共 60 个寄存器控制中断优先级,每个寄存器的每 8 位又分为一组,可以分 4 组,所以就有了 240 组宽度为 8bit 的中断优先级控制寄存器,
原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。但是实际上 M3 /M4
/M7 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌
套,即 2^4=16。

        抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。 抢占优先级和响应优先级相同的,按中断号(中断向量表)先后执行。

4.NVIC的配置 

设置中断分组

配置某一个中断的优先级

函数名称:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);

typedef struct
{
  uint8_t NVIC_IRQChannel;  //表示要配置的中断通道(或中断号)                  
  uint8_t NVIC_IRQChannelPreemptionPriority;  //表示中断的抢占优先级。
  uint8_t NVIC_IRQChannelSubPriority;  //表示中断的响应优先级。      
  FunctionalState NVIC_IRQChannelCmd; //表示中断通道的使能状态。       
} NVIC_InitTypeDef;

 

下面是结构体成员的解释:

  1. NVIC_IRQChannel 表示要配置的中断通道(或中断号)。对于 ARM Cortex-M 微控制器,中断通道的编号是硬件定义的,代表不同的中断源。例如,USART1 的中断通道号是 USART1_IRQn

  2. NVIC_IRQChannelPreemptionPriority 表示中断的抢占优先级。中断的抢占优先级决定了在同一时间发生多个中断时,哪个中断可以立即被处理,而哪些需要等待。这是一个 0 到 N-1(N 是抢占优先级位数)的值,值越小表示优先级越高。

  3. NVIC_IRQChannelSubPriority 表示中断的子优先级。在同一抢占优先级组内,子优先级决定了不同中断的响应顺序。这是一个 0 到 N-1(N 是子优先级位数)的值,值越小表示优先级越高。

  4. NVIC_IRQChannelCmd 表示中断通道的使能状态。可以为 ENABLEDISABLE,分别表示使能或禁止相应的中断通道。

5.什么是EXTI

   EXTI 是外部中断(External Interrupt)控制器的缩写,用于处理与外部事件(通常是硬件引脚的状态变化)相关的中断。在 STM32 微控制器中,EXTI 模块与 GPIO 模块一起使用,以便在特定事件(如边沿触发、电平触发等)发生时触发相应的中断。 

初始化函数:void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);EXTI外设的时钟默认是开启的

typedef struct
{
  uint32_t EXTI_Line;              
  EXTIMode_TypeDef EXTI_Mode;      
  EXTITrigger_TypeDef EXTI_Trigger; 
  FunctionalState EXTI_LineCmd;     
}EXTI_InitTypeDef;
  1. EXTI_Line 指定要启用或禁用的外部中断线。这个参数可以是 EXTI_Lines 枚举类型中的任何组合值,表示一个或多个中断线。例如,EXTI_Line0 表示外部中断线0。
  2. EXTI_Mode 指定外部中断线的工作模式。这个参数可以是 EXTIMode_TypeDef 枚举类型的值,表示中断线的触发模式。例如,EXTI_Mode_Interrupt 表示中断模式。
  3. EXTI_Trigger 指定外部中断线的触发方式,即触发信号的边沿。这个参数可以是 EXTITrigger_TypeDef 枚举类型的值,表示中断线触发的方式,如上升沿、下降沿等。
  4. EXTI_LineCmd 指定所选外部中断线的新状态。这个参数可以是 FunctionalState 枚举类型的值,表示中断线的使能或禁止状态,可以是 ENABLEDISABLE

6.EXTI和NVIC之间的关系 

  1. EXTI 模块配置中断线: EXTI 负责配置外部中断线,将外部事件(通常是引脚状态的变化)连接到中断系统。它定义了中断线的触发条件、使能状态等。EXTI 允许你设置哪些引脚上的事件会触发中断,以及中断是由上升沿、下降沿还是上升和下降沿都触发。配置好 EXTI 后,当与之相关联的外部事件发生时,EXTI 会产生中断请求。

  2. NVIC 确定中断优先级: 一旦 EXTI 产生中断请求,中断请求会传递给 NVICNVIC 负责管理所有中断的优先级。在STM32中,中断的优先级是按组管理的,NVIC 允许配置每个中断的优先级。这就是为什么在使用外部中断时,需要通过 NVIC 设置中断的优先级。

  3. 中断处理函数:NVIC 配置好中断优先级后,当外部中断被触发时,NVIC 会根据中断优先级的设定决定是否打断当前正在执行的程序。如果中断被接受,NVIC 会跳转到相应的中断处理函数,该函数是由用户编写的,通常用于处理与中断相关的任务。在中断处理函数中,需要清除相应的中断标志,通常是通过 EXTI_ClearITPendingBit 来完成。

7.SYSCFG 的介绍 

   SYSCFG 是STM32微控制器中的一个系统配置寄存器,用于配置和控制一些系统级别的功能和外设。主要的作用包括配置外部中断线、使能内部的传感器和控制外设的引脚映射。

1.中断线映射: SYSCFG 允许将外部中断线映射到不同的中断通道。在使用外部中断时,需要配置 SYSCFG 以选择相应的中断通道。

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
//上述例子将 GPIOA 的引脚0与外部中断线0相关联。 

2.定时器触发映射: 对于某些定时器,SYSCFG 允许配置触发源。例如,可以将外部信号映射到定时器的触发输入。

TIM1_ETR_Config(TIM1_ETRSource_TI1, TIM1_ExtTRGPSC_DIV1, TIM1_ExtTRGPolarity_NonInverted, 0x00);
//上述例子配置了TIM1定时器的触发源。

3.内部传感器使能: SYSCFG 允许使能内部的温度传感器和电压检测器。

SYSCFG_VBATMonitoringCmd(ENABLE);
//上述例子使能了电池电压检测器。

4.BOOT模式配置: SYSCFG 允许配置启动时的引脚状态,以确定系统启动时的模式。

SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
//上述例子将内部SRAM映射到系统的起始地址。

 第一步:时钟的使能

  • 1)使能GPIO时钟
  • 2)使能SYSCFG时钟
  • ** EXTI和 NVIC的时钟默认是打开的

第二步:配置GPIO
第三步:配置SYSCFG

  • 配置函数:SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
  • 功能:选择中断引脚

第四步:初始化EXTI

  • 初始化函数:EXTI_Init();

第五步:配置NVIC

  • 1) 设置优先级:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//整个⼯程只设置⼀次
  • 2) 初始化:NVIC_Init();

第六步:编写中断函数

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1259700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看,或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家,有需要的可是尝试下,小编这边测试了可以用,就是下载的时候慢的一匹。。。 第一…

【C++】类型转换 ④ ( 子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast )

文章目录 一、子类 和 父类 之间的类型转换 - 动态类型转换 dynamic_cast1、构造父类和子类2、子类 和 父类 之间的类型转换 - 隐式类型转换3、子类 和 父类 之间的类型转换 - 静态类型转换 static_cast4、子类 和 父类 之间的类型转换 - 重新解释类型转换 reinterpret_cast5、…

时间序列预测实战(二十)自研注意力机制Attention-LSTM进行多元预测(结果可视化,自研结构)

一、本文介绍 本文给大家带来的是我利用我自研的结构进行Attention-LSTM进行时间序列预测,该结构是我专门为新手和刚入门的读者设计,包括结果可视化、支持单元预测、多元预测、模型拟合效果检测、预测未知数据、以及滚动长期预测,大家不仅可…

2023-2024-1-高级语言程序设计-字符数组

7-1 凯撒密码 为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换…

DIO算法

歌声和语音声带振动周期的快速可靠F0估计方法 原文题目: Fast and reliable F0 estimation method based on the period extraction of vocal fold vibration of singing voice and speech 发表在: AES 35TH INTERNATIONAL CONFERENCE, London, UK, 200…

【RLChina2023】CCF 苏州 记录

目录 RLChina介绍主旨报告专题报告智能体学习理论(专题一)智能体决策与规划(专题二)智能体框架、体系结构与训练系统(专题六)基于大语言模型的具身智能体与机器人研究 (专题八)教学报告——强化学习入门特别论坛——智能体和多智能体艺术的探索会议照片RLChina介绍 RLC…

什么是迁移学习

1 迁移学习概述 迁移学习(Transfer Learning)是机器学习中的一种方法,它允许模型将从一个任务中学到的知识应用到另一个相关的任务中。这种方法在数据稀缺的情况下尤为有用,因为它减少了对大量标记数据的需求。迁移学习已成为深度…

Failed to load resource: the server responded with a status of 404 ()

路径问题: 路径省略前面的http://localhost:8080/ 就行了。

OSG粒子系统与阴影 - ​​​​​​​阴影shadow(7)

OSG阴影 在虚拟现实仿真中,为了真实地模拟自然效果,阴影效果是不可缺少的,它对一个场景的真实性是非常重要的。在游戏或仿真中,一个高效的阴影往往能够提供非常强悍的视觉真实感。 osgShadow库 在OSG中专门定义了一个名字空间osg…

ShowWeb-浏览器插件:可视化元素路径查看器

ShowWeb👻:可视化元素路径查看器适配【谷歌】【Edge】 每次写前端最烦的就是一层一层找元素,又臭又长。所以我开发了一个小插件来缓解这个问题,这个插件可以输出整个路径,并把最后元素的内容输出方便查看,…

docker基础快速入门:基础命令、网络、docker compose工具

docker基础命令快速入门 目录 docker基本命令docker 网络docker compose Docker介绍 Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。 Docker的三个概念 镜像 Docker镜像是一个特…

Java飞翔的小鸟

一、项目分析 创建一个窗口和画板,把画板放到窗口上,在画板上绘画图片 (2)让小鸟在画面中动起来,可以上下飞 (3)让地面和管道动起来 (4)碰撞检测 (5&#xf…

2023信息技术应用创新论坛|云轴科技ZStack分享云原生超融合在智慧交通的应用

11月25日,2023信息技术应用创新论坛在常州开幕。江苏省工业和信息化厅副厅长池宇、中国电子工业标准化技术协会理事长胡燕、常州市常务副市长李林等领导出席论坛并致辞。中国工程院院士郑纬民出席并作主题报告。来自产学研用金等各界的千余名代表参加本次论坛。 在“…

UE5 - 虚幻引擎各模块流程图

来自虚幻官方的一些资料,分享一下; 一些模块的流程图,比如动画模块: 或角色相关流程: 由于图片比较大,上传到了网络,可自取: 链接:https://pan.baidu.com/s/1BQ2KiuP08c…

MATLAB的rvctools工具箱熟悉运动学【机械臂机器人示例】

1、rvctools下载安装 rvctools下载地址:rvctools下载 截图如下,点击红色箭头指示的“Download Shared Folder” 即可下载 下载之后进行解压,解压到D:\MATLAB\toolbox这个工具箱目录,这个安装路径根据自己的情况来选择&#xff0c…

【华为OD】统一考试C卷真题 100%通过: 传递悄悄话 二叉树遍历 C/C++实现

目录 题目描述: 示例1 解题思路: 代码实现: 题目描述: 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时,根节点所在位置的人有一个悄悄…

中通快递查询入口,根据物流更新量筛选出需要的单号记录

批量中通快递单号的物流信息,根据物流更新量将需要的单号记录筛选出来。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主…

代码随想录算法训练营第六十天|84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

PT里如何针对某个模块设置false path

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 如题,这个问题实际上讲的是get_cells的用法,我们要抓取某个模块内的全部cell,在ICC2里可以get_flat_cells xx/xx/module_name*,但…

Linux 基本语句_12_信号

用途: 信号可以直接进行用户进程与内核进程之间的交互 特性: 对于一个进程,其可以注册或者不注册信号,不注册的信号,进程接受后会按默认功能处理,对于注册后的信号,进程会按自定义处理 自定义…