STM32 中断系统
单片机学习
目录
文章目录
前言
一、中断系统
1.1 什么是中断
1.2 中断优先级
1.3 中断嵌套
1.4 C语言中的中断程序
二、STM32的中断通道和中断向量
2.1 中断通道
2.2 嵌套向量中断控制器NVIC
2.2.1 什么是NVIC
2.2.2 NVIC基本结构
2.2.3抢占优先级和响应优先级
2.2.4 NVIC的优先级分组
三、STM32 外部中断EXTI
3.1EXIT简介
3.2EXIT基本结构
3.3AFIO复用IO口
3.4EXIT框图
总结
前言
本文主要讲述STM32的中断系统和外部中断,中断系统是管理和执行中断的逻辑结构;外部中断是众多能产生中断的外设之一。
一、中断系统
- 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
- 中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
- 中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
1.1 什么是中断
当CPU正在执行某个程序时,由计算机内部或外部原因引起的紧急事件向CPU发出请求处理的信号,CPU在允许的情况下响应请求信号,暂时停止正在执行的程序,保护好断点处的现场,转向执行一个用于处理该紧急事件的程序,处理完成后又返回被终止的程序断点处,继续执行原程序,这一过程就是上图中中断响应和处理的过程。
1.2 中断优先级
1.中断优先级就是中断的紧急程度。
2.中断优先级是我们根据程序设计的需求,自己设置的。
3.中断优先级是为了在多个中断同时申请时,判断一下,应该先处理哪个。如果事件非常紧急,就把优先级设置高一些;如果事件不紧急,就把优先级设置低一些。这样可以更好的安排这些中断事件,防止紧急的事件被别的中断耽误。
1.3 中断嵌套
中断嵌套就是把中断程序再次中断的现象,中断嵌套也是为了处理非常紧急的中断。
如果在CPU已经在执行某个中断程序时,又发生了一个非常紧急的中断,那这个非常紧急的中断就可以把当前的中断程序进行二次中断。这样新的紧急中断就可以立即被执行了。等紧急的中断结束,再继续执行原来的中断。原来的中断结束再继续主程序
能否进行中断嵌套,是由中断优先级来决定的。
1.4 C语言中的中断程序
带有中断程序的代码示例:
int main(void)//主函数
{while(1){//主程序//……//主程序}
}void EXTI0_IRQHandler(void)
{//中断程序//……//中断程序
}
在主函数中,while(1) 死循环里就是主程序。正常情况下,程序就是在主程序里不断循环执行。当中断条件满足时,主程序就会暂停,自动跳转到中断程序里运行。中断程序执行完之后,再返回主程序继续执行。
一般中断程序都是在一个子函数里的,这个子函数不需要我们调用。当中断来临时,由硬件自动调用这个函数。
二、STM32的中断通道和中断向量
2.1 中断通道
中断通道就是中断源的意思。
可屏蔽中断通道包含EXTI外部中断、TIM定时器、ADC模数转换器、USART串口、SPI通信、I2C通信、RTC实时时钟等多个外设。
2.2 嵌套向量中断控制器NVIC
2.2.1 什么是NVIC
NVIC就是STM32中用来管理中断、分配优先级的。
使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
STM32F10xxx产品(小容量、中容量和大容量)的向量表
STM32内核中断:
STM32外设中断:
表中EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10是外部中断对应的中断资源。
表的最右边一列是中断对应的地址,这是因为程序中断函数的地址是由编译器来分配的,是不固定的。但是我们的中断跳转,由于硬件的限制,只能跳转到固定的地址执行程序。所以为了能让硬件跳转到一个不固定的中断函数里,这里就需要在内存中定义一个地址的列表。列表地址是固定的,中断发生后,就跳到这个固定的位置。然后在这个固定位置,由编译器再加上一条跳转到中断函数的代码,这样中断跳转就可以跳转到任意位置了。这个中断地址的列表就叫中断向量表,相当于中断跳转的一个跳板。
2.2.2 NVIC基本结构
NVIC的名字叫做嵌套中断向量控制器。在STM32中,它是用来统一分配中断优先级和管理中断的。NVIC是一个内核外设,是CPU的小助手,NVIC有很多输入口,有多少中断线路都可以接过来,比如图中可以接到EXTI、TIM、ADC、USART等。
图中线上画了个斜杠,上面写了n,意思是一个外设可能会同时占用多个中断通道,所以这里有n条线。NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序,之后通过右边这一个输出口告诉CPU,该处理哪个中断。对于中断先后分配的任务,CPU不需要知道。
2.2.3抢占优先级和响应优先级
1.抢占优先级:pre-emption priority (先占优先级)
抢占是指打断其他中断的属性,即低抢占优先级的中断A可以被高抢占优先级的中断B打断,执行完中断服务函数B后,再返回继续执行中断服务函数A,由此会出现中断嵌套。
2.响应优先级:subpriority(从占优先级)
响应属性应用在抢占属性相同的情况下,也就是当两个中断源的抢占优先级相同时,分以下几种情况处理:
- 如果两个中断同时到达,则中断控制器会优先处理响应优先级高的中断。
- 当一个中断到来后,如果正在处理另一个中断,则这个后到的中断就要等到前一个中断处理完之后才能被处理(高优先级的中断不可以打断低响应优先级的中断)。
- 如果他们的抢占优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。
2.2.4 NVIC的优先级分组
为了处理不同形式的优先级,STM32的NVIC可以对优先级进行分组,分为抢占优先级和响应优先级。
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队,中断号就是上文向量表中优先级那一列。数值小的优先响应。
STM32的中断不存在先来后到的排队方式,在任何时候,都是优先级高的先响应。
这个分组方式可选择,通过调用STM32固件库的函数NVIC_PriorityGroupConfig(); 来选择优先分组方式。选好分组方式之后,在配置优先级的时候要注意抢占优先级和响应优先级的取值范围。不要超出表里规定的取值范围。
三、STM32 外部中断EXTI
3.1EXIT简介
- EXTI(Extern Interrupt)外部中断
- EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
- 支持的触发方式:上升沿/下降沿/双边沿/软件触发
- 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(如PA0、PB0、PC0这样的端口GPIO_Pin一样的不能同时用,只能选1个作为中断引脚。若有多个中断引脚,要选择不同Pin的引脚,如PA6、PA7、PB9、PC0这样的。)
- 通道数:16个GPIO_Pin(对应GPIO_Pin_0到GPIO_Pin_15),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
- 触发响应方式:中断响应/事件响应
- 中断响应就是申请中断,让CPU执行中断函数。
- 事件响应是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常的流程时选择触发中断,但在STM32中也可以选择触发一个事件。如果选择触发事件,那外部中断的信号就不会通向CPU了,而是通向其他外设,用来触发其他外设的操作,如触发ADC转换、触发DMA等。
- 触发响应方式总结:中断响应是正常流程,引脚电平变化触发中断。事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作。
3.2EXIT基本结构
上图为外部中断的整体结构图。最左边是GPIO口的外设,比如GPIOA、GPIOB、GPIOC等等。每个GPIO外设有16个引脚,所以每个GPIO外设都进来16根线。
上文说到EXTI模块只有16个GPIO的通道,但每个GPIO外设都有16个引脚,如果每个引脚占用一个通道,那EXIT的16个通道显然就不够用了。所以在GPIO外设和EXIT中间会有一个AFIO中断引脚选择的电路模块。
AFIO就是一个数据选择器,它根据GPIO外设端口的引脚序号不同,把不同GPIO端口的同一个序号的引脚组成一组(如PA0、PB0、PC0、PD0、PE0、PF0、PG0为一组),每组对应一个通道连接到EXIT。所以上文说,相同的Pin不能同时触发中断,因为对于PA0、PB0、PC0这些相同的Pin,通过AFIO选择后,只有其中一个能接到EXIT的通道EXIT0上。这也就是所有的GPIO口都能触发中断,但相同的Pin不能同时触发中断的原因。
通过AFIO选择之后的16个通道,就接到了EXIT边沿检测及控制电路上。同时下方的PVD输出、RTC闹钟、USB唤醒、ETH以太网唤醒的外设也是并列接进来的。这些加起来就组成了EXIT的20个输入信号。
经过EXIT电路之后,分为了两种输出,其中上方的EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10、PVD、RTC、USB、ETH这些接到了NVIC,是用来触发中断的。下方有20条输出线路连接到了其他外设,用来触发其他外设操作的,就是事件响应。
这里注意,本来20路输入,应该有20路中断输出,但是为了节约NVIC的通道资源,把其中外部中断的9~5分配到一个通道EXTI9_5,中断的15~10也分配到一个通道EXTI15_10。也就是外部中断的9~5会触发同一个中断函数,外部中断的15~10也会触发同一个中断函数。在编程的时候,对这两个中断函数需要再根据标志位来区分是哪个中断进来的。
3.3AFIO复用IO口
- AFIO主要用于引脚复用功能的选择和重定义,也就是数据选择器的作用。
- 在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择
上图为AFIO选择中断引脚的结构图。
3.4EXIT框图
总结
以上就是今天要讲的内容,本文仅仅简单介绍了STM32的中断基础知识。
相关文章:

STM32 中断系统
单片机学习 目录 文章目录 前言 一、中断系统 1.1 什么是中断 1.2 中断优先级 1.3 中断嵌套 1.4 C语言中的中断程序 二、STM32的中断通道和中断向量 2.1 中断通道 2.2 嵌套向量中断控制器NVIC 2.2.1 什么是NVIC 2.2.2 NVIC基本结构 2.2.3抢占优先级和响应优先级 2.2.4 NVIC的优…...

电磁场信息论及先进MIMO (黄大年茶思屋座谈) 笔记
天线阵的负载动态调控,动态阻抗匹配网络,实时跟着扫描角度的变化而变化,可能突破Hannan极限。 新的天线构架: 周期 —》非周期 每个单元不一样 动态可调,可重构 每个天线多端口或多模式 多层天线 非周期结构天线的增…...

Arm64版本的centos编译muduo库遇到的问题的归纳
环境:Mac m2 pro下的VMware虚拟机中Arm64 centos ./build.sh 执行后提示如下 cmake -DCMAKE_BUILD_TYPErelease -DCMAKE_INSTALL_PREFIX…/release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDSON /root/package/muduo-master – Boost version: 1.69.0 – Co…...

leetcode:495. 提莫攻击
一、题目 链接:495. 提莫攻击 - 力扣(LeetCode) 函数原型:int findPoisonedDuration(int* timeSeries, int timeSeriesSize, int duration) 二、思路 遍历数组timeSeries,如果 元素值duration < 下一元素值 &#x…...

《微信小程序从入门到精通》---笔记1
小程序,我又来学习啦!请多关照~ 项目驱动 小程序开发建议使用flex布局在小程序中,页面渲染和业务逻辑是分开的,分别运行在不同的线程中。Mini Program于2017年1月7号正式上线小程序的有点:跨平台、开发门槛低、开发周…...

Python---函数定义时缺省参数(参数默认值)---放最右边
缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时 可 不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。 比如:原先的代码&#…...

深度学习之自监督模型汇总
1.BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding paper:https://arxiv.org/pdf/1810.04805v2.pdf code:GitHub - google-research/bert: TensorFlow code and pre-trained models for BERT Abstract:我们引入了一种名为 BE…...

竞赛 : 题目:基于深度学习的水果识别 设计 开题 技术
1 前言 Hi,大家好,这里是丹成学长,今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/pos…...

oracle的debjob挂載及查詢
背景 有一個需求需要定時去執行一個produce,可以使用oracle的dbjob定時執行,相比較之前的vbs更加絲滑 --傳遞produce 開始的時間 頻率 declarea number;beginDBMS_JOB.SUBMIT(a,xx_warehouse_daliy_record_p;,to_date(202311230800,yyyymmddhh24mi),…...

Pycharm创建项目新环境,安装Pytorch
在python项目中,很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...
assert断言
1.引入 assert.h 头⽂件定义了宏 assert() ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报错终⽌运⾏。这个宏常常被称为“断⾔”。 2.应用 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时,验证变量 p 是否等于 …...

我们对凌鲨的一次重构
在10月我们对凌鲨进行了一次重构,把所有鸡肋的功能都删除了。 新版本界面 老版本界面 我们干掉的功能 移除沟通频道功能 沟通频道类似slack功能,用于团队沟通。由于国内有大量的沟通软件,比如企业微信,飞书,钉钉等。…...

【JVM】一篇通关JVM垃圾回收
目录 1. 如何判断对象可以回收1-1. 引用计数法1-2. 可达性分析算法1-3. 四种引用强引用软引用弱引用虚引用终结器引用 2. 垃圾回收算法2-1. 标记清除2-2. 标记整理2-3. 复制2-4. 总结 3. 分代垃圾回收4. 垃圾回收器5. 垃圾回收调优 1. 如何判断对象可以回收 1-1. 引用计数法 …...

【小沐学写作】原型设计工具汇总(Axure RP)
文章目录 1、简介2、Axure RP2.1 工具简介2.2 工具特点2.2.1 互动事件2.2.2 条件逻辑2.2.4 工作表格2.2.5 多状态容器2.2.6 数据驱动接口2.2.7 自适应视图2.2.8 流程图 2.3 工具安装2.3.1 安装2.3.2 运行 2.4 使用费用2.5 工具体验2.5.1 登陆框制作 3、其他3.1 Figma3.2 Adobe …...

WebSocket 鉴权策略与技巧详解
WebSocket 作为实时通信的利器,越来越受到开发者的青睐。然而,为了确保通信的安全性和合法性,鉴权成为不可或缺的一环。本文将深入探讨 WebSocket 的鉴权机制,为你呈现一揽子的解决方案,确保你的 WebSocket 通信得心应…...
2022 年十大 JavaScript 框架
2022 年十大 Web 应用开发 JavaScript 框架。 React.js jQuery Express Angular Vue.js Angular.js Svelte Next.js Ember.js Meteor React.js React.js 于 2013 年由 Meta(Facebook 前身) 推出,是一款开源的、免费的 JavaScript 库。React.js 被用于开…...
Java中的线程池
目录 1、线程池的概念及其用途 2、Java中的线程池是如何创建和使用的 扩展:有哪些不同类型的线程池? 3、Java中线程池有哪些常见的应用场景? 4、线程池在Web应用中的使用情况 5、线程池如何管理多线程请求处理 1、线程池的概念及其用途…...

excel单元格加背景颜色不生效?
如果在 Excel 中设置单元格背景颜色而发现不生效,可能有几个原因。以下是一些常见的解决方法: 1. **单元格锁定:** 检查所在单元格是否被锁定。如果单元格被锁定,并且工作表被保护,你可能无法更改其背景颜色。在工作表…...

鸿蒙开发板——环境搭建(南派开发)
概述 为了帮大家理清楚鸿蒙开发的套路,我们从头再梳理一遍相关的脉络。并为大家总结一些重点性的内容。在介绍OpenHarmony特性前,需要大家先明确以下两个基本概念: 子系统 OpenHarmony整体遵从分层设计,从下向上依次为…...

【C++代码】链表
算法:搜索、查找、排序、双指针、回溯、分治、动态规划、贪心、位运算、数学等。 数据结构:数组、栈、队列、字符串、链表、树、图、堆、哈希表等。 数据结构是为实现对计算机数据有效使用的各种数据组织形式,服务于各类计算机操作。不同的…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...