32单片机基础:EXTI外部中断

本节是STM32的外部中断系统和外部中断。

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

所以本节借助外部中断学习一下中断系统。

下图灰色的,是内核的中断,比如第一个,当产生复位事件时,程序就会自动执行复位中断函数,也就是我们程序开始执行的位置。一般这些中断都比较高深,看上去也挺难理解的,但是这些中断我们一般用不到,了解一下即可

 下面这些不是灰色的部分,就是STM32外设的中断,比如第一个,窗口看门狗,这个是用来检测程序运行状态的中断,那比如你程序卡死了,没有及时喂狗,窗口看门狗就会申请中断,让你的程序跳转到窗户看门狗的中断程序里,那你在中断程序里就可以进行一些错误的检查,看看出现什么问题了,PVD,电源电压检测,如果你供电电压不足,PVD电路就会申请中断。你在中断里知道,现在供电不足,是不是电池没电了,要赶紧保持一下重要数据

 下面这些中断就是我们本节要学习的

 

最右边有个中断的地址,这个地址是干什么的呢?这个是因为我们程序中的中断函数,它的地址是由编码器来分配的,是不固定的,但是我们的中断跳转,由于硬件的限制,只能跳转到固定的地址执行程序,所以为了能让硬件跳转到一个不固定的中断函数里这里就需要在内存中定义一个地址的列表,这个 地址的列表是固定的,中断发生后,就跳到这个固定的位置,然后在这个固定的位置,由编码器,再加上一条跳转到中断函数的代码这样中断就可以跳转到任意位置了。这个中断地址的列表就叫中断向量表,相当于中断跳转的一个跳板不过我们用C语言编程的话,是不需要管这个中断向量表的。因为编译器把我们做好了

这个NVIC的名字叫做嵌套中断向量控制器。在STM32中,它是用来统一分配中断优先级和管理中断的,NVIC是一个内核外设,是CPU的小助手,我们之前谈到,STM32的中断非常多,如果把这些中断全部接到CPU上,那CPU还得引出很多线进行适配,设计上就很麻烦。并且如果很多中断同时申请,或者中断很多产生了拥堵,,CPU也会很难处理,毕竟CPU主要是用来运算的,中断分配的任务就放到别的地方吧。所以NVIC就出现了

NVIC有很多输入口,你有多少个中断线路,都可以接进来,比如上图所示,/n表示一个外设可能会同时占用多个中断通道。所以这里有n条线。然后NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序。之后,通过右边这一个输出口就告诉CPU,你该处理哪一个中断。对与中断先后顺序分配的任务,CPU不需要知道。

举一个例子:比如这个CPU是一个医生,如果医院只有医生的话,当看病的人很多时医生就得安排先看谁,后看谁。如果有紧急的病人,那还得让紧急的病人最先来,这个安排先后次序的任务很繁琐,会影响医生看病的效率,所以医生就安排了一个叫号系统,来病人了统一取号,并且根据病人的等级,分配一个优先级,然后叫号系统看一下现在在排队的病人,优先叫号紧急的病人。最终叫号系统给医生输出的就是一个一个排好队的病人。医生就可以专心看病了。这个叫号系统在STM32里叫NVIC.

为了处理不同形式的优先级,STM32的NVIC可以对优先级进行分组,分为抢占优先级响应优先级,那这两个形式的优先级有什么区别呢?

我们继续拿病人叫号的这个例子。对于紧急的病人,其实有两种形式的优先,一种是:上一个病人在看病,外面排队了很多病人。当上一个病人看完后 ,紧急的病人即使是后来的,也会最先进去看病。这种相当于插队的优先级,就叫响应优先级,如图所示:说明响应优先级高的,可以插队提前看病

另外,如果这个病人更加紧急,并且此时已经有人在看病了,那他还可以不等上个人看完,直接冲到医生的屋子,让上一个病人先靠边站,先给他看病,等他看完了,然后上一个病人在继续,上一个病人看完了,叫号系统再看看有没有人来,这种形式的优先就是我们之前讲的中断嵌套这种决定是不是可以中断嵌套的优先级,就叫抢占优先级,如图:抢占优先级可以中断嵌套。

之前图片显示,每个中断有16个优先级,为了把这16个个优先级再区分为抢占优先级和响应优先级就需要对这16个优先级进行分组, 这个优先级的数越小,优先级越高,0就是最高优先级。

 如图箭头所示就是中断号

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

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

了解NVIC这个叫号系统之后,我们就来了解第一个病人——EXT1外部中断。

相同的pin不能同时使用的意思是:比如PA0和PB0不能同时使用。或者PA1,PB1,PC1这样的,端口GPIO_pin一样的。只能选一个作为中断引脚。所以你如果有多个中断引脚,要选择不同的Pin的 

引脚。

通道数加起来总共有20个中断线路,这里的16个GPIO_pin是外部中断的主要功能,后面跟着的这四个东西是用来"蹭网”的,为啥这些东西要来外部中断蹭网呢,因为这些外部中断有个功能,就是从低功耗模式的停止模式下唤醒STM32,那对PVD电源电压检测,当从电源从电压过低恢复时,就需要PVD借助一下外部中断退出停止模式。对于RTC闹钟来说,有时候为了省电,RTC定了一个闹钟之后。STM32会进入停止模式,等待闹钟响的时候再唤醒,这也需要借助外部中断。还有USB,以太网唤醒,也都是类似的功能。当然,我们主要学习引脚的外部中断,这四个蹭网了解一下即可。

 响应触发方式:中断响应就是申请中断,让CPU执行中断函数。

事件相应是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常的流程是选择触发中断,但在STM32中,也可以选择触发一个事件,如果选择触发事件,那外部中断的信号就不会通向CPU了。而是通向其他外设,用来触发其他外设的操作。比如触发ADC转换,触发DMA等

总之:中断响应是正常的流程,引脚电平变化触发中断,事件响应不会触发中断,而是触发别的外设操作,属于外设之间的联合操作。

基本结构如上图:

最左边是GPIO的外设,比如GPIOA,GPIOB等,每个GPIO外设有16个引脚,所以进来16根线。

但是我们前面讲EXTI只有16个引脚,每个GPIO都有16个显然EXTI引脚不够用了。所以,会有一个AFIO中断引脚选择的电路模块,这个AFIO就是数据选择器。它可以在这前面3个GPIO外设 的16个引脚里选择其中一个连接到后面的EXTI通道里。所以之前说的相同的pin只有一个能接到通道里。就是这个原因。

然后通过AFIO选择之后的16个通道,就接到了EXTI边沿检测及控制电路上。同时,四个蹭网的外设也是并列接进来的。这些加起来,就组成了EXTI的20个输入信号,然后经过EXTI电路之后,分为了两种输出。其中上面这些,接到了NVIC,是用来触发中断的,这里注意一下,本来20路输入,应该有20路中断的输出,但是可能ST公司觉得这20个输出太多了,比较占用NVIC的通道资源,所以就把其中外部中断9-5和15-10,给分到一个通道里。也就是说,外部中断9-5会触发同一个中断函数,15-10也会触发同一个中断函数,在编程时,我们在这两个中断函数里,需要再根据标志位来区别到底是哪一个中断进来。

下面这里,有20条输出线接到了其他外设,这就是用来触发其他外设操作的,也就是我们刚才说的事件响应。

然后我们再具体看一下AFIO和EXTI的内部电路

右边这个图,就是AFIO选择中断引脚的结构图,

在上面,写的是配置这个寄存器的这些位,就可以决定哪一个输入,功能都类似于数据选择器。

看左边,AFIO主要用于引脚复用功能的选择和重定义,就是数据选择器的作用。

复用功能引脚重定义就是 

EXTI内部框图:

 

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

硬件触发和软件中断寄存器的值就接到了这个或门上,任意一个为1,或门输出1,

所以,根之前图片写的一样,触发方式种类很多。

触发信号通过或门后,就兵分两路,上一路是触发中断的,下一路是触发事件的,触发中断会置一个挂起寄存器,这相当于是一个中断标志位,我们可以读取这个寄存器判断是哪一个通道触发的中断如果挂起寄存器置1,它就继续往左走,和中断屏蔽寄存器共同进入一个与门,然后至NVIC中断控制器,这里的与门实际就是开关的作用,因为1与上任意的数x,等于这个任意的数x,0与上任意的数x,都等于0.这就相当于,中断屏蔽器给1,另一个输入就是直接输出,也就是允许中断。中断屏蔽寄存器给0,那另一个输入无论是什么,输出都是0,相当于屏蔽了这个中断,这就是这个与门的作用,相当于开关的作用。

下一路事件的输出部分,首先也是一个事件屏蔽寄存器进行开关控制,最后通过脉冲发生器,到其他外设,这个脉冲发生器就是给一个电平脉冲,用来触发其他外设的动作。画一个斜线写在20,表示的是,就是20根线,代表20个通道。

上面是外设接口和APB总线,我们可以通过总线访问寄存器。

到这里,有关中断系统,NVIC中断控制器和EXTI外部中断的内容我们就讲完了

最后看一下本节配合的外部中断,我们所使用的硬件模块。

对于外部中断来说,我们刚刚学习完它的原理和结构。那到底什么样的设备用到外部中断呢。使用外部中断有什么好处呢·?

下面是使用外部中断模块的特性:

就是对于STM32来说,想要获取的信号是外部驱动的很快的突发信号,比如下图的旋转编码器的输出信号,我可能很久都不会拧它,这时不需要STM32做任何事,但是我一拧它,就会有很多脉冲波形需要STM32接收。这个信号是突发的,STM32不知道什么时候会来,同时它是外部驱动的,STM32只能被动读取,最后这个信号非常快STM32稍微来晚了一点来读取,就会错过很多波形。所以对于这种情况下,就可以考虑使用STM32的外部中断了,没有脉冲的时候,STM32就专心做其他事情,另外还有,比如红外遥控接收头的输出,接收到遥控数据之后。它会输出一段波形,这个波形转瞬即逝,并且不会等你,所以就需要我们用外部中断来读取。最后还有按键,虽然它的动作也是外部驱动的突发事件,但我并不推荐用外部中断来读取按键,因为用外部中断不好处理按键抖动和松手检测的问题,对于按键来说,他的输出波形不是转瞬即逝的,所以要求不高的话可以在主程序中循环读取。如果不想用主循环读取的话,可以考虑定时器中断读取的方式。这样既可以做到后台读取按键值,也不阻塞主程序。也可以很好的处理按键抖动和松手检测的问题。

 最左边这里使用的是对射式红外传感器来测速的,为了测速,还需要一个光栅编码盘,就是最左边的像轮子一样的东西,但这个编码盘转动时,红外传感器的红外光就会出现遮挡,透过,遮挡,透过这些的现象。对应模块输出的电平就是高低电平交替的方波,这个方波的个数表示了转过的角度,方波的频率表示转速。那我们可以用外部中断捕获这个方波的边沿,下降或上升沿,以此来判断方波的速度和位置但是最左边这个模块只有一路输出,正转和反转输出波形无法区别。所以这种测速方法只能测位置和角度,不能测旋转方向。

右边三个就是可以测量方向的

 

看上图,可以看出内部是用金属触点来进行通断的,所以也叫机械触点式编码器。一般是用来调节的,比如音响调节音量这样的用途。因为它是触点接触的形式,所以不适合电机这样高速旋转的地方。另外几种都是非接触的形式,可以用于电机测速。电机测速在电机驱动的应用还是十分广泛的。本节先用这个学习一下外部中断读取编码器计次数据的用法。,后面学习定时器,再回来继续看一下编码器测速的用途的。

左右是两部分开关触点,连接顺序如下图,中间这个圆的金属片是一个按键,我们这个旋转

编码器的轴是可以按下去的,按键的两根线由上面引出来了。按键的轴按下,上面两根线断路,松手,上面两根线断开,就是个普通按键。

下图这个是编码盘,它也是一系列像光栅一样的东西只不过是金属触点,在旋转时,依次接通和断开两边的触点,而且,还有个关键的部分是,这个金属盘的位置是经过精心设计的。它能让两侧触点的通断产生一个90度的相位差。最终配合外部电路,这个编码器就会输出这样的波形。 

 

正转时,左边的引脚,就是A引脚,输出一个方波波形。同时,右侧引脚,就是B引脚,输出一个和它相位差90度的波形,正向旋转时下图,B滞后90度,反相旋转时,B提前90度。这样,正转和反转就区分了。这种相位相差90度的波形就叫正交波形,带正交波形输出的编码器,是可以用来测方向的,这就是单相输出与两相正交输出的区别

 

看一下上图的硬件电路:

 

上面按键的两根线,是悬空的,没有使用, 像按键一样没有连接的就是两个触点,旋转轴旋转时,这;两个触点以相位相差90度的方式交替导通,因为是个开关信号,所以配合外部电路才能输出高低电平

当然,还有些编码器不是输出正交波形而是一个引脚输出方波信号代表转速,另一个输出高低电平代表旋转方向。这种不是输出正交波形的编码器,也是可以测方向的。

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

旷视low-level系列(三):(NAFNet)Simple Baselines for Image Restoration

题目:Simple Baselines for Image Restoration 单位:旷视 收录:ECCV2022 论文:https://arxiv.org/abs/2204.04676 代码:https://github.com/megvii-research/NAFNet 文章目录 1. Motivation2. Contributions3. Methods…

NFT Insider #120:福布斯在 The Sandbox 推出永久建筑,哈佛教授表示Web3 和 NFT 将会继续存在

引言:NFT Insider由NFT收藏组织WHALE Members (https://twitter.com/WHALEMembers)、BeepCrypto (https://twitter.com/beep_crypto)联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜…

《初阶数据结构》尾声

目录 前言: 《快速排序(非递归)》: 《归并排序》: 《归并排序(非递归)》: 《计数排序》: 对于快速排序的优化: 分析: 总结: 前言&#xff1a…

《UE5_C++多人TPS完整教程》学习笔记24 ——《P25 完善菜单子系统(Polishing The Menu Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P25 完善菜单子系统(Polishing The Menu Subsystem)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主&…

200万上下文窗口创飞Gemini 1.5!微软来砸谷歌场子了

谷歌刚刷新大模型上下文窗口长度记录,发布支持100万token的Gemini 1.5,微软就来砸场子了。 推出大模型上下文窗口拉长新方法——LongRoPE,一口气将上下文拉至2048k token,也就是200多万! 并且1000步微调内&#xff0c…

深入浅出:探究过完备字典矩阵

在数学和信号处理的世界里,我们总是在寻找表达数据的最佳方式。在这篇博文中,我们将探讨一种特殊的矩阵——过完备字典矩阵,这是线性代数和信号处理中一个非常有趣且实用的概念。 什么是过完备字典矩阵? 首先,我们先…

<网络安全>《49 网络攻防专业课<第十四课 - 华为防火墙的使用(2)>

6 防火墙的防范技术 6.1 ARP攻击防范 攻击介绍 攻击者通过发送大量伪造的ARP请求、应答报文攻击网络设备,主要有ARP缓冲区溢出攻击和ARP拒绝服务攻击两种。 ARP Flood攻击(ARP扫描攻击):攻击者利用工具扫描本网段或者跨网段主机时…

MT8791迅鲲900T联发科5G安卓核心板规格参数_MTK平台方案定制

MT8791安卓核心板是一款搭载了旗舰级配置的中端手机芯片。该核心板采用了八核CPU架构设计,但是升级了旗舰级的Arm Cortex-A78核心,两个大核主频最高可达2.4GHz。配备了Arm Mali-G68 GPU,通过Mali-G88的先进技术,图形处理性能大幅提…

网络原理-UDP/TCP协议

协议 在网络通信中,协议是非常重要的一个概念,在下面,我将从不同层次对协议进行分析. 应用层 IT职业者与程序打交道最多的一层,调用系统提供的API写出的代码都是属于应用层的. 应用层中有很多现成的协议,但是更多的,我们需要根据实际情况来进行制作自定义协议. 自定义协议…

Vue3 (unplugin-auto-import自动导入的使用)

安装 参考链接 npm i -D unplugin-auto-importvite.config.ts里面配置 import AutoImport from unplugin-auto-import/viteAutoImport({imports:[ vue,vue-router]})重新运行项目会生成一个auto-imports.d.ts的文件 /* eslint-disable */ /* prettier-ignore */ // ts-nochec…

C++之类作用域

目录 1、全局作用域 2、类作用域 2.1、设计模式之Pimpl 2.2、单例模式的自动释放 2.2.0、检测内存泄漏的工具valgrind 2.2.1、可以使用友元形式进行设计 2.2.2、内部类加静态数据成员形式 2.2.3、atexit方式进行 2.2.4、pthread_once形式 作用域可以分为类作用域、类名…

高并发系统实战课个人总结(极客时间)

高并发系统实战课 场景 读多写少 我会以占比最高的“读多写少”系统带你入门,梳理和改造用户中心项目。这类系统的优化工作会聚焦于如何通过缓存分担数据库查询压力,所以我们的学习重点就是做好缓存,包括但不限于数据梳理、做数据缓存、加缓…

有趣的CSS - 文字加载动画效果

大家好,我是 Just,这里是「设计师工作日常」,今天分享的是用 css 实现多字符模拟加载动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整代码如下html 页面css 样式页…

【Python笔记-设计模式】享元模式

一、说明 享元模式是一种结构型设计模式,它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。 (一) 解决问题 旨在减少大量相似对象创建时的内存开销 (二) 使用场景 大量…

这是我见过最全的权限系统设计方案!

日常工作中权限的问题时时刻刻伴随着我们,程序员新入职一家公司需要找人开通各种权限,比如网络连接的权限、编码下载提交的权限、监控平台登录的权限、运营平台查数据的权限等等。 在很多时候我们会觉得这么多繁杂的申请给工作带来不便,并且…

[更新]ARCGIS之土地耕地占补平衡、进出平衡系统报备坐标txt格式批量导出工具(定制开发版)

序言 之前开发的耕地占补平衡报备格式,现在之前的基础上集成了耕地进出平衡报备格式导出。 之前版本软件详见:软件介绍 一、软件简介 本软件是基于arcgis二次开发的工具(插件),需要授权后才能使用; 本软件…

125 Linux C++ 系统编程4 Linux 静态库制作,动态库制作,静态库和动态库对比。静态库运行时找不到库的bug fix

一 静态库 和动态库 对比 静态库的原理:假设我们有一个 静态库,大小为500M,这个静态库实现了一些打牌的逻辑算法,提供了一堆API,让开发者 可以轻松的实现 54张扑克牌的随机发牌,指定发牌等功能。 我们写了…

Nuxt3实现多语言与事件总线(EventBus)

我的nuxt版本为 3.10.0 一、多语言实现 这里我使用得是 nuxtjs/i18n 这个库 安装 npm install -D nuxtjs/i18nnext根目录创建 i18n.config.ts 文件 export default {legacy: false,locale: zh, // 默认值messages: {zh: {home: 首页,useKill: 使用技巧,helpCenter: 帮助中…

H桥逆变控制方式(单极性倍频)

单极性倍频图像 内部做了载波取反:正相载波和负相载波 最后都和调制载波一起比较 正相载波:Q7导通为高电平,Q15导通为低电平 负相载波:Q16导通为高电平,Q8导通为低电平 导通次序为:Q7Q16——Q7Q8——Q7Q…

Mamba 作者谈 LLM 未来架构

文章目录 前言 1、为什么注意力机制有效? 2、注意力计算量呈平方级增长 3、Striped Hyena 是个什么模型? 4、什么是 Mamba? 5、Mamba 硬件优化 6、2024年架构预测 7、对 AI 更多的预测 本片文章来自【机器之心】对Mamba作者进行采访所进行的编译整理。 …