中断的硬件框架
往期内容
本专栏往期内容,interrtupr子系统:
- 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现
- Linux内核中IRQ Domain的结构、操作及映射机制详解
- 中断描述符irq_desc成员详解
- Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
pinctrl和gpio子系统专栏:
专栏地址:pinctrl和gpio子系统
编写虚拟的GPIO控制器的驱动程序:和pinctrl的交互使用
– 末片,有专栏内容观看顺序
input子系统专栏:
- 专栏地址:input子系统
- input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序
– 末片,有专栏内容观看顺序I2C子系统专栏:
- 专栏地址:IIC子系统
- 具体芯片的IIC控制器驱动程序分析:i2c-imx.c-CSDN博客
– 末篇,有专栏内容观看顺序总线和设备树专栏:
- 专栏地址:总线和设备树
- 设备树与 Linux 内核设备驱动模型的整合-CSDN博客
– 末篇,有专栏内容观看顺序

1.中断路径上的3个部件
● 中断源
-
中断源指引发中断信号的硬件模块,如GPIO、定时器、串口(UART)、DMA控制器等。这些模块都有各自的寄存器,可以设置中断相关的参数,例如:
- 使能中断:启用或禁用该模块的中断功能。
- 中断状态:检查该模块是否发生了中断。
- 中断类型:设置中断的触发条件,例如上升沿触发、下降沿触发或电平触发等。
-
中断源可以根据其设置的状态来决定是否向中断控制器发送中断请求信号。
● 中断控制器
-
中断控制器汇集所有中断源的信号,将其发送至CPU。中断控制器可以:
- 设置优先级:为不同的中断源设置优先级,以便在多重中断同时发生时,确定先响应哪个中断。当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源
- 向CPU发出中断信号:中断控制器根据优先级和屏蔽设置向CPU发送中断请求信号。CPU通过读取中断控制器寄存器来判断哪个中断源需要响应。
-
中断控制器的实现因芯片平台而异,例如:
- STM32F103 使用 NVIC(嵌套向量中断控制器)来处理中断。
- ARM9 平台中通常由芯片厂商设计的特定中断控制器。
- Cortex A7 采用 GIC(通用中断控制器),具有更加复杂的中断管理功能。
● CPU
- CPU会在每条指令执行后检查是否有中断请求。
- CPU内部的寄存器提供了中断的总开关,可以通过这些寄存器来使能或禁用中断,从而实现对中断响应的控制。

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

EXTI可以给NVIC提供16个中断信号:EXTI0~EXTI15。那么某个EXTIx,它来自哪些GPIO呢?这需要设置GPIO控制器。
2.1 GPIO控制器
STM32F103的GPIO控制器中有AFIO_EXTICR1~AFIO_EXTICR4一共4个寄存器
名为:External interrupt configuration register,外部中断配置寄存器。
用来选择某个外部中断EXTIx的中断源,示例如下:

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

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

沿着上面框图中的红线,我们要设置:
- 选择哪些GPIO可以发出中断(EXITmux)
- Falling trigger selection register:是否选择下降沿触发(EventTrigger)
- Rising trigger selection register:是否选择上升沿触发(EventTrigger)
- Interrupt mask register:是否屏蔽中断,允许某个EXTI中断(Masking)
当发生中断时,可以读取下列寄存器判断是否发生了中断、发生了哪个中断:
- Pending reqeust register
要使用EXTI,流程如下:

翻译如下:
- 配置EXTI_IMR:允许EXTI发出中断
- 配置EXTI_RTSR、EXTI_FTSR,选择中断触发方式
- 配置NVIC中的寄存器,允许NVIC把中断发给CPU
2.3 NVIC
多个中断源汇聚到NVIC,NVIC的职责就是从多个中断源中取出优先级最高的中断,向CPU发出中断信号。处理中断时,程序可以写NVIC的寄存器,清除中断。涉及的寄存器:

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

把PRIMASK的bit0设置为1,就可以屏蔽所有优先级可配置的中断。
可以使用这些指令来设置它:
CPSIE I ; 清除PRIMASK,使能中断
CPSID I ; 设置PRIMASK,禁止中断或者:
MOV R0, #1
MSR PRIMASK R0 ; 将1写入PRIMASK禁止所有中断MOV R0, #0
MSR PRIMASK, R0 ; 将0写入PRIMASK使能所有中断
2.4.2 FAULTMASK

FAULTMASK和PRIMASK很像,它更进一步,出来一般的中断外,把HardFault都禁止了。
只有NMI可以发生。
可以使用这些指令来设置它:
CPSIE F ; 清除FAULTMASK
CPSID F ; 设置FAULTMASK或者:
MOV R0, #1
MSR FAULTMASK R0 ; 将1写入FAULTMASK禁止中断MOV R0, #0
MSR FAULTMASK, R0 ; 将0写入FAULTMASK使能中断
2.4.3 BASEPRI

BASEPRI用来屏蔽这些中断:它们的优先级,其值大于或等于BASEPRI。
可以使用这些指令来设置它:
MOVS R0, #0x60
MSR BASEPRI, R0 ; 禁止优先级在0x60~0xFF间的中断MRS R0, BASEPRI ; 读取BASEPRIMOVS R0, #0
MSR BASEPRI, R0 ; 取消BASEPRI屏蔽
3.STM32MP157的GPIO中断
STM32MP157的GPIO中断在硬件上的框架,跟STM32F103是类似的。它们的中断控制器不一样,STM32MP157中使用的是GIC:

3.1 GPIO控制器
对于STM32MP157,除了把GPIO引脚配置为输入功能外,GPIO控制器里没有中断相关的寄存器。
3.2 EXTI
GPIO引脚可以向CPU发出中断信号,所有的GPIO引脚都可以吗?不是的,需要在EXTI控制器中设置、选择。GPIO引脚触发中断的方式是怎样的?高电平触发、低电平触发、上升沿触发、下降沿触发?这需要进一步设置。这些,都是在EXTI中配置,EXTI框图如下:
3.2.1 设置EXITmux
选择哪些GPIO可以发出中断。只有16个EXTI中断,从EXTI0~EXTI15;每个EXTIx中断只能从PAx、PBx、……中选择某个引脚,如下图所示:

注意:从上图可知,EXTI0只能从PA0、……中选择一个,这也意味着PA0、……中只有一个引脚可以用于中断。这跟其他芯片不一样,很多芯片的任一GPIO引脚都可以同时用于中断。
通过EXTI_EXTICR1等寄存器来设置EXTIx的中断源是哪个GPIO引脚,入下图所示:

3.2.2 设置Event Trigger
设置中断触发方式:

3.2.3 设置Masking
允许某个EXTI中断:

3.2.4 查看中断状态、清中断

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

可以使用以下汇编指令修改I位:
CPSIE I ; 清除I位,使能中断CPSID I ; 设置I位,禁止中断
4.IMX6ULL的GPIO中断
IMX6ULL的GPIO中断在硬件上的框架,跟STM32MP157是类似的。IMX6ULL中没有EXTI控制器,对GPIO的中断配置、控制(stm32MP157:EXIT设置EXITx的某一个引脚作为中断源,设置其中断的触发方式,设置EXITx能否中断 >>> 在GPIO控制器里配置中断引脚、中断引脚触发方式、使能GPIO中断),都在GPIO模块内部实现:


4.1 GPIO控制器
4.1.1 配置GPIO中断
每组GPIO中都有对应的GPIOx_ICR1、GPIOx_ICR2寄存器(interrupt configuration register )。每个引脚都可以配置为中断引脚,并配置它的触发方式:

4.1.2 使能GPIO中断

4.1.3 判断中断状态、清中断

4.2 GIC
ARM体系结构定义了通用中断控制器(GIC),该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。
4.3 CPU
CPU的CPSR寄存器中有一位:I位,用来使能/禁止中断。可以使用以下汇编指令修改I位:
CPSIE I ; 清除I位,使能中断CPSID I ; 设置I位,禁止中断
相关文章:
中断的硬件框架
往期内容 本专栏往期内容,interrtupr子系统: 深入解析Linux内核中断管理:从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…...
数据备份策略:企业防御的关键
数据备份是保护数据免受网络攻击的重要步骤。在从恶意软件或勒索软件攻击中恢复时,公司可以使用保存的备份将其恢复到之前的状态。但是,为了确保数据的完全安全,任何公司的备份策略都应该在其总体策略中包含多种解决方案。 根据关于创建、消…...
Baget 私有化nuget
Baget下载 1、下载运行 方法一:cmd运行 dotnet BaGet.dll --urls http://*:8002 http://localhost:8002 方法二:bat脚本运行Baget 创建Start.bat dotnet BaGet.dll --urls http://*:8002 运行Start.bat 方法三:部署成Window服务 NSSM部…...
前端函数的参数都有哪些?
在前端开发中,函数的分类可以根据不同的标准进行。以下是一些常见的函数分类方式,并附有相应的例子: 按传递方式分类: 按值传递:JavaScript 中的基本类型(如数字、字符串、布尔值)都是按值传递的…...
【CSS】什么是BFC?
块级格式化上下文(Block Formatting Context,简称BFC)是CSS布局中的一种重要概念,它决定了块级盒子如何在其容器内排列,以及浮动元素对其周围元素的影响。理解BFC可以帮助解决许多常见的网页布局问题,比如清…...
HCIP小型园区网拓扑实验
1.拓扑以及需求 2.需求分析 需要的核心技术 1、虚拟局域网(VLAN) 2、链路聚合(E-trunk) 3、多生成树协议(MSTP) 4、VLANIF三层逻辑接口 5、虚拟路由冗余协议(VRRP) 6、动态主…...
GRR测量系统的重复性和再现性
GRR(GaugeRepeatabilityandReproducibility)即测量系统的重复性和再现性,是用于评估测量系统性能的一个重要指标。以下是对GRR的详细解释: 一、定义 • 重复性(Repeatability):在相同条件下&…...
133.鸿蒙基础01
鸿蒙基础 1.自定义构建函数1. 构建函数-[Builder ](/Builder )2. 构建函数-传参传递(单向)3. 构建函数-传递参数(双向)4. 构建函数-传递参数练习5. 构建函数-[BuilderParam ](/BuilderParam ) 传递UI 2.组件状态共享1. 状态共享-父子单向2. 状态共享-父子双向3. 状态共享-后代组…...
科技查新小知识
首先科技查新是什么? 科技查新是文献检索和情报调研相结合的情报研究工作,它以文献为基础,以文献检索和情报调研为手段,以检出结果为依据,通过综合分析,对查新项目的新颖性进行情报学审查,写出有…...
docker安装portainer
1、拉取镜像 docker pull portainer/portainer-ce:latest2、执行 docker run -d --restartalways --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data -v /data/portainer/public:/public portainer/portain…...
【Word2Vec】传统词嵌入矩阵训练方法
目录 1. Word2Vec 简介2. Word2Vec 的训练方法2.1 Skip-Gram模型2.2 CBOW(Continuous Bag of Words)模型 3. Word2Vec 中的词嵌入表示4. 训练过程中是否使用独热编码? 1. Word2Vec 简介 Word2Vec 是一种词嵌入模型,主要通过无监督…...
电脑不显示wifi列表怎么办?电脑不显示WiF列表的解决办法
有用户会遇到电脑总是不显示wifi列表的问题,但是不知道要怎么解决。随着无线网络的普及和使用,电脑无法显示WiFi列表的问题有时会让人感到困扰。电脑不显示WiFi列表是很常见的问题,但这并不意味着你无法连接到网络。不用担心,这个…...
详解 Dockerfile:从入门到实践
Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖包打包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。Dockerfile 是一个文本文件,其中包含了一系列命令,用…...
随机变量的概率分布
第 5 章——概率分布 5.2 随机变量的概率分布 【例5-1】 计算期望值、方差、标准差 【代码框5-1】 计算期望值、方差、标准差 import pandas as pd import numpy as np example5_1 = pd.read_csv(./pydata/example/chap05/example5_1.csv)# 计算期望值 mymean = sum...
Kafka生产者如何提高吞吐量?
批量发送:生产者可以配置 batch.size 参数,将多个消息打包成一个批次发送。这样可以减少网络通信的次数,提高吞吐量。inger.ms:设置 linger.ms 参数,可以让生产者在发送消息前等待一段时间,以便收集更多的消…...
mysql:解决windows启动失败无报错(或长时间未响应)
前言 遇到好多次在修改配置文件后,mysql无法启动的问题了,这里给出一个可能原因的解决方案。 由于mysql需要修改配置文件,所以我在winserver2012服务器上更改了配置文件my.ini mysql5.7配置文件默认地址:C:\ProgramData\MySQL\MyS…...
【山——回文判断】
题目 代码 #include <bits/stdc.h> using namespace std; bool check(int num) {string s to_string(num);int l 0, r s.size() - 1;while (l < r){if (l && s[l] - s[l - 1] < 0)return false;if (s[l] ! s[r--])return false;}if (l && l r…...
FPGA学习笔记#7 Vitis HLS 数组优化和函数优化
本笔记使用的Vitis HLS版本为2022.2,在windows11下运行,仿真part为xcku15p_CIV-ffva1156-2LV-e,主要根据教程:跟Xilinx SAE 学HLS系列视频讲座-高亚军进行学习 学习笔记:《FPGA学习笔记》索引 FPGA学习笔记#1 HLS简介及…...
欧几里得算法python
一、问题描述 求最大公约数 class Fraction:def __init__(self, a, b):self.a aself.b bx self.gcd(a, b)self.a / xself.b / xdef gcd(self, a, b):while b >0:r a % ba bb rreturn adef zgs(self, a, b):x self.gcd(a, b)return a / x * bdef __add__(self, other…...
【layui】echart的简单使用
图表类型切换(柱形图和折线图相互切换) <title>会员数据</title><div class"layui-card layadmin-header"><div class"layui-breadcrumb" lay-filter"breadcrumb"><a lay-href""&g…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
