STM32 中断系统

news2024/9/22 9:31:51

单片机学习

目录

文章目录

前言

一、中断系统

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(从占优先级)

        响应属性应用在抢占属性相同的情况下,也就是当两个中断源的抢占优先级相同时,分以下几种情况处理:

  1. 如果两个中断同时到达,则中断控制器会优先处理响应优先级高的中断。
  2. 当一个中断到来后,如果正在处理另一个中断,则这个后到的中断就要等到前一个中断处理完之后才能被处理(高优先级的中断不可以打断低响应优先级的中断)。
  3. 如果他们的抢占优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。

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唤醒、以太网唤醒
  • 触发响应方式:中断响应/事件响应
  1. 中断响应就是申请中断,让CPU执行中断函数。
  2. 事件响应是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常的流程时选择触发中断,但在STM32中也可以选择触发一个事件。如果选择触发事件,那外部中断的信号就不会通向CPU了,而是通向其他外设,用来触发其他外设的操作,如触发ADC转换、触发DMA等。
  3. 触发响应方式总结:中断响应是正常流程,引脚电平变化触发中断。事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合工作。

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的中断基础知识。

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

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

相关文章

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《计及电动汽车需求响应的高速公路服务区光储充鲁棒优化配置》

这个标题涉及到一个关于高速公路服务区的优化配置问题,其中考虑了电动汽车需求响应和光储充的因素。让我们逐步解读这个标题: 高速公路服务区: 涉及到高速公路上的服务区,这是供驾驶员休息、加油、用餐等的地方。 电动汽车需求响…

SEM代运营的服务费用为什么不按广告费比例抽佣?

如果SEM代运营公司是按广告费比例来抽取佣金,就意味着客户的广告费花得越多,代运营公司的收入也就越高。本来应当屏蔽掉的无效广告点击和恶意点击,出于代运营公司自身利益考虑,处理这些事情时也就不那么干脆利索。只要能保障客户有…

gvim中的捕获替换

有些时候我们在使用vim的时候,希望将其中的某些pattern, 替换成另外的pattern, 直接使用替换的话,会将某些不属于这个pattern的地方给误替换,因此可以采用如下的方式; 简单说下规则: \ ( \) : 用括号将需要捕获…

springboot 外部化配置

背景:修改jar包中的配置比较麻烦 项目部署的时候放一个配置文件在jar包外 配置文件优先级: 1.jar包内的application.properties/yaml 2.jar包内的application-{profile}.properties/yaml 3.jar包外的application.properties/yaml 4.jar包外的application-{profile}.properties…

指针变量与指针类型的深入理解

1.知识总结 相关代码展示 #include <stdio.h> int main() {int n 0x11223344;int *pi &n; *pi 0; return 0; } #include <stdio.h> int main() {int n 0x11223344;char *pc (char *)&n;*pc 0;return 0; } #include <stdio.h> int main() {i…

解决Vscode使用git提交卡住的问题

使用Vscode的git提交代码经常会很慢/卡住。 先点击左下角&#xff0c;进入设置 找到git的配置(建议直接搜索)&#xff0c;把use Editor As commit input的勾选去掉即可解决。

【C++干货铺】适配器 | stack | queue

个人主页点击直达&#xff1a;小白不是程序媛 C系列学习专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 stack的介绍和使用 stack的介绍 stack的使用 queue的介绍和使用 queue的介绍 queue的使用 容器适配器 什么是适配器 STL中stack和queue的底层结构 d…

Ubuntu 23.10 服务器版本 ifconfig 查不到网卡 ip(已解决)

文章目录 1、问题描述2、 解决方案 1、问题描述 服务器&#xff1a;ubuntu 23.10 经常会遇到虚拟机添加仅主机网卡后&#xff0c;通过 ifconfig 无法获取其网卡 ip 2、 解决方案 修改网卡配置文件&#xff1a; # 进入网卡配置文件目录 cd /etc/netplan # 备份原始文件 cp …

MAV3D:从文本描述中生成三维动态场景

Singer U, Sheynin S, Polyak A, et al. Text-to-4d dynamic scene generation[J]. arXiv preprint arXiv:2301.11280, 2023. MAV3D 是 Meta AI 研究者们提出的一种从文本描述生成三维动态场景的方法。从所提供的文本生成的动态视频输出可以从任何摄像机位置和角度查看&#xf…

基于python和django旅游管理系统

基于python和django旅游管理系统 摘要 基于Python和Django的旅游管理系统是一个以现代化技术为基础的系统&#xff0c;旨在提升旅游行业的管理效率和服务水平。该系统以Django框架为核心&#xff0c;结合Python编程语言的灵活性和强大的生态系统&#xff0c;实现了多方面的功能…

极兔速递单号查询,极兔速递物流查询,一键复制查询好的物流信息

批量查询极兔速递单号的物流信息&#xff0c;并将查询好的物流信息一键复制出来。 所需工具&#xff1a; 一个【快递批量查询高手】软件 极兔速递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的朋友记得先注册&…

CP_AUTOSAR分层软件架构内容简介

目录 0、前言1、综述1.1 AUTOSAR应用范围及拓展性1.2 架构总体介绍 0、前言 随着汽车功能需求日益增加&#xff0c;稳定安全的AUTOSAR分层软件架构逐渐作为一个热词呈现在汽车电子软件开发领域。那么AUTOSAR分层软件架构到底包括了哪些内容&#xff1f;架构之间的是什么关系&am…

mac mysql连接中断重新启动办法

遇到如图所示问题&#xff0c;可以用下面的命令重启mysql服务 sudo /usr/local/mysql/support-files/mysql.server start

【深度学习】卷积神经网络(CNN)的参数优化方法

著名&#xff1a; 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络的参数优化方法的一些总结和摘录&#xff0c;并不是我自己的结论和做实验所得到的结果。我想Michael的实验结果更有说服力一些。本书在github上有中文翻译的…

浅谈 Guava 中的 ImmutableMap.of 方法的坑

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐&…

数据结构与算法编程题16

已知长度为n的线性表A&#xff0c;请写一时间复杂度为O(n)、空间复杂度为O(1)的算法&#xff0c;该算法删除线性表中所有值为item的数据元素。 item 3 数组下标 i 0 1 2 3 4 5 6 7 8 顺序表&#xff1a; 1 2 3 4 3 3 5 3 7 #include <iostream> using namespace std;typ…

jupyter notebook 不知道密码,怎么登录解决办法

jupyter notebook 不知道密码&#xff0c;怎么登录解决办法 1、 windows下&#xff0c;打开命令行&#xff0c;输入jupyter notebook list &#xff1a; C:\Users\tom>jupyter notebook list Currently running servers: http://localhost:8888/?tokenee8bb2c28a89c8a24d…

【【Linux系统下常用指令学习 之 二 】】

Linux系统下常用指令学习 之 二 文件查询和搜索 文件的查询和搜索也是最常用的操作&#xff0c;在嵌入式 Linux 开发中常常需要在 Linux 源码文件中查询某个文件是否存在&#xff0c;或者搜索哪些文件都调用了某个函数等等。 1、命令 find find 命令用于在目录结构中查找文件…

基于IDEA+Tomcat+Mysql开发的企业资产管理

基于Tomcat的企业资产管理信息系统 项目介绍&#x1f481;&#x1f3fb; 企业资产管理系统”项目是一个管理和维护企业资源的平台&#xff0c;能够提供系统管理、内容管理、用户管理、组织架构维护、流程管理、模块管理、角色管理、调度管理和个人设置等功能。 本项目所述的全…

Centos上安装Docker和DockerCompose

安装Docker Docker可以运行在MAC&#xff0c;Windows&#xff0c;CtenOS,UBUNTU等操作系统上。目前主流的版本有Docker CE和Docker EE&#xff0c;CE是免费的开源Docker版本&#xff0c;适用于开发人员和小型团队&#xff0c;EE是适用于企业的容器化解决方案。它基于Docker CE…