STM32学习9---EXIT外部中断(理论)

本文参考江科大和其他博主,侵删!

中断系统是管理和执行中断的逻辑结构 ,外部中断是产生中断的外设之一

一、STM32中断

1、中断基本介绍

68个可屏蔽中断通道(中断源),包含EXTI外部、TIM定时器、ADC模数转换器、USART串口、SPI通信、I2C通信、RTC实时时钟等外设。STM32的型号不同,支持的中断不同。

NVIC是统一管理中断,每个中断通道有16个可编程的优先等级,并可对优先级进行分组,进而设置抢占优先级、响应优先级。NVIC就是管理中断分配优先级的。

STM32的中断资源:

比如第一个复位中断,当产生复位事件时,程序就会自动执行复位中断函数,也就是复位后程序开始执行的位置。NMI不可屏蔽中断,硬件失效、存储管理、总线错误、错误应用等等,这些都是内核里面的中断,都比较高深,也难理解,一般用不到,了解一下即可。

STM32的外设中断:

第一个窗口看门狗,用来监测程序运行状态的中断,比如程序卡死没有及时喂狗,窗口看门狗就会申请中断,让你的程序跳到窗口看门狗的中断程序里,这时可以在中断程序里进行一些错误检查,检查问题。

PVD电源电压监测。如果供电电压不足,PVD电路就会申请中断。从而知道现在供电不足,电池是否有电,保存重要数据。类似功能还有:

外设电路检测到异常或者事件,需要提示一下CPU的时候,可以申请中断,让程序跳到对应的中断函数里运行一次,用来处理这个异常或事件。

EXTI0到EXTI4,还有下面的EXTI9_5和EXTI15-10,是本节要学习的内容。

表的右边是中断的地址:

程序中的中断函数的地址是由编译器来分配的,是不固定的,但是中断跳转由于硬件的限制,只能跳到固定的地址执行程序。所以为了能让硬件跳转到一个不固定的中断函数里,这里就需要在内存中定义一个地址的列表。这个列表地址是固定的,中断发生后就跳到这个固定位置。然后在这个固定位置,由编译器,再加上一条跳转到中断函数的代码,这样中断跳转就可以跳到任意位置了

这个中断地址的列表就叫中断向量表,是中断跳转的一个跳板。使用C语言编程不要考虑中断向量表,由编译器完成。

2、NVIC的基本结构

NVIC:嵌套中断向量控制器,在STM32中,统一分配中断优先级和管理中断的。

NVIC是一个内核外设CPU的助手。STM32的中断非常多,如果把这些中断全都接到CPU上,CPU还得引出很多线进行适配,如果很多中断同时申请或者中断很多产生了拥堵,CPU也会很难处理,毕竟CPU主要是用来运算的,所以设置NVIC负责中断分配的任务。

NVIC有很多输入口,中断线路都可以接过来。比如:EXTI、TIM、ADC、USART等

 线上画了个斜杠,上面写个n,这个意思是一个外设可能会同时占用多个中断通道,所以这里有n条线。

3、优先级

NVIC只有一个输出口,NVIC根据中断的优先级分配中断的先后顺序,通过输出口到CPU。怎么分配优先级,CPU不参与。(相当于医院的叫号系统,医生不参与叫号排序)

为了处理不同形式的优先级,STM32的NVIC可以对优先级进行分组。每个中断有16个优先级,这个优先级再可以再划分为抢占优先级和响应优先级,就需要16个优先级进行分组。

NVIC的中断优先级由优先级寄存器的4位决定。(4位二进制可以表示0~15的数对应16个优先级,这个优先级的数是值越小优先级越高0就是最高优先级)。这4位再切分,分位n位的抢占优先级和4-n的响应优先级。

抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队。

当2个中断同时响应,抢占优先级高的先中断。

抢占优先级相同时,响应优先级高的先中断。

抢占优先级相同时,低响应优先级已经进入中断函数,高响应优先级不可打断低响应优先级

抢占优先级和响应优先级均相同,按中断号排队。当抢占优先级和响应优先级均相同时,就按照这里的这个数字来排队,数值小的优先响应。这个中断号就是这里这个表里的这栏数字。

总之,STM32的中断不存在先来后到的排队方式,在任何时候都是优先级高的先响应。

3、优先级分组

因为优先级总共是四位,所以就有五种分组方式。

分组0:0位的抢占优先级,取值只能为0。4位的响应等级取值可以是0~15。

分组1:是1位的抢占优先级,取值是0~1;3位的响应等级取值是0~7。

然后分组2、3、4都是按照这个规律来分配的。

这个分组方式在程序中可以选择的,选好分组方式之后,在配置优先级的时候,就要注意抢占优先级和响应优先级的取值范围了,不要超出这个表里规定的取值范围。

二、EXTI外部中断

1、外部中断基本介绍 

EXTI可以监测指定GPIO口的电平信号,指定GPIO口的电平发生变化时,EXTI立即向NVIC申请中断,经过NVIC裁决后,可中断CPU主程序,使CPU执行EXTI对应的中断程序。

支持的触发方式:

触发方式:上升沿、下降沿、双边沿、软件触发(使用代码触发,与引脚无关)。

支持的GPIO口:

所有GPIO口,但相同的Pin不能同时触发中断,比如PA0和PB0不能同时触发,PA1、PB1、PC1等都不能同时触发中断,只能选择一个。有多个中断引脚,要选择不同Pin脚,如:PA7、PA9。

外部中断占用的通道:
通道数:16个GPIO_Pin(GPIO_Pin_0到GPIO_Pin_15),再加PVD输出、RTC时钟、USB唤醒、以太网唤醒,共计20条中断线路。16个GPIO_Pin是外部中断的主要功能。

外部中断的触发响应方式

分为中断响应/事件响应。

中断响应:申请中断,让CPU执行中断函数。

事件响应:外部中断的额外功能。当外部中断检测到引脚电平变化时,一般时申请中断,但还可以选择触发事件,外部中断的信号不会通向CPU,而是通向其他外设,触发外设的操作,比如ADC转换、触发DMA。总之,中断响应是正常的操作,引脚电平触发中断。事件响应不会触发中断,而是触发别的外设,属于外设之间的联合工作。

2、基本结构

最左边是GPIO口的外设,每个GPIO外设有16个引脚,所以每个外设进来16根线

AFIO:中断引脚选择

EXTI模块只有16个GPIO的通道。但这里每个GPIO外设都有16个引脚,如果每个引脚占用一个通道,EXTI的16个通道显然就不够用了。所以在这里会有一个AFIO中断引脚选择的电路模块

AFIO:是一个数据选择器。在GPIO外设各自的16个引脚里,选择其中一个连接到后面的EXTI的通道里,所以这前面说相同的Pin不能同时触发中断。因为对于PA0、PB0、PC0,通过AFIO选择之后,只有其中一个能接到EXTI的通道0上。同理,PA1、PB1、PC1,也只能有一个接到通道1上。这就是所有GPIO口都能触发中断,但相同的pin不能同时触发中断的原因。

EXTI边沿检测及控制:

AFIO选择之后的16个通道,接到EXTI边沿检测及控制电路上。还有下面PVD等4个蹭网的外设,共计组成EXTI的20个中断通道。

NVIC中断选择分配优先级

经过EXTI电路后,分为2种输出,接到NVIC的,是触发中断的。

注意:本来20个输入,应该20个输出,但是为了节省NVIC的通道资源,外部中断的9~5,15~10给分配了同一个通道。即:外部中断的9~5会触发同一个中断函数15~10也会触发同一个中断函数。编程时在这两个中断函数里,根据标志位来区分到底是哪个中断。

右下角有20条输出线路到了其他外设,这就是用来触发其他外设的,也就是上文提到的事件响应。

AFIO和NVIC的内部电路:

先看一下AFIO复用lO口:

上图是AFIO选择中断引脚的结构图,这里就是一系列的数据选择器。

 第一个输入是PA0、PB0、PC0等,一直到PG0,尾号都是0,然后通过数据选择器,最终选择一个接到EXTI0上。配置AFIO_EXTICR1寄存器的EXIT0可以决定选择哪一个输入。

 AFIO注意用于引脚复用功能的选择和重定义,也就是数据选择器的作用。

在STM32中,AFIO主要2个作用:复用功能引脚重映射、中断引脚选择。

复用功能引脚重映射:把这些默认复用功能的引脚换到重定义的这个位置来,使用AFIO来完成的,这也是AFIO的一大主要功能。

EXTI的内部框图

 

从框图看到,EXTI的右边就是20根输入线,输入线首先进入边沿检测电路,在上面的上升沿寄存器和下降沿寄存器,可以选择是上升沿触发还是下降沿触发,或者两个都触发。接着触发信号就进入到这个或门的输入端了。

硬件触发和软件中断寄存器的值,接在这个或门上,也就是任意一个为1,或门就可以输出1,所以才支持多种触发方式,如上升沿、下降沿、双边沿和软件触发。

触发信号通过这个或门之后就分两路,上一路是触发中断,下一路是触发事件。

触发中断:首先会置一个请求挂起寄存器,即中断标志位,可以读取该标志位,判断哪个通道触发的中断。该寄存器置1,沿着线路继续往左走,和中断屏蔽寄存器共同进入一个与门,最后至NVIC中断控制器。

这里的与门起了开关的作用,对于与门来说,1&x=x,0&x=0。中断屏蔽寄存器给1,那另一个输入就是直接输出,也就是允许中断。中断屏蔽寄存器给0,另一个输入无论是什么,输出都是0,相当于屏蔽了这个中断。这就是这个与门的作用,相当于一个开关控制。

触发事件:

首先事件屏蔽寄存器进行开关控制,通过一个脉冲发生器到其他外设。这个脉冲发生器就是给一个电平脉冲,用来触发其他外设的动作。

另外,这个框图上画一个斜杠写着20,表示20根线,代表20个通道。最上面是外设接口和APB总线,可以通过总线访问这些寄存器。

以上就是EXTI的内部结构。

三、外部中断使用的硬件模块

1、编码器介绍 

什么样的设备需要用到外部中断?对于STM32来说,想要获取的信号是外部驱动的很快的突发信号。比如旋转编码器的输出信号。这个信号是突发的,STM32不知道什么时候会来,同时它是外部驱动的,STM32只能被动读取,而且这个信号非常快,STM32稍微晚读取,就会错过很多波形。对于这种情况,就考虑使用STM32的外部中断。一有脉冲过来,STM32立即进入中断函数处理。没有脉冲的时候,STM32处理其他。

再比如红外遥控接收头的输出,接收到遥控数据之后,它会输出一段波形。这个波形转瞬即逝,所以就需要用外部中断来读取。

但按键的动作可以看成外部驱动的突发事件,但并不推荐使用外部中断来读取按键,因为外部中断不好处理按键抖动和松手检测的问题,对于按键来说,它的输出波形也不是转瞬即逝的。所以要求不高的话,可以在主程序中循环读取。如果不想用主循环读取的话,采用定时器中断读取的方式。这样既能后台读取按键值不阻塞主程序,也能处理按键抖动和松手检测的问题。

旋转编码器

它是测量速度、位置、和旋转方向的装置。当旋转轴旋转时,输出端可以输出与旋转方向和速度对应的方波信号,读取方波信号的频率和相位就可以测出旋转轴的旋转方向和速度。

旋转编码器的类型:机械触点式、霍尔传感器式、光栅式等

这是最简单的编码器,使用对射式红外传感器测速,需要配合光栅编码盘使用。

当编码盘转动时,红外传感器的红外光就会出现遮挡、透过、遮挡、透过这样的现象。对应模块输出的电平就是高低电平交替的方波。方波的个数代表旋转的角度,频率代表速度。所以可以使用外部中断捕获方波的边沿,以此判断位置和速度。该种只有一路输出,正反转波形无法区分,无法判断旋转方向。

为了进一步测量方向,我们就可以用这几种编码器:

第一个是套件里的旋转编码器了,左边是它的外观,右边是它的内部拆解结构。

它内部是用金属触点来进行通断的,所以它是一种机械触点式编码器,这里左右是两部分开关触点 。这种编码器可以进行调节的,比如音响调节音量,因为它是触点接触的形式,所以不适合电机这种高速旋转的应用,另外几种都是非接触的形式,可以用于电机测速,电机测速的功能比较常见。

 其中内侧的两根细的触点都是和中间的这个引脚连接的

外侧的触点,左边的接在这个引脚,右边的接在这个引脚,这就是这些触点的连接方式。

中间这个圆的金属片是一个按键,旋转编码器的轴是可以按下去的

按键的两根线就在上面引出来, 按键的轴按下,则上面两根线短路。松手则上面两根线断开。

再看一下编码盘,是一系列像光栅一样的东西,这是金属触点,在旋转时依次接通和断开两边的触点。

两侧触点的通断产生一个九十度的相位差,配合外部电路,这个编码器的两个输出就会输出这样的波形:

当正转时,A侧引脚输出一个方波信号,同时B相引脚输出一个和它相位相差90度的波形,也就是正向旋转时,B相输出是滞后90度,

反向旋转时A相还是方波信号,B相就会提前90度。这样正反转就可以区分。

这种相位相差90°的波形叫正交波形。正交波形输出的编码器是可以测量方向的。这也是与单相输出波形的区别。

接着看,直接附在电机后面的编码器,称为霍尔传感器形式的编码器。中间是圆形磁铁,边上有两个位置错开的霍尔传感器。当磁铁旋转时,通过霍尔传感器就可以输出正交的方波信号。

接着是独立的编码器元件:也可以测速和测方向。

2、旋转编码器硬件电路

电路图:

图里中间这个就是旋转编码器

上面按键的两根线(方框),这个模块没有使用,是悬空的。红圈的是编码器内部的两个触点。

旋转轴旋转时,这两个触点以相位相差九十度的方式交替导通。该开关信号要配合外围电路才能输出高低电平。

电路图左边,接了一个10k的上拉电阻,默认编码器没旋转时,这个点被拉为高电平,通过R3输出到A端口的也是高电平。

当旋转时,触点导通,这个点就直接被拉低到GND了(低电平)。

R3是限流电阻,防止引脚电流过大。C1是滤波电容,防止信号抖动。右边电路与左边一样。

中间的C直接接GND。

该模块的外部图:

A相输出和B相输出接到STM32的两个引脚比如PB0和PB1。注意引脚的GPIO_Pin编号不要一样。

3、手册建议

NVIC属于内核外设,参考Cortex_M3编程手册。找到NVIC的一些寄存器,包括中断使能寄存器、中断清除使能寄存器、中断设置挂起寄存器、中断清除挂起寄存器、中断活动位寄存器、中断优先级寄存器,这个中断优先级寄存器是设置每个中段的优先级的、接着还有一个软件触发中断寄存器。

另外,中断分组的配置,中断分组的配置寄存器是被分配到了这个SCB里面的。在SCB_AIRCR里,这三位就是用来配置中断分组的。

打开STM32的手册,有中断系统和外部中断的介绍以及NVIC的概述,然后是中断相量表,接着就是外部中断EXTI的介绍。还有一些框图,和外部中断唤醒事件的说明、外部中断的功能说明。

还有中断的线路映象,也就是中断引脚选择,这一部分实际上是在AFIO里的。

最后就是外部中断的寄存器描述,这里有中断屏蔽寄存器、事件屏蔽寄存器、上升沿触发选择寄存器、下降沿触发选择寄存器、软件触发寄存器、挂起寄存器。
本文结束!

 

 

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

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

相关文章

步入响应式编程篇(二)之Reactor API

步入响应式编程篇(二)之Reactor API 前言回顾响应式编程Reactor API的使用Stream引入依赖Reactor API的使用流源头的创建 reactor api的背压模式发布者与订阅者使用的线程查看弹珠图查看形成新流的日志 前言 对于响应式编程的基于概念,以及J…

66,【6】buuctf web [HarekazeCTF2019]Avatar Uploader 1

进入靶场 习惯性输入admin 还想用桌面上的123.png 发现不行 看看给的源码 <?php // 关闭错误报告&#xff0c;可能会隐藏一些错误信息&#xff0c;在开发阶段可考虑开启&#xff08;例如 error_reporting(E_ALL)&#xff09; error_reporting(0); // 引入配置文件&#x…

FortiGate配置远程拨号VPN

我们前面介绍了FortiGate如何配置IPsec VPN的两种类型&#xff1a;站到站&#xff08;卷土重来&#xff01;这次终于把FortiGate的IPsec VPN配置成功了&#xff01;&#xff09;和Hub-and-Spoke&#xff08;漂亮&#xff01;FortiGate配置Hub-Spoke类型的IPsec VPN竟然是Full-M…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

CSS中相对定位和绝对定位详解

文章目录 CSS中相对定位和绝对定位详解一、引言二、相对定位1、相对定位的概念1.1、代码示例 三、绝对定位1、绝对定位的概念1.1、代码示例 四、相对定位与绝对定位的区别五、使用示例六、总结 CSS中相对定位和绝对定位详解 一、引言 在CSS布局中&#xff0c;定位是一种强大的…

XCode-Color-Fixer 常见问题解决方案

XCode-Color-Fixer 常见问题解决方案 XCode-Color-Fixer StoryBoard / XIB 颜色偏差很严重&#xff0c;怎么破&#xff1f;XCode-Color-Fixer帮你忙&#xff01; 项目地址: https://gitcode.com/gh_mirrors/xc/XCode-Color-Fixer 项目基础介绍 XCode-Color-Fixer 是一个…

Visual Studio2019调试DLL

1、编写好DLL代码之后&#xff0c;对DLL项目的属性进行设置&#xff0c;选择待注入的DLL&#xff0c;如下图所示 2、生成DLL文件 3、将DLL设置为启动项目之后&#xff0c;按F5启动调试。弹出选择注入的exe的界面之后&#xff0c;使用代码注入器注入步骤2中生成的dll&#xff0…

C++入门基础篇:域、C++的输入输出、缺省参数、函数重载、引用、inline、nullptr

本篇文章是对C学习前期的一些基础部分的学习分享&#xff0c;希望也能够对你有所帮助。 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 目录 1.第一个C程序 2. 域 3. namespace 3.1 namespace的作用 3.2 namespace的定义 3.3 namespace使用说明 4.C的输入和输出…

在Ubuntu上安装RabbitMQ教程

1、安装erlang 因为rabbitmq是基于erlang开发的&#xff0c;所以要安装rabbitmq&#xff0c;首先需要安装erlang运行环境 apt-get install erlang执行命令查是否安装成功&#xff1a;erl&#xff0c;疯狂 Ctrlc 就能退出命令行 2、安装rabbitmq 1、查看erlang与rabbitmq版本…

latin1_swedish_ci(latin1 不支持存储中文、日文、韩文等多字节字符)

文章目录 1、SHOW TABLE STATUS WHERE Name batch_version;2、latin1_swedish_ci使用场景注意事项修改字符集和排序规则修改表的字符集和排序规则修改列的字符集和排序规则修改数据库的默认字符集和排序规则 3、ALTER TABLE batch_version CONVERT TO CHARACTER SET utf8mb4 C…

使用vue-next-admin框架后台修改动态路由

vue-next-admin框架是一个基于 Vue 3 和 Vite 构建的后台管理系统框架。它采用了最新的前端技术栈&#xff0c;旨在提供一个高效、灵活、现代化的管理后台解决方案。该框架主要用于构建功能丰富且易于定制的管理后台应用&#xff0c;适合各种中大型项目。 其主要特点包括&am…

qiankun+vite+vue3

基座与子应用代码示例 本示例中,基座为Vue3,子应用也是Vue3,由于qiankun不支持Vite构建的项目,这里还要引入 vite-plugin-qiankun 插件 基座(主应用) 加载qiankun依赖 npm i qiankun -S qiankun配置(src/qiankun) src/qiankun/config.ts export default {subApp…

深度学习中Batch Normalization(BN)原理、作用浅析

最近做剪枝学习&#xff0c;其中一种是基于BN层的γ作为缩放因子进行剪枝的&#xff0c;那么我想搞懂BN的工作原理更好的理解网络、剪枝等&#xff0c;所以有了该文。 首先先说BN的作用在详细拆解&#xff0c;理解。以知乎一条高赞评论说明BN层到底在干什么。 Batch Norm 为什…

Python----Python高级(正则表达式:语法规则,re库)

一、正则表达式 1.1、概念 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、 regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff0…

【16届蓝桥杯寒假刷题营】第1期DAY5

5.依依的询问最小值 - 蓝桥云课 问题描述 依依有个长度为 n 的序列 a&#xff0c;下标从 1 开始。 她有 m 次查询操作&#xff0c;每次她会查询下标区间在 [li​,ri​] 的 a 中元素和。她想知道你可以重新排序序列 a&#xff0c;使得这 m 次查询的总和最小。 求你求出 m 次…

机器学习10-解读CNN代码Pytorch版

机器学习10-解读CNN代码Pytorch版 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习10-解读CNN代码Pytorch版1-核心逻辑脉络2-参考网址3-解读CNN代码Pytorch版本1-MNIST数据集读取2-CNN网络的定义1-无注释版…

【机器学习实战中阶】使用SARIMAX,ARIMA预测比特币价格,时间序列预测

数据集说明 比特币价格预测&#xff08;轻量级CSV&#xff09;关于数据集 致谢 这些数据来自CoinMarketCap&#xff0c;并且可以免费使用该数据。 https://coinmarketcap.com/ 数据集:链接: 价格预测器 源代码与数据集 算法说明 SARIMAX&#xff08;Seasonal AutoRegressive …

将 AzureBlob 的日志通过 Azure Event Hubs 发给 Elasticsearch(1.标准版)

问题 项目里使用了 AzureBlob 存储了用户上传的各种资源文件&#xff0c;近期 AzureBlob 的流量费用增长很快&#xff0c;想通过分析Blob的日志&#xff0c;获取一些可用的信息&#xff0c;所以有了这个需求&#xff1a;将存储账户的日志&#xff08;读写&#xff0c;审计&…

【Red Hat8】:搭建FTP服务器

目录 一、匿名FTP访问 1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 5、安装VSFTPD 6、 打开配置文件 7、设置配置文件如下几个参数 8、重启vsftpd服务 9、进入图形化界面配置网络 10、查看IP地址 11、安装ftp服务 12、遇到拒绝连接 13、测试 二、本地…

Redis的Windows版本安装以及可视化工具

文章目录 redis安装redis安装包下载解压文件夹启动redis服务Redis路径配置环境变量打开redis客户端进行连接基础操作测试 redis可视化工具下载Redis Desktop Manager redis安装 redis安装包下载 windows版本readis下载&#xff1a;Releases tporadowski/redis 解压文件夹 我…