1. 外部中断概念
外部中断,英文缩写为EXTI,全称为Ext ernal Interrupt的缩写,直译过来就是是外部的中断。它是指在嵌入式系统中负责检测和处理外部中断和事件的模块。它通过检测外部信号的电平变化或边沿触发,生成对应的中断或事件,并将其送到中断控制器或事件屏蔽控制器进行处理。
在许多嵌入式系统中,包括STM32和GD32等,EXTI模块通常由多个输入线、边沿检测电路、触发选择寄存器、软件中断事件寄存器、请求挂起寄存器、中断屏蔽寄存器、事件屏蔽寄存器等部分组成,可以实现对外部中断和事件的高效检测和处理。
EXTI(中断/事件控制器)包括 23 个相互独立的边沿检测电路并且能够向处理器内核产生中断 请求或唤醒事件。
2. 中断触发机制
外部中断触发机制,分为两种:
- 硬件触发
- 软件触发
硬件触发机制主要是针对外部触发了芯片的引脚,造成引脚的电平发生变化,从而导致中断产生。
硬件触发机制支持三种触发类型:上升沿触发、下降沿触发和任意沿触发。
- 上升沿:之前是低电平,突然变成高电平了,这个数瞬间,我们称之为触发了上升沿
- 上升沿:之前是高电平,突然变成低电平了,这个数瞬间,我们称之为触发了下降沿
硬件触发外部中断,简单的理解就是,如果我配置了某个引脚外部中断功能,那么当这个引脚的电平发生变化时,就会触发中断机制,代码层级就会调用到我的中断函数。
软件触发机制,主要针对的是业务逻辑中,需要手动的触发中断事件,去执行中断逻辑而去设计的。他不需要对引脚做任何处理,也可以触发。
3. 中断触发源
引脚的外部中断总共有15个,对于同一个PIN,例如PA0和PB0是不可以同时触发的。
4. 中断消抖处理
4.1 消抖方式
4.1.1 硬件消抖
4.1.2 软件消抖
在按键操作过程中,如果我们采用的是扫描方式实现,消抖的处理方式通常为:
- 降低扫描频率。通常我们delay个20ms,也就是1秒扫50次,人的手速是到不了的,比较符合逻辑。
- 状态比较。比较本次和上次的状态,从而确定是否触发,降低触发误操作。
理论上我们可以将这种行为使用到中断处理方式中,但是,我们需要明确一点,中断中不可以睡眠时间过长。会影响其他任务执行。
我们可以通过以下两种方式间隔进行判断:
- 在定时器的中断函数里,按照指定间隔时间进行判断,这种需要占用一个Timer的中断函数。
- 通过时间差决定是否进行按键判定,即本次外部中断发生和上次中断发生的时间差。时间差就需要有时间计数概念,那么我们如何获得时间计数,可以利用System Tick。
5. 系统计数模块
通常我们称之为System Tick,System Tick 不是基于标准定时器(Timer)实现的,而是使用了专门的 SysTick 定时器模块。SysTick 定时器是一个专用的计数器,用于实现系统的计时和调度。
SysTick 定时器是一个 24 位的递减计数器,其工作与标准定时器(Timer)不同。它的时钟源通常是系统时钟(CPU 时钟),并且它是硬件级别的计时器,专门用于实现系统级别的计时和调度功能,比如操作系统的任务调度、延时等。