STM32固件库(标准外设库)入门学习 第五章 EXTI中断(一)

STM32固件库(标准外设库)入门学习 第五章 EXTI中断(一)



前言

本学习教程,参考B站江科大自化协STM32视频,型号为STM32F103C8T6。

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。

中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。

中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。把中断程序进行中断。
在这里插入图片描述


一、中断向量表

F1系列最多有68个中断,包括EXTI(外部中断)、TIM(定时器)、ADC(数模转换器)、USART(串口)、SPI(通信协议)、I2C(通信协议)、RTC(实时时钟)等多个外设,由此可知STM32中断是非常多的,几乎所有的模块都能申请中断。

在这里插入图片描述
右图是STM32的中断资源,灰色的是内核的中断,这些中断一般用不到。非灰色部分位STM32外设中断。

WWDG看门狗中断,若程序卡死,没有及时喂狗,窗口看门狗就会申请中断,让你的程序跳到窗口看门狗的中断程序里,那么就可以再中断程序里进行错误检查,看看出现什么问题;

PVD电源电压监测,如果供电电压不足,PVD电路就会申请中断,在中断里就知道,现在供电不足,是不是电池要没电了,赶紧保存重要数据;

2~5功能类似,外设电路检测到异常或事件,需要提示一下CPU的时候,他就可以申请中断,让程序跳到对应的中断函数运行一次,用来处理这种异常或事件。

EXTI0~EXTI4、EXTI9_5、EXTI5_10就是本次要用的外部中断对应的中断资源。

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

二、NVIC基本结构

NVIC叫做嵌套中断向量控制器,使用NVIC(管理中断、分配优先级)统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级。
在这里插入图片描述

NVIC是一个内核外设,是CPU的小助手。STM32的中断非常多,如何把这些中断全都接到CPU上,那么CPU还需要引出很多线进行适配,设计上很麻烦,并且如果很多中断同时申请,或者中断很多产生了拥堵,CPU也会很难处理,并且CPU主要用来运算的,中断分配任务需要这个NVIC小助手。NVIC有很多输入口,你有多少个中断线路,都可以接进来,/n表示一个外设可能会同时占用多个中断通道,所以这里有n条线,NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序,再通过右边这一个输出口告诉CPU,你该处理那个中断,对于中断先后顺序分配的任务,CPU不需要知道。

举例:CPU是一个医生,如果医院只有医生的话,当看病的人很多时,医生就需要安排一下先看谁,后看谁,如果有紧急的病人,还需要让紧急的病人最先来,这个安排先后顺序很繁琐,会影响医生看病的效率,所以医院安排了个叫号系统,来了病人统一取号,根据病人的病情分配一个优先级,叫号系统看现在在排队的病人,优先叫号紧急的病人,最后叫号系统给医生输出的就是一个个排好队的病人,医生就可以专心看病了,这个叫号系统就是NVIC。

为了处理不同形式的优先级,STM32的NVIC可以对优先级进行分组,分为抢占优先级和响应优先级,那这两种形式的优先级有什么区别?还是回到病人叫号的例子,对于紧急的病人,有两种形式的优先,一种是上一个病人在看病,外面排队了很多病人,上一个病人看完后,紧急的病人即使是后来的,也会最先进去看病,这种相当于插队的优先级,就叫响应优先级,响应优先级高的,可以插队提前看病。而如果这个病人更加紧急,并且此时已经有人在看病了,那他可以不等上一个人看完,直接冲到医生屋里,让上一个病人先靠边站,先给他看病,等他看完了,然后上一个病人再继续,上一个病人结束了,叫号系统再看看有没有人来,这种形式的优先就是之前讲的中断嵌套,这种决定是不是可以中断嵌套的优先级,就叫抢占优先级,抢占优先级高的,可以进行中断嵌套。
上文提到过,每个中断有16个优先级,为了把这些优先级再区分为抢占优先级和响应优先级,就需要对着16个优先级进行分组。

NVIC的中断优先级由优先级寄存器的4位二进制(0~15)决定,优先级的数越小,优先级越高,0就是最高优先级,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级。抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号(表55的优先级数值,数值小优先响应)排队。

下表是优先级分组方式,在程序中是自己来选择的。选择好分组方式后,在配置优先级的时候,就要注意抢占优先级和响应优先级的取值范围,不要超出这个表里规定的取值范围。
在这里插入图片描述

三、EXTI外部中断

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

支持的触发方式:上升沿/下降沿/双边沿(上升沿和下降沿都可触发)/软件触发(引脚啥时没有,程序执行一端代码,就能触发中断)

支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断,比如PA0和PB0不能同时用,或者PA1、PB1、PC1这样的Pin一样的都不行,若有多个中断引脚,要选择不同Pin的引脚,比如PA6和PA7等等

外部通断占用的通道:16个GPIO_Pin(GPIO_Pin_0~GPIO_Pin_15),外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒,共有20个中断路线。16个GPIO_Pin是外部中断的主要功能,后面四个东西是来“蹭网”的,因为外部中断有一个功能,就是从低功耗模式的停止模式下唤醒STM32,对于PVD电源电压检测,当从电源从电压过低恢复时,就需要PVD借助一下外部中断退出停止模式;对于RTC闹钟,有时候为了省电,RTC定一个闹钟后,STM32会进入停止模式,等到闹钟响的时候再唤醒,这也需要借助外部中断,还有USB唤醒、以太网唤醒,也都是类似的作用。

触发响应方式:中断响应/事件响应。中断响应就是申请中断,让CPU执行中断函数。事件响应是STM32对外部中断增加的一种额外的功能,当外部中断检测到引脚电平变化时,正常流程时选择触发中断,但在STM32中,也可以选择触发一个事件,若选择触发事件,那外部中断的信号就不会通向CPU了,而是通向其他外设,用来触发其他外设操作,比如触发ADC转换、触发DMA等。总之,中断响应是正常流程,引脚电平变化触发中断,事件响应不会触发中断,二是触发别的外设操作,属于外设之间的联合工作。
在这里插入图片描述
此图为外部中断的整体结构图

左边是GPIO口的外设(A、B、C…),每个GPIO口的外设有16个引脚,对应16根线,上文提到EXTI模块只有16个GPIO通道,但这里每个外设都有16个引脚,若每个引脚占用一个通道,那么EXTI模块的16个通道显然不够用,所以加上一个AFIO中断引脚选择电路模块。

AFIO就是一个数据选择器,可以在前面所有GPIO外设的16个引脚里选择其中1个连接到后面EXTI中,所以说上文提到相同的Pin,不能同时触发中断。

通过AFIO选择后的16个通道,与四个蹭网的,一起接到EXTI边沿检测及控制模块中,从EXTI出来后,上面的接到NVIC,传给CPU触发中断,也就是中断响应。此时注意一下,此时应该有20路中断输出的,但是可能ST公司觉得这20个输出太多了,比较占用NVIC通道资源,就把其中9—5和15—10,分别给分到一个通道里,外部中断的9—5会触发同一个中断函数,15—10也会触发同一个中断函数,在编程时,需要再根据标志位来区分到底是哪个中断进来的。下面这里,有20条输出线路到了其他外设,这就是用来触发其他外设操作的,也就是事件响应。

AFIO主要用于引脚复用功能的选择和重定义(数据选择器的作用)。在STM32中,AFIO主要完成两个任务:复用功能引脚重映射、中断引脚选择。复用功能引脚重映射就是在开头引脚定义图中,把默认复用功能的引脚换到重定义的这个位置来,就是用AFIO来完成的。
在这里插入图片描述
EXTI框图如下图所示,右下角为20根输入线,经过边沿检测电路,可选择上升沿触发、下降沿触发、双边沿触发,也可经过“或门”的输入端,与软件中断事件寄存器得值一起接到或门输入端,任意一个为1,或门就可以输出1。

注:
(1)弯边是或门,其可以有多个输入,但只有一个输出,执行的是或的逻辑,在输入端只要有一个是高电平1,输出就是高电平1,只有全部输入低电平0,输出才为0;
(2)直边是与门,同样有多个输入,但只有一个输出,执行与的逻辑,只要有一个是低电平0,输出就为0,只有全部输入1,输出才为1;
(3)三角号加圈的是非门,执行非得逻辑,只有一个输入,一个输出,输入1就输出0,输入0就输出1;
(4)梯形是数据选择器,多个输入,1个输出,侧面有选择控制端,根据控制端得数据,从输入选择一个接到输出

在这里插入图片描述
触发信号经过或门后,兵分两路,上路触发中断,下路触发事件。

触发中断首先会置一个挂起寄存器,这相当于是一个中断标志位,可以读取这个寄存器,判断是哪个通道触发得中断,如果请求挂起寄存器置1,它就会向左走,和中断屏蔽寄存器共同进入一个与门,到达NVIC中断控制器,这里得与门就是一个开关得作用【1与x都为x,0与x都为0】,中断屏蔽寄存器给1,就直接输出,也就是允许中断,中断屏蔽寄存器给0,那另一个输入无论是什么,输出都是0,相当于屏蔽了这个中断,这就是与门得作用。

下路触发事件。同样也是一个事件屏蔽寄存器进行开关控制,通过脉冲发生器到其他外设,这个脉冲发射器就是给一个电平脉冲,用来触发其他外设得动作。

总结

这一节是是EXTI中断的基础知识,下一节会讲EXTI中断的使用

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ZRob

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

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

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

打赏作者

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

抵扣说明:

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

余额充值