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号中断函数都用的是一个相同的函数名,这使得我们在中断服务函数中必须要检测是哪个信道产生的中断,再来决定下一步的执行逻辑。此外,还需要我们手动清除中断标志位。

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

清除中断挂起标志位

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

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

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

相关文章

解锁远程AI工作流:Flowise搭配cpolar跨地域管理AI项目

文章目录 前言1. Docker安装Flowise2. Ubuntu安装Cpolar3. 配置Flowise公网地址4. 远程访问Flowise5. 固定Cpolar公网地址6. 固定地址访问 前言 如今,工作流自动化与人工智能的结合已成为提升生产力的重要手段。Flowise正是这样一个工具,通过直观的拖拽…

Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件

本文将介绍一种手动的轻量级的方式,还原HTTP/TLS协议中传输的文件,为流量数据包中的文件分析提供帮助。 如果捕获的数据包中存在非文本类文件,例如png,jpg等图片文件,或者word,Excel等office文件异或是其他类型的二进…

MATLAB用CNN-LSTM神经网络的语音情感分类深度学习研究

全文链接:https://tecdat.cn/?p38258 在语音处理领域,对语音情感的分类是一个重要的研究方向。本文将介绍如何通过结合二维卷积神经网络(2 - D CNN)和长短期记忆网络(LSTM)构建一个用于语音分类任务的网络…

Android笔记(三十七):封装一个RecyclerView Item曝光工具——用于埋点上报

背景 项目中首页列表页需要统计每个item的曝光情况,给产品运营提供数据报表分析用户行为,于是封装了一个通用的列表Item曝光工具,方便曝光埋点上报 源码分析 核心就是监听RecyclerView的滚动,在滚动状态为SCROLL_STATE_IDLE的时…

Minikube 上安装 Argo Workflow

文章目录 步骤 1:启动 Minikube 集群步骤 2:安装Argo Workflow步骤 3:访问UI创建流水线任务参考 前提条件: Minikube:确保你已经安装并启动了 Minikube。 kubectl:确保你已经安装并配置了 kubectl&#xff…

GCP Cloud Storage 的lock retention policy是什么

简介 Google Cloud Storage 的锁定保留策略(Lock Retention Policy)是一种用于保护存储桶中对象数据的功能。它允许用户设置一个保留期,在此期间对象不能被删除或覆盖。这对于确保数据的长期保留和合规性非常重要,尤其是在需要满…

STM32设计防丢防摔智能行李箱

目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…

CSP/信奥赛C++语法基础刷题训练(11):洛谷P5743:猴子吃桃

CSP/信奥赛C语法基础刷题训练(11):洛谷P5743:猴子吃桃 题目描述 一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;接下来的每一天它都会吃剩余的桃子的一半外加一个。第 n n n…

控制器ThinkPHP6

五、控制器中对数组值的返回 在做接口服务时,很多时候回使用数组作为返回值,那么数组如何返回成 json呢? 在 tp6 中返回json 很简单,直接使用 json 进行返回即可,例如: public function index(){$resarra…

洛谷刷题日记||基础篇8

#include <iostream> #include <vector> using namespace std;int N, M; // N为行数&#xff0c;M为列数 vector<vector<char>> field; // 表示田地的网格&#xff0c;每个元素是W或. vector<vector<bool>> visited; // 用来记录网格是否访…

Qwen2.5-3B-Instruct-GGUF部署

注册账号&#xff1a; 魔搭社区 等一会&#xff1a; 部署好了&#xff1a; 立即使用&#xff1a; 您部署的服务提供OpenAI API接口&#xff0c;可通过OpenAI SDK进行调用。请确保您的服务处于正常运行状态&#xff0c;并预先安装OpenAI SDK: pip install openai 在本地新建…

恶意PDF文档分析记录

0x1 PDF是什么 PDF&#xff08;便携式文件格式&#xff0c;Portable Document Format&#xff09;是由Adobe Systems在1993年用於文件交换所发展出的文件格式。 因为PDF的文件格式性质广泛用于商业办公&#xff0c;引起众多攻击者对其开展技术研究&#xff0c;在一些APT&#…

Spring-事务学习

spring事务 1. 什么是事务? 事务其实是一个并发控制单位&#xff0c;是用户定义的一个操作序列&#xff0c;这些操作要么全部完成&#xff0c;要不全部不完成&#xff0c;是一个不可分割的工作单位。事务有 ACID 四个特性&#xff0c;即&#xff1a; 原子性&#xff08;Atom…

CVE-2024-2961漏洞的简单学习

简单介绍 PHP利用glibc iconv()中的一个缓冲区溢出漏洞&#xff0c;实现将文件读取提升为任意命令执行漏洞 在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE 漏洞的利用场景 PHP的所有标准文件读取操作都受到了影响&#xff1…

段探测的研究

在介绍今天的内容之前&#xff0c;我们先要知道一些前置的知识 跳过繁琐的介绍&#xff0c;我们单刀直入&#xff0c;介绍一个划时代的CPU 8086 8086 从8086开始&#xff0c;CPU扩展到了16位&#xff0c;地址的位宽扩展到了20位&#xff0c;自此之后我们现在所熟知的计算机结…

Linux:进程的优先级 进程切换

文章目录 前言一、进程优先级1.1 基本概念1.2 查看系统进程1.3 PRI和NI1.4 调整优先级1.4.1 top命令1.4.2 nice命令1.4.3 renice命令 二、进程切换2.1 补充概念2.2 进程的运行和切换步骤&#xff08;重要&#xff09; 二、Linux2.6内核进程O(1)调度队列&#xff08;重要&#x…

【学习心得】算力云平台上的大模型部署并实现远程调用

以AutoDL算力云平台为例&#xff0c;部署国产开源ChatGLM3b模型。 一、准备工作 &#xff08;1&#xff09;准备一台算力服务器 首先&#xff0c;进入AutoDL官网的算力时长选择算力服务器资源。 创建好后会自动跳转控制台的“容器实例”界面&#xff0c;稍等片刻后选择“快捷…

【Linux】—进程地址空间

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…

leetcode-44-通配符匹配

题解&#xff1a; 代码&#xff1a; 参考&#xff1a; (1)牛客华为机试HJ71字符串通配符 (2)leetcode-10-正则表达式匹配

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…