IO 口作为外部中断输入

news2025/5/24 19:32:53

外部中断

  • 1. NVIC
  • 2. EXTI

1. NVIC

NVIC即嵌套向量中断控制器,它是内核的器件,M3/M4/M7 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些资源全部用完,如 STM32F407 的系统中断有 10 个(NVIC),外部中断有82 个(EXTI)
在这里插入图片描述

//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;
  • ISER[8]:中断使能寄存器组。用 8 个 32 位寄存器来控制,每个位控制一个中断。STM32F407 的可屏蔽中断最多只有 82 个,ISER[0]的 bit0~31 分别对应中断0~31;ISER[1]的 bit0~31 对应中断 32~63; ISER[2]的 bit0~16 对应中断 64~81。设置相应的 ISER 位为 1,使该中断被使能。

  • ICER[8]:中断除能寄存器组。用来清除某个中断的使能的,对应位的功能和 ISER 一样。写 1 有效的,写 0 是无效的。

  • ISPR[8]:中断使能挂起控制寄存器组。将正在进行的中断挂起,去执行同级或更高级别的中断,对应位的功能和 ISER 一样。写 1 有效的,写 0 是无效的。

  • ICPR[8]:中断解挂控制寄存器组。其作用与 ISPR 相反,将挂起的中断解挂。对应位的功能和 ISER 一样。写 1 有效的,写 0 是无效的。

  • IABR[8]:中断激活标志位寄存器组。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。对应位的功能和 ISER 一样,置 1,则表示该位所对应的中断正在被执行。在中断执行完了由硬件自动清零。

  • IP [240]:中断优先级控制的寄存器组。IP 寄存器组由 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,总共可以表示 240 个可屏蔽中断。而 STM32F407N只用到了其中的 82 个。IP[81] ~ IP[0] 分别对应中断 81~0。而每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高四位[7:4],低四位取零,致使最多只有 16 级中断嵌套。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。这两个优先级各占几个位由SCB->AIRCR中的中断分组设置决定。
    抢占优先级: 抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
    响应优先级: 抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
    抢占式优先级和响应优先级相同时,则遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
    在这里插入图片描述

  • STIR:只写属性,允许开发者通过向该寄存器写入目标中断的中断号(IRQn),直接触发对应的中断服务程序。一般使用场景为:
    调试与测试:模拟硬件中断事件,验证中断处理逻辑的正确性;
    系统调度:在实时操作系统中,通过软件中断实现任务切换(例如触发PendSV中断)

2. EXTI

EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
STM32F407 的中断控制器支持 22 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

EXTI 线 0~15对应外部 IO 口的输入中断
EXTI 线 16连接到 PVD 输出
EXTI 线 17连接到 RTC 闹钟事件
EXTI 线 18连接到 USB OTG FS 唤醒事件
EXTI 线 19连接到以太网唤醒事件
EXTI 线 20连接到 USB OTG HS(在 FS 中配置)唤醒事件
EXTI 线 21连接到 RTC 入侵和时间戳事件
EXTI 线 22连接到 RTC 唤醒事件

STM32F4 供 IO 口使用的中断线只有 16 个,但是 STM32F4 的 IO 口却远远不止 16 个,于是将 GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0、GPIOH.0、GPIOI.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。
在这里插入图片描述


在这里插入图片描述

EXTI 有两大部分功能,一条是由输入线到 NVIC 中断控制器(产生中断),一条是由输入线到脉冲发生器(产生事件),两者从硬件上就存在不同。

产生中断:最终信号流入 NVIC 控制器中,输入线可通过配置寄存器设置为任何一个 GPIO 口,或一些外设的事件。输入线一般都是存在电平变化的信号。

  • 标号① 是一个边沿检测电路,包括上升沿触发选择寄存器(EXTI_RTSR)和下降沿触发选择寄存器(EXTI_FTSR)。边沿检测电路以输入线作为信号输入端,如果检测到有边沿跳变就输出有效信号‘1’,否则输出无效信号‘0’。边沿跳变的标准在于开始的时候对于上升沿触发选择寄存器或下降沿触发选择寄存器对应位的设置。

  • 标号② 是一个或门电路,它的两个信号输入端分别是软件中断事件寄存器(EXTI_SWIER)和边沿检测电路的输出信号。或门电路只要输入端有信号‘1’,就会输出‘1’,即通过对软件中断事件寄存器的读写操作就可以启动中断/事件线。

  • 标号③ 是一个与门电路,它的两个信号输入端分别是中断屏蔽寄存器(EXTI_IMR)和标号②电路输出信号。与门电路要求输入都为‘1’才输出‘1’,如果中断屏蔽寄存器(EXTI_IMR)设置为‘0’时,不管从标号②电路输出的信号特性如何,最终标号③电路输出的信号都是‘0’;假如中断屏蔽寄存器(EXTI_IMR)设置为‘1’时,最终标号③电路输出的信号才由标号②电路输出信号决定,标号③电路输出‘1’就会把请求挂起寄存器(EXTI_PR)对应位置‘1’,这样子就可以简单控制 EXTI_IMR 来实现中断的目的。最后,请求挂起寄存器(EXTI_PR)的内容就输出到 NVIC 内,实现系统中断事件的控制。


产生事件:最终信号流入 NVIC 控制器中,输入线可通过配置寄存器设置为任何一个 GPIO 口,或一些外设的事件。输入线一般都是存在电平变化的信号。

  • 标号④ 是一个与门,它的两个信号输入端分别是事件屏蔽寄存器(EXTI_EMR)和标号②电路输出信号。如果 EXTI_EMR 寄存器设置为 0,那不管标号② 电路输出的信号是‘0’还是‘1’,最终标号④输出的都是‘0’;如果 EXTI_EMR 寄存器设置为 1,最终标号④电路输出信号就由标号②电路输出的信号决定,这样子就可以简单的控制 EXTI_EMR 来实现是否产生事件。标号④电路输出有效信号‘1’就会使脉冲发生器电路产生一个脉冲,而无效信号‘0’就不会使其产生脉冲信号。脉冲信号产生可以给其他外设电路使用,例如定时器,模拟数字转换器等,这样的脉冲信号一般用来触发 TIM 或者 ADC 开始转换。

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

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

相关文章

《MySQL基础:了解MySQL周边概念》

1.登录选项的认识 -h:指明登录部署了mysql服务的主机,默认为127.0.0.1-P:指明要访问的端口号,默认为3306-u:指明登录用户-p:指明登录密码 2.什么是数据库 2.1认识数据库 第一点理解。 mysql是数据库的客户…

RCL谐振电压增益曲线

谐振电路如何通过调频实现稳压&#xff1f; 为什么要做谐振&#xff1f; 在谐振状态实现ZVS导通&#xff0c;小电流关断 电压增益GVo/Vin&#xff0c;相当于产出投入比 当ff0时&#xff0c;G1时&#xff0c;输出电压输入电压 当G<1时&#xff0c;输出电压<输入电压 …

JavaScript:表单及正则表达式验证

今天我要介绍的是在JavaScript中关于表单验证内容的知识点介绍&#xff1a; 关于表单验证&#xff0c;我接下来则直接将内容以及效果显示出来并作注解&#xff0c;这样可以清晰看见这个表达验证的妙用&#xff1a; <form id"ff" action"https://www.baidu.…

一、Appium环境安装

找了一圈操作手机的工具或软件&#xff0c;踩了好多坑&#xff0c;最后决定用这个工具(影刀RPA手机用的也是这个)&#xff0c;目前最新的版本是v2.17.1&#xff0c;是基于nodejs环境的&#xff0c;有两种方式&#xff0c;我只试了第一种方式&#xff0c;第二种方式应该是比较简…

【c++深入系列】:new和delete运算符详解

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; “生活不会向你许诺什么&#xff0c;尤其不会向你许诺成功。它只会给你挣扎、痛苦和煎熬的过程。但只要你坚持下去&#xff0c;终有一天&…

正弦波有效值和平均值(学习笔记)

一个周期的正弦波在坐标轴上围的面积有多大&#xff1f; 一般正弦波以 y Asin(wx)表示&#xff0c;其中A为振幅&#xff0c;W为角速度。周期T 2π/w; 确定积分区间是x 0&#xff0c;到x 2π。 计算绝对值积分&#xff1a; 变量代还&#xff1a;wx θ&#xff0c;dx dθ…

第八天 开始Unity Shader的学习之Blinn-Phong光照模型

Unity Shader的学习笔记 第八天 开始Unity Shader的学习之Blinn-Phong光照模型 文章目录 Unity Shader的学习笔记前言一、Blinn-Phong光照模型①计算高光反射部分效果展示 二、召唤神龙:使用Unity内置的函数总结 前言 今天我们编写另一种高光反射的实现方法 – Blinn光照模型…

豆瓣图书数据采集与可视化分析

文章目录 一、适用题目二、豆瓣图书数据采集1. 图书分类采集2. 爬取不同分类的图书数据3. 各个分类数据整合 三、豆瓣图书数据清洗四、数据分析五、数据可视化1. 数据可视化大屏展示 源码获取看下方名片 一、适用题目 基于Python的豆瓣图书数据采集与分析基于Python的豆瓣图书…

常见的爬虫算法

1.base64加密 base64是什么 Base64编码&#xff0c;是由64个字符组成编码集&#xff1a;26个大写字母AZ&#xff0c;26个小写字母az&#xff0c;10个数字0~9&#xff0c;符号“”与符号“/”。Base64编码的基本思路是将原始数据的三个字节拆分转化为四个字节&#xff0c;然后…

YOLOV8 OBB 海思3516训练流程

YOLOV8 OBB 海思3516训练流程 目录 1、 下载带GPU版本的torch(可选) 1 2、 安装 ultralytics 2 3、 下载pycharm 社区版 2 4、安装pycharm 3 5、新建pycharm 工程 3 6、 添加conda 环境 4 7、 训练代码 5 9、配置Ymal 文件 6 10、修改网络结构 9 11、运行train.py 开始训练模…

[MySQL] 事务管理(二) 事务的隔离性底层

事务的隔离性底层 1.数据库并发的场景2.读-写2.1MVCC三个变量2.1.1 3个记录隐藏列字段2.1.2 undo日志 模拟MVCCselect 的读取2.1.3 Read View&#xff08;读视图&#xff09; 3.RR与RC的区别 1.数据库并发的场景 读-读&#xff1a;不存在问题&#xff0c;也不需要并发控制读-写…

20、.NET SDK概述

.NET SDK&#xff08;Software Development Kit&#xff09; 是微软提供的一套开发工具包&#xff0c;用于构建、运行和管理基于 .NET 平台的应用程序。它包含了一组丰富的工具、库和运行时环境&#xff0c;支持开发者在多种操作系统&#xff08;如 Windows、Linux 和 macOS&am…

18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建

学习视频资料来源&#xff1a;https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1. 架构设计2. 核心组件及调用关系3. 源码环境搭建3.1 测试类3.2 实体类3.3 核心配置文件3.4 映射配置文件3.5 遇到的问题 1. 架构设计 Mybatis整体架构分为4层&#xff1a; 接口层&#…

冒泡排序、插入排序、快速排序、堆排序、希尔排序、归并排序

目录 冒泡排序插入排序快速排序(未优化版本)快速排序(优化版本)堆排序希尔排序归并排序各排序时间消耗对比 冒泡排序 冒泡排序核心逻辑就是对数组从第一个位置开始进行遍历&#xff0c;如果发现该元素比下一个元素大&#xff0c;则交换位置&#xff0c;如果不大&#xff0c;就…

CD27.【C++ Dev】类和对象 (18)友元和内部类

目录 1.友元 友元函数 几个特点 友元类 格式 代码示例 2.内部类(了解即可) 计算有内部类的类的大小 分析 注意:内部类不能直接定义 内部类是外部类的友元类 3.练习 承接CD21.【C Dev】类和对象(12) 流插入运算符的重载文章 1.友元 友元函数 在CD21.【C Dev】类和…

QT安装详细步骤

下载 清华源 &#xff1a; 清华源 1. 2. 3. 4.

Unity游戏多语言工具包

由于一开始的代码没有考虑多语言场景&#xff0c;导致代码中提示框和UI显示直接用了中文&#xff0c;最近开始提取代码的中文&#xff0c;提取起来太麻烦&#xff0c;所以拓展了之前的多语言包&#xff0c;降低了操作复杂度。最后把工具代码提取出来到单独项目里面&#xff0c;…

实验三 I/O地址译码

一、实验目的 掌握I/O地址译码电路的工作原理。 二、实验电路 实验电路如图1所示&#xff0c;其中74LS74为D触发器&#xff0c;可直接使用实验台上数字电路实验区的D触发器&#xff0c;74LS138为地址译码器&#xff0c; Y0&#xff1a;280H&#xff5e;287H&…

视觉语言导航(VLN):连接语言、视觉与行动的桥梁

文章目录 1. 引言&#xff1a;什么是VLN及其重要性&#xff1f;2. VLN问题定义3. 核心挑战4. 基石&#xff1a;关键数据集与模拟器5. 评估指标6. 主要方法与技术演进6.1 前CLIP时代&#xff1a;奠定基础6.2 后CLIP时代&#xff1a;视觉与语言的统一 7. 最新进展与前沿趋势 (202…

计算机网络中科大 - 第7章 网络安全(详细解析)-以及案例

目录 &#x1f6e1;️ 第8章&#xff1a;网络安全&#xff08;Network Security&#xff09;优化整合笔记&#x1f4cc; 本章学习目标 一、网络安全概念二、加密技术&#xff08;Encryption&#xff09;1. 对称加密&#xff08;Symmetric Key&#xff09;2. 公钥加密&#xff0…