中断的硬件框架

今天呢,我们来讲讲中断的硬件框架,这里会去举3个开发板,去了解中断的硬件框架:

中断路径上的3个部件:
 

  • 中断源 中断源多种多样,比如GPIO、定时器、UART、DMA等等。 它们都有自己的寄存器,可以进行相关设置:使能中断、中断状态、中断类型等等。

  • 中断控制器 各种中断源发出的中断信号,汇聚到中断控制器。 可以在中断控制器中设置各个中断的优先级。 中断控制器会向CPU发出中断信号,CPU可以读取中断控制器的寄存器,判断当前处理的是哪个中断。 中断控制器有多种实现,比如:

    • STM32F103中被称为NVIC:Nested vectored interrupt controller(嵌套向量中断控制器)

    • ARM9中一般是芯片厂家自己实现的,没有统一标准

    • Cortex A7中使用GIC(Generic Interrupt Controller)

  • CPU CPU每执行完一条指令,都会判断一下是否有中断发生了。 CPU也有自己的寄存器,可以设置它来使能/禁止中断,这是中断处理的总开关。

STM32F103的GPIO中断:

对于GPIO中断,STM32F103又引入了External interrupt/event controller (EXTI)。 用来设置GPIO的中断类型,如下图:

EXTI可以给NVIC提供16个中断信号:EXTI0~EXTI15。 那么某个EXTIx,它来自哪些GPIO呢?这需要设置GPIO控制器。

我们从这里可以发现,f103的话,专门为GPIO提供了一个外部中断控制器EXTI,通过EXTI向NVIC发送中断信息,而其他外设,例如串口这些,是可以直接给NVIC发送中断信息的

GPIO控制器:


STM32F103的GPIO控制器中有AFIO_EXTICR1~AFIO_EXTICR4一共4个寄存器 名为:External interrupt configuration register,外部中断配置寄存器。 用来选择某个外部中断EXTIx的中断源,示例如下:

注意:从上图可知,EXTI0只能从PA0、……、PG0中选择一个,这也意味着PA0、……、PG0中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。 说实话,这点还挺坑的

EXTI:

在GPIO控制器中,可以设置某个GPIO引脚作为中断源,给EXTI提供中断信号。 但是,这个中断的触发方式是怎么的?高电平触发、低电平触发、上升沿触发、下降沿触发? 这需要进一步设置。 EXTI框图如下:

沿着上面框图中的红线,我们要设置:

  • Falling trigger selection register:是否选择下降沿触发

  • Rising trigger selection register:是否选择上升沿触发

  • Interrupt mask register:是否屏蔽中断

当发生中断时,可以读取下列寄存器判断是否发生了中断、发生了哪个中断:

  • Pending reqeust register

要使用EXTI,流程如下:

翻译如下:

  • 配置EXTI_IMR:允许EXTI发出中断

  • 配置EXTI_RTSR、EXTI_FTSR,选择中断触发方式

  • 配置NVIC中的寄存器,允许NVIC把中断发给CPU

NVIC:

多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。 处理中断时,程序可以写NVIC的寄存器,清除中断。 涉及的寄存器:

我们暂时只需要关注:ISER(中断设置使能寄存器)、ICPR(中断清除挂起寄存器)。 要注意的是,这些寄存器有很多个,比如ISER0、ISER1等等。里面的每一位对应一个中断。 ISER0中的bit0对应异常向量表中的第16项(向量表从第0项开始),如下图:

STM32MP157的GPIO中断:

STM32MP157的GPIO中断在硬件上的框架,跟STM32F103是类似的。 它们的中断控制器不一样,STM32MP157中使用的是GIC:

GPIO控制器:

对于STM32MP157,除了把GPIO引脚配置为输入功能外,GPIO控制器里没有中断相关的寄存器。 请参考前面的课程《01_使用按键控制LED(STM32MP157)》。

EXTI:


PIO引脚可以向CPU发出中断信号,所有的GPIO引脚都可以吗? 不是的,需要在EXTI控制器中设置、选择。 GPIO引脚触发中断的方式是怎样的?高电平触发、低电平触发、上升沿触发、下降沿触发? 这需要进一步设置。 这些,都是在EXTI中配置,EXTI框图如下:

1. 设置EXTImux

选择哪些GPIO可以发出中断。 只有16个EXTI中断,从EXTI0~EXTI15;每个EXTIx中断只能从PAx、PBx、……中选择某个引脚,如下图所示:

注意:从上图可知,EXTI0只能从PA0、……中选择一个,这也意味着PA0、……中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。

通过EXTI_EXTICR1等寄存器来设置EXTIx的中断源是哪个GPIO引脚,入下图所示:

2. 设置Event Trigger

设置中断触发方式:

3. 设置Masking

允许某个EXTI中断:

GIC:

ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。

GIC比较复杂,下一个视频再详细讲解。

 

先大概讲一下,因为重点其实不是这个,下一篇我们来讲讲GIC,完结,撒花(doge.)

 

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

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

相关文章

动手学深度学习:手语视频在VGG模型中的测试

前言 其他所有部分同上一篇AlexNet一样,所以就不再赘诉,直接看VGG搭建部分。 模型 VGG是第一个采取块进行模块化搭建的模型。 def vgg_block(num_convs,in_channels,out_channels):layers[]for _ in range(num_convs):layers.append(nn.Conv2d(in_ch…

信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G

【题目链接】 ybt 1498:Roadblocks 洛谷 P2865 [USACO06NOV] Roadblocks G 【题目考点】 1. 图论:严格次短路径 严格次短路的路径长度必须大于最短路的路径长度。 非严格次短路的路径长度大于等于最短路的路径长度。 【解题思路】 每个交叉路口是一…

Arm CPU安全通告:基于TrustZone的Cortex-M系统面临多重故障注入攻击

安全之安全(security)博客目录导读 目录 一、概述 二、致谢 三、参考文献​​​​​​Black Hat USA 2022 | Briefings Schedule 四、版本历史 一、概述 Arm注意到BlackHat 2022大会官网发布的演讲摘要《糟糕..!我又一次故障注入成功了!——如何突…

【频域分析】包络分析

【频域分析】包络分析 算法配置页面 可以一键导出结果数据 报表自定义绘制 获取和下载【PHM学习软件PHM源码】的方式 获取方式:Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

ElMessage

以下是关于 ElMessage 的详细说明和使用方法: 什么是 ElMessage ElMessage 是 Element Plus 提供的一个全局消息提示组件,用于在页面上显示短暂的消息提示。它可以用于显示成功、警告、错误等不同类型的消息。 基本用法 1. 引入 ElMessage 在使用 E…

全面解析 KaiwuDB 数据库的数据类型

在现代数据库管理系统中,数据类型的选择至关重要。它不仅决定了数据存储的效率,还影响到查询的速度和数据的一致性。KaiwuDB,作为一款开源的分布式数据库,提供了多种数据类型,以适应不同的业务需求和存储要求。本文将全…

【计网】网络交换技术之分组交换(复习自用,重要1)

复习自用的,处理得比较草率,复习的同学或者想看基础的同学可以看看,大佬的话可以不用浪费时间在我的水文上了 另外两种交换技术可以直接点击链接访问相关笔记: 电路交换 报文交换 一、分组交换的定义 1.定义 分组交换&#x…

C++ STL及Python中等效实现

一. STL 概述 STL 包含以下核心组件: 容器(Containers):存储数据的结构,如数组、链表、集合等。迭代器(Iterators):用于遍历容器的接口,类似指针。算法(Alg…

python-63-前后端分离之图书管理系统的Flask后端

文章目录 1 flask后端1.1 数据库实例extension.py1.2 数据模型models.py1.3 .flaskenv1.4 app.py1.5 运行1.6 测试链接2 关键函数和文件2.1 请求视图类MethodView2.2 .flaskenv文件3 参考附录基于flask形成了图书管理系统的后端,同时对其中使用到的关键文件.flaskenv和函数类M…

蓝桥杯真题——好数、R格式

目录 蓝桥杯2024年第十五届省赛真题-好数 【模拟题】 题目描述 输入格式 输出格式 样例输入 样例输出 提示 代码1:有两个案例过不了,超时 蓝桥杯2024年第十五届省赛真题-R 格式 【vector容器的使用】 题目描述 输入格式 输出格式 样例输入…

Python中NumPy的索引和切片

在数据科学和科学计算领域,NumPy是一个功能强大且广泛使用的Python库。它提供了高效的多维数组对象以及丰富的数组操作函数,其中索引和切片是NumPy的核心功能之一。通过灵活运用索引和切片操作,我们可以轻松访问和操作数组中的元素&#xff0…

设计模式:策略模式 - 消除复杂条件判断的利器

一、什么是策略模式? 策略模式(Strategy Pattern)是一种行为型设计模式,它将一组算法或业务逻辑封装为独立的策略类,使这些策略可以互换使用,并通过上下文类动态选择合适的策略。 核心思想 • 将不同的行…

LeetCode hot 100—不同路径

题目 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? …

pytorch查询字典、列表维度

输出tensor变量维度 print(a.shape)输出字典维度 for key, value in output_dict.items():if isinstance(value, torch.Tensor):print(f"{key} shape:", value.shape)输出列表维度 def get_list_dimensions(lst):# 基线条件:如果lst不是列表&#xff0…

多坐标系变换全解析:从相机到WGS-84的空间坐标系详解

多坐标系变换全解析:从相机到WGS-84的空间坐标系详解 一、常见坐标系简介二、各坐标系的功能和使用场景1. WGS-84 大地坐标系(经纬高)2. 地心直角坐标系(ECEF)3. 本地 ENU / NED 坐标系4. 平台坐标系(Body)5. 相机坐标系三、坐标变换流程图四、如何选用合适的坐标系?五…

【NumPy科学计算:高性能数组操作核心指南】

目录 前言:技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解关键技术模块技术选型对比 二、实战演示环境配置要求核心代码实现运行结果验证 三、性能对比测试方法论量化数据对比结果分析 四、最佳实践推荐方案 ✅常见错误 ❌调试技…

【特权FPGA】之PS/2键盘解码

0 故事背景 见过这种接口的朋友们,大概都已经成家立业了吧。不过今天我们不讨论这种接口的历史,只讲讲这种接口的设计。(如果还没有成家的朋友也别生气,做自己想做的事情就对了!) 1 时序分析 数据帧格式如图…

DAPP实战篇:使用web3.js实现前端输入钱包地址查询该地址的USDT余额—操作篇

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读396次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。后续也会在此规划一下后续内容,因此如果遇到不能点击的,代表还没有更新。声明:文中所出观点大多数源于笔者多年开发经验所总结,如果你想要知道区块…

高中生学习数据隐私保护的“技术-制度-文化”协同机制研究

一、引言 1.1 研究背景与意义 在数字化时代的浪潮下,教育领域正经历着深刻的变革,智能教育平台如雨后春笋般涌现,为高中教育带来了新的活力与机遇。这些平台借助先进的信息技术,能够实时收集、分析大量的高中生学习数据&#xf…

【Java多线程】告别线程混乱!深度解析Java多线程4大实现方式(附实战案例)

一、继承Thread类 实现步骤&#xff1a; 1.继承Thread类 2.重写run()方法 3.创建线程对象并调用start()方法 示例&#xff1a; class MyThread extends Thread {Overridepublic void run() {for (int i 0; i < 5; i) {System.out.println(Thread.currentThread().getNam…