STM32入门教程-2023版【5-1】EXTI外部中断

关注 + 点赞   不错过精彩内容

图片

大家好,我是硬核王同学,最近在做免费的嵌入式知识分享,帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作!

五、EXTI外部中断

(1)EXTI简介

图片

下面我们来看一下外部的一些中断

第一个EXTI(Extern Interrupt)外部中断

EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。(简单说:引脚电平变化,申请中断)

支持的触发方式(引脚电平的变化类型):上升沿(电平从低电平变到高电平的瞬间触发中断)/下降沿(电平从高电平变到低电平的瞬间触发中断)/双边沿(上升沿和下降沿都可以触发中断)/软件触发(程序执行代码就能触发中断)

支持的GPIO口(外部中断引脚):所有GPIO口都能触发中断,但相同的Pin不能同时触发中断(比如PA0和PB0不能同时使用,只能选一个作为中断引脚;所以如果有多个中断引脚,要选择不同的pin引脚,比如PA6和PA7、PA9和PB15、PB0和PB1就可以)

通道数:总共有20个中断线路。16个GPIO_Pin(对应引脚GPIO_pin0到15,是外部中断的主要功能),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒(这4个中断线路实际是来GPIO蹭网的,因为这个外部中断有个功能是从低功耗模式的停止模式下唤醒STM32。那对于PVD电源电压检测,当电源从电压过低恢复时就需要PVD借助一下外部中断,退出停止模式;对于RTC闹钟来说,有时候为了省电,RTC定一个闹钟之后,STM32会进入停止模式,等到闹钟响的时候再唤醒,这也需要借助外部中断,剩余USB唤醒、以太网唤醒也是类似的作用)当然我们本节主要学引脚的外部中断,这四个蹭网的知道一下就行了

触发响应方式:中断响应(引脚电平触发中断,申请中断,让CPU执行中断函数)/事件响应(这个其实是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常的流程是选择触发中断,但是在STM32中,也可以选择触发一个事件,如果选择触发事件,那外部中断的信号就不会通向CPU了,不会触发中断,而是触发别的外设操作,比如触发ADC转换、触发DMA等,属于外设之间的联合工作。)

(2)EXTI基本结构

图片

上图就是外部中断的整体结构图

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

而在EXTI模块中只有16个GPIO的通道,但这里每个GPIO外设都有16个引脚,所以如果每个GPIO的引脚占用一 个通道,那EXTI的16个通道是不够用的,所以会加上一个AFIO中断引脚选择的电路模块,这个AFIO就是一个数据选择器(可以将前面的3个GPIO外设的16个引脚中的其中一个连接到后面的EXTI通道(16个GPIO通道),所以对于PA0\PB0\PC0这些,通过AFIO选择之后只有其中一个能接到EXTI的通道0上,同理PA1\PB1\PC1这些,也只能有一个连接到通道1上,这就是所有GPIO口都能触发中断,但相同的Pin不能同时触发中断的原因)

通过AFIO选择后的16个通道,就接到了EXTI边沿检测及控制电路上,同时下面这4个蹭网的外设(PVD\PTC\USB\ETH)也是并列接进来的,这些加起来就组成了EXTI的20个输入信号

通过EXTI电路之后,分为了两种输出,也就是中断响应和事件响应(上面的GPIO到AFIO接到了NVIC用来触发中断,下面有额外20条输出线路连接到了其它外设,这就是用来触发其他外设操作的,也就是事件响应)

注意点:

本来20路输入,应该有20路中断的输出,可能ST公司觉得20个输出太多了比较占用NVIC的通道资源,所以就把其中的外部中断9~ 5,15~10,给分到了一个通道,也就是说外部中断的9到5会触发同一个中断函数,15到10也会触发同一个中断函数;在编程的时候,我们在这两个中断函数里,需要再根据标志位区分到底是哪个中断进来的。

(3)AFIO复用IO内部电路

图片

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

这个内部电路就是一系列的数据选择器,如图的最上面输入是PA0\PB0\PC0等尾号都是0,然后通过数据选择器最终选择一个,连接到EXTI0上,图中后面部分EXTI0~15内容都雷同。

AFIO主要用于引脚复用功能的选择和重定义(也就是数据选择器的作用)

在STM32中,AFIO主要完成两个任务:复用功能引脚重映射(就是STM32简介中提到的引脚定义表,当想把这些默认复用功能的引脚换到重定义功能时,就是用AFIO来完成的,这也是AFIO的一大主要功能)、中断引脚选择。

(4)EXTI内部电路框图

图片

这个图中的最右下角的输入线,也就是EXTI的右边是20根输入线,输入线首先进入边沿检测电路,在边沿检测电路上面的上升沿寄存器和下降沿寄存器可以选择是上升沿触发还是下降沿触发或者两个都触发。

  • 接着硬件触发信号和软件中断寄存器的值就进入到左边的这个或门的输入端(也就是任意一个为1,或门就可以输出1)

  • 触发信号通过这个或门后就兵分两路,上一路是触发中断的(至NVIC中断控制器),下一路是触发事件的(脉冲发生器)

  • 上一路中,触发中断首先会置一个上面的请求挂起寄存器,挂起寄存器相当于一个中断标志位,可以读取这个寄存器判断是哪个通道触发的中断,如果挂起寄存器置1,它就会继续向左走和中断屏蔽寄存器共同进入一个与门(与门实际上就是开关控制作用,中断屏蔽寄存器给1,那另一个输入就是直接输出,也就是允许中断;中断屏蔽寄存器给0,那另一个输入无论是什么,输出都是0,相当于屏蔽了这个中断),然后到达NVIC中断控制)

  • 而下一路的选择是触发事件,首先也是一个事件屏蔽寄存器进行开关控制,最后通过一个脉冲发生器到其它外设(脉冲发生器就是给一个电平脉冲,用来触发其它外设的动作)

  • EXTI内部电路框图最上面两个就是外设接口和APB总线,我们可以通过总线访问这些寄存器。

补充:

图片

或门(无直边)。它可以有多个输入,但只能有一个输出。执行的是或的逻辑,在输入端(曲边),只要有一个高电平1,输出就是高电平1;只有全部输入低电平0,输出才为0。(尖头为输出)。(或1为1,全0则0)

图片

与门(直边)。它可以有多个输入,但只能有一个输出。执行的是与的逻辑,在输入端(直边),只要有一个是低电平0,输出就是0;只有全部输入1,输出才为1。(与0为0,全1则1)

图片

非门(三角号加个圈)。它只有一个输入,一个输出;输入1就输出0,输入0就输出1,执行的是非的逻辑(圈为输出,取反)

图片

数据选择器(一个梯形)。有多个输入,一个输出,在侧面有选择控制端,根据控制端的数据,从输入选择一个接到输出。

图片

/20,表示20根线,代表20个通道

(5)EXTI外部中断的特性和使用场景

外部中断的使用场景:

什么样的设备需要用到外部中断,使用外部中断有什么好处呢?

何时使用外部中断模块的特性?对于stm32来说,想要获取的信号是外部驱动的突发信号。

比如旋转编码器的输出信号,你可能很久都不会拧它,这时不需要STM32做任何事,但是我一拧它,就会有很多脉冲波形需要STM32接收。这个信号是突发的,STM32不知道什么时候会来,同时它是外部驱动的,STM32只能被动读取,最后这个信号非常快,STM32稍微晚一点来读取,就会错过很多波形。那对于这种情况来说,就可以考虑使用STM32的外部中断了。有脉冲过来,STM32立即进入中断函数处理,没有脉冲的时候,STM32就专心做其它事情。

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

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

作 者 :硬核王同学

------- END ------

关注公众号回复“加群”按规则加入技术交流群  回复“1024”查看更多内容

图片

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬核王同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值