当前位置: 首页 > news >正文

STM32中断系统

目录

一、中断的基本概念

二、NVIC

1.NVIC的概念

2、NVIC的组成

3、NVIC的应用

4.NVIC的结构

三、外部中断EXTI

1.外部中断的概念

2.EXTI基本结构

四、EXTI外部中断的配置流程

1.开启APB2中的GPIO口/AFIO时钟

2.GPIO配置成输入模式

3.AFIO选择中断引脚

4.EXTI初始化

5.NVIC配置

6.中断服务函数


一、中断的基本概念

        在STM32中,中断系统是一种非常强大的功能,他允许CPU在执行代码的时候,暂停当前任务,然后转而执行特定的中断服务函数(ISR),处理完成后,再返回主函数中继续执行原来的代码。这种机制使得STM32能够高效的相应外部事件和内部状态变化,无需不断的轮询检测,从而大大提高了CPU的利用率。

        中断是一种异步事件的处理机制,他打破了当前程序的执行流程。当中断发生时,当前任务会被中断,保存上下文(如寄存器的值,堆栈的指针等),然后跳转到中断向量表中找到对应的中断服务函数(ISR),去处理中断事件,处理完毕后,CPU会恢复原来的上下文,继续执行以前的任务。

        STM32中内置了灵活且功能强大的中断寄存器(NVIC,Nested Vectored Interrupt Controller),他负责管理和分配中断(IQR)请求的优先级,处理程序的执行顺序,以及中断处理过程的调度。每一个中断源都有一个特定的中断号(IQRn),并通过中断向量表和相对应的ISR关联起来。

        STM32中包含了68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级

下图是中断向量表

        中断向量表是计算机系统中一个重要的组成部分,它用于存放中断向量,即中断类型号与对应的中断服务程序入口地址之间的映射关系。由于硬件原因CPU只能从某些特定的地址处访问中断函数,即只能从中断向量表中的地址去访问。我们写的中断服务函数,其名称和入口地址通常会在链接时被放置在中断向量表的相应位置。这样,当中断发生时,CPU就能根据中断向量表找到并跳转到我们编写的中断服务函数执行。

二、NVIC

1.NVIC的概念

        NVIC(Nested Vectored Interrupt Controller)是STM32微控制器中的中断控制器,它负责管理和处理微控制器的中断。(即相当于CPU的中断助手,帮助CPU来管理中断)NVIC提供了灵活、高效、可扩展的中断处理机制,支持多级优先级、多向中断、嵌套向量中断等特性。其主要功能包括:

  1. 中断向量表:存储所有中断的服务程序地址,当中断发生时,CPU会根据中断向量表跳转到对应的中断服务程序执行。
  2. 中断优先级管理:允许为不同中断分配不同的优先级,以控制中断的响应顺序。NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。抢占优先级高的中断可以打断低优先级的中断,实现中断嵌套。响应优先级高的中断在相同抢占优先级下可以优先排队。
  3. 中断使能和禁用:可以启用或禁用特定的中断,以便根据系统需求灵活控制中断的响应。
  4. 中断触发方式:支持多种中断触发方式,如上升沿、下降沿等,以满足不同中断源的需求。

2、NVIC的组成

NVIC由以下几个部分组成:

  1. 中断优先级和控制器:负责中断的挂起、解挂和优先级管理。
  2. 向量表:存储每个中断源对应的中断处理程序的入口地址。
  3. 系统控制寄存器:提供了对NVIC中断控制器的配置和控制。
  4. 特殊功能寄存器:NVIC中断控制器对外暴露的寄存器,用于实现对中断处理的控制,包括中断使能、中断标志、中断状态等。

3、NVIC的应用

NVIC在STM32中的应用非常广泛,主要包括以下几个方面:

  1. 中断优先级设置:用户可以根据不同的需求对中断优先级进行设置,以实现对中断的响应和处理。这有助于确保系统在有多个中断发生时能够高效地处理优先级较高的中断事件。
  2. 中断嵌套处理:NVIC支持中断嵌套处理,即高优先级的中断可以打断低优先级的中断。这有助于系统在处理紧急中断事件时能够迅速响应并处理。
  3. 低功耗模式下的中断管理:当CPU处于低功耗模式时,NVIC提供了挂起和解挂中断的机制,可以根据不同需求设置相应的中断使能和关闭。这有助于降低系统的功耗并延长电池寿命。
  4. 中断标志复位:NVIC提供了中断标志复位功能,可以清除某个中断事件的标志位。这在中断处理过后需要清除标志位的情况下尤为重要,以确保系统能够正确识别和处理后续的中断事件

4.NVIC的结构

        每一个中断都要被NVIC管理起来,所以一旦就中断产生,都要经过NVIC来确认优先级,才能被NVIC递交给CPU。

三、外部中断EXTI

1.外部中断的概念

        对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成,对于其它产品,则有19个能产生事件/中断请求的边沿检测器。每个输入线可以独立地配置输入类型(脉冲
或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏
蔽。挂起寄存器保持着状态线的中断请求。

        EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序 支持的触发方式:上升沿/下降沿/双边沿/软件触发 支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断 通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒 触发响应方式:中断响应/事件响应

2.EXTI基本结构

        从下图中可以看到,在初始化中,首先会通过APIO进行引脚选择,然后由AFIO将选择的引脚传递给EXTI进行边沿检测和控制。这时EXTI就开始检测被选择的引脚了,当中断来临的时候,EXTI就看看是哪一路中断发生了,然后通过对应的EXTI信道传递给NVIC。NVIC再来对中断进行管理:如果同时有多个中断来临,则判断优先级递交给CPU;如果来了优先级更高的中断,则进行中断嵌套等等。

下面的图片是AFIO的示意图。

        AFIO就是一个选择器,当我们软件选择了某个引脚作为EXTI的时候,则AFIO会把这个引脚对应的线路连接到EXTIX上,从而实现后面的过程。但是从下面的图中可以看到,当Pin脚号相同的时候,只能有一个Pin脚被选中(即不能有同样的Pin脚作为EXTI)

四、EXTI外部中断的配置流程

配置STM32的中断系统通常需要经过以下几个步骤:

  1. 启用外设时钟:要启用与中断相关的外设(如GPIO、定时器等),首先需要为这些外设启用时钟。

  2. 配置外设为中断模式:根据中断源的类型,配置相应的外设为中断模式。例如,对于外部中断,需要配置对应的GPIO引脚为中断输入模式,并设置触发方式(如上升沿触发、下降沿触发或双边沿触发)。

  3. 配置NVIC:通过NVIC设置中断的优先级,并启用对应的中断。STM32的NVIC支持中断优先级的配置,可以通过相关函数设置中断的抢占优先级和子优先级。优先级较高的中断可以中断正在执行的低优先级中断处理程序。

  4. 编写ISR:为每个中断源编写相应的ISR(中断服务程序)。ISR是实际处理中断事件的函数,需要按照固定的函数原型编写。在ISR中,应首先检查中断发生标志,然后执行相应的中断处理逻辑,最后清除中断标志以准备下一次中断。

  5. 使能中断:确保在主函数中启用了外部中断并进入主循环。在主循环中,可以执行其他任务,等待中断的发生。

1.开启APB2中的GPIO口/AFIO时钟

        按道理来说是需要开启NVIC和EXTI的时钟的,但是这两个时钟是由内部提供,无需我们手动开启,默认一直都是打开的状态,而且标准库中也没有相关的库函数

2.GPIO配置成输入模式

        因为要检测外部中断,GPIO配置成输入模式是必然的

3.AFIO选择中断引脚

        在这个函数中选择要对哪一个GPIO的哪一个Pin脚选中

4.EXTI初始化

初始化的结构体

结构体中的内容填充

5.NVIC配置

NVIC中断分组

注意在STM32的系统代码中,NVIC中断分组通常只设置一次,并且一旦设置后就不再更改。这是因为随意改变分组会导致中断管理混乱,程序可能出现意想不到的执行结果。因此,在系统初始化时,会根据需要选择一个合适的分组配置,并在整个系统运行过程中保持不变。

中断优先级的设置

        

用来初始化的结构体

NVIC_IRQChannel(中断请求信道)的定义

如此一来,EXTI外部中断的所有初始化配置就已经完成了,我们还需要一个中断服务函数

6.中断服务函数

        中断服务函数与其他的函数不同,他被定义在启动文件Start_up_stm32f10x_md.s中,我们找的时候一定不要找到EXTI文件中了,否则是怎么样都找不到的。

        在51单片机中,我们使用interrupt X的形式来定义中断服务函数的,在STM32中,中断服务函数的名字被限制死了,必须是中断向量表其中的名字。

中断向量表

        在中断处理函数中,值得注意的一点是,为了节约资源,EXTI的10-15和5-9号中断函数都用的是一个相同的函数名,这使得我们在中断服务函数中必须要检测是哪个信道产生的中断,再来决定下一步的执行逻辑。此外,还需要我们手动清除中断标志位。

检测是哪一个中断信道产生的中断(检测中断挂起标志位)

清除中断挂起标志位

完整的中断服务函数就如下面这样

相关文章:

STM32中断系统

目录 一、中断的基本概念 二、NVIC 1.NVIC的概念 2、NVIC的组成 3、NVIC的应用 4.NVIC的结构 三、外部中断EXTI 1.外部中断的概念 2.EXTI基本结构 四、EXTI外部中断的配置流程 1.开启APB2中的GPIO口/AFIO时钟 2.GPIO配置成输入模式 3.AFIO选择中断引脚 4.EXTI初始…...

window的Anaconda Powershell Prompt 里使用linux 命令

在 Windows 的 Anaconda Powershell Prompt 中使用 Linux 命令,可以通过以下几种方法来实现: 1. 使用 Git Bash 安装 Git for Windows 后,它会包含 Git Bash,允许在 Windows 上使用许多 Linux 命令。 步骤: 安装 Gi…...

Lisp 语言入门教程(一)

Lisp(“LISt Processing”)是一种古老而强大的编程语言,特别适合处理符号数据和列表。Lisp 是一种以括号和递归见长的语言,它启发了许多编程范式。以下是一个基础教程,帮助你快速了解 Lisp 的基本语法和功能。 1. 认识…...

Git - Think in Git

记录一些使用Git时的一些想法 区的概念 当 clone 仓库代码到本地后四个区相同 当编辑代码后,工作区 与其余三个区不同 当使用 add 将修改的代码暂存后,索引区与 工作区 相同 当使用 commit 将修改的代码提交后,仓库区 与 索引区 和 工作区 相…...

jmeter常用配置元件介绍总结之用linux服务器压测

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之用linux服务器压测 1.编写测试脚本2.执行测试脚本 1.编写测试脚本 在linux服务器上进行压测,由于是没有界面的,因此我们可以先在界面上把压测脚本写好: 如图:我这里简单的写…...

VL210-Q4 适用于USB延长线 扩展坞

VL210芯片技术文档 一、概述 VL210是一款由VIA Technologies(威盛电子)生产的第四代先进USB 3.0 Hub控制器。它集成了多种先进技术和功能,适用于各种USB集线器应用,如独立的USB集线器、笔记本/Ultrabook停靠点/port-replicators…...

怎么样绑定域名到AWS(亚马逊云)服务器

1,拿着你买的域名去亚马逊申请一个证书。申请证书分两种,一种是去亚马逊后台填域名手动申请 ,另一种是通过API来申请,类似如下代码: 2、证验证书。有两种方式:一种是通过邮件,另一种去到域名提供…...

Clickhouse集群新建用户、授权以及remote权限问题

新建用户 create user if not exists user on cluster 集群名称 IDENTIFIED WITH plaintext_password BY 密码;给用户授查询、建表、删表的权限 GRANT create table,select,drop table ON 数据库实例.* TO user on cluster 集群名称 ;在其他节点下用户建本地表成功&#…...

OPENCV 检测直线[opencv--3]

opencv中集成了很多好用的函数,比如霍夫变换检测直线的函数,当然,考虑到看我文章的人水平,我这里只讲讲如何使用这个函数,和怎么调节其中的参数 先把运行效果PO出来吧 #include "CV_ERROR.h" #include &q…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.2:avpacket中包含多个 NALU如何解析头部分析

前提: 注意的是:我们这里是从avframe转换成avpacket 后,从avpacket中查看NALU。 在实际开发中,我们有可能是从摄像头中拿到 RGB 或者 PCM,然后将pcm打包成avframe,然后将avframe转换成avpacket&#xff0…...

【MATLAB】目标检测初探

文章目录 0 前言1 目标检测概述2 算法实践2.1 YOLO v22.2 YOLO v3 3 项目实践3.1 项目背景和数据集3.2 实践结果3.3 算法对比 4 工具箱与数据标注5 总结 0 前言 之前因为项目原因,做了一个基于YOLOv5实现目标检测的程序,是基于Python做的,直接…...

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者(无灰度)…...

厘清标准差和标准误:因果推断的统计学基础

标准差,指 一次抽样中 个体取值间的离散程度,反映了 个体取值对样本均值的代表性。 标准误,指 多次抽样中 样本均值间的离散程度,反映了 样本均值对总体均值的代表性。 公众号原文-厘清标准差和标准误:因果推断的统计…...

GESP4级考试语法知识(贪心算法(二))

排队接水2代码&#xff1a; #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct people {int num;int time; }; people s[1001]; int n,r,a[1001]; double sum,ave; bool cmp(people x,people y) {return x.time<y.t…...

MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量

命令在命令窗口输入变量在工作区显示 MATLAB 桌面包含的面板如下&#xff1a; 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域&#xff0c;用户在命令行中输入命令&#xff0c;命令提示符(>>).工作区 - 工作区显示所有变量&#xff0c;无论是创…...

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表&#xff08;中等&#xff09; 8.12从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 8.13路径总和III&#xff08;中等&#xff09; 8.14二叉树的最近公共祖先&#xff08;中等&#xff09; 8.15二叉树中的最大路径和&#xff08;困…...

uniapp h5实现录音

使用npm安装 npm install recorder-core引入Recorder库 可以使用import、require、html script等你适合的方式来引入js文件&#xff0c;下面的以import为主要参考&#xff0c;其他引入方式根据文件路径自行调整一下就可以了。 //必须引入的Recorder核心&#xff08;文件路径是…...

字节跳动Android面试题汇总及参考答案(80+面试题,持续更新)

Android 四大组件是什么? Android 四大组件分别是 Activity、Service、Broadcast Receiver 和 Content Provider。 Activity 是 Android 应用中最基本的组件,用于实现用户界面。它可以包含各种视图控件,如按钮、文本框等。一个 Activity 通常对应一个屏幕的内容。用户可以通…...

【go从零单排】通道select、通道timeout、Non-Blocking Channel Operations非阻塞通道操作

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 select 语句是 Go 的一种控制结构&#xff0c;用于等待多个通道操作。它类似于 s…...

PSRR仿真笔记

1.首先打开bandgap的testbench电路&#xff0c;选择schematic 2.打开电路后,选择VDD模块&#xff0c;然后按键盘Q&#xff0c;进行编辑&#xff0c;将AC magnitude改为1 V 3.修改完成后&#xff0c;点击左上角Launch > ADE Explorer 4.在出现的窗口中&#xff0c;选择Creat…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...