STM32 的“外部中断”和“事件”区别和理解
凡从事过 ST MCU 应用开发的人往往会遇到事件、中断事件中断三个概念或术语。这三个概念彼此
关联,有时会让人有点混淆或犯迷糊。
先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个 STM32 GPIO
外部中断配置案例。
比如一老师在教室里给学生们上课。课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、
翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是视而不见,继续他的
上课;而有些行为可能导致老师的上课中止,比方讲小话,并对学生的相关行为予以警告、批评或
纠正等,然后继续上课。我们把老师因为学生的某些行为而中止授课,并产生后续动作,之后接着
上课的这个过程理解为中断或中断响应。我们把可能导致老师上课中断的学生行为理解为中断事件。
结合上面的比方,不难理解中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发
生而导致的后续行为过程。事件与中断事件是包含关系,即事件可分为中断事件或非中断事件。而
中断事件与中断之间属于前后关联的因果关系,虽有关联,但二者在时序上、行为上并不一样。
结合具体的 ST MCU 运行过程,其中会有许多各种各样的事件,比方管脚电平变化、计数器溢出、
DMA 空、FIFO 非空、AD 转换结束、超时、外设使能、初始化等等,其中有些事件是不会导致中断
产生的,比方外设使能或部分初始化动作是不会导致中断发生的,有些事件就可能导致中断发生,
比方计数器溢出,AD 转换结束等,这些就是中断事件。当然这些中断事件最终能否触发后续中断,
得看是否开启了该中断事件的中断使能,相关中断矢量控制器【NVIC】是否配置,最终让 CPU 内
核参与进来,并完成后续的中断服务动作。
不妨借助 STM32 MCU 的 GPIO 的外部事件与中断控制器的框图来理解上述概念。
从上图可以看出,不论外部电平变化成为中断事件还是非中断事件,绿色方框部分都是一样的,即
具有相同的触发源。差别就在后面。一般性事件要变为中断事件,得有相关中断使能位的允许。中
断事件再向 CPU 激活相关中断请求,在 NVIC 配置相应中断矢量后,CPU 便参与进行后续的中断
响应服务【如保存现场、执行中断服务程序、恢复现场并返回】,而非中断事件就没有中断事件后
续的流程,只是有些硬件触发信号或标志的产生。当然非中断事件的形成也是可控的。
既然一个可以触发中断的事件可能被配置中断事件或非中断事件,那么在相关事件的触发配置时就
出现两种可能,即允许产生中断或禁止产生中断。于是乎,ST MCU 参考手册里在谈到事件的触发
方式时就引出了事件模式和中断模式两个概念。
比方 STM32 的 GPIO 口的电平跳变基本都是可以触发外部中断的。但在具体配置时,可以根据需要
来决定启用还是禁用相关脚的中断功能,从而选择不同的事件触发方式,即事件模式和中断模式。
如果不希望电平跳变事件触发中断,就配置为事件模式,反之,配置为中断模式。
在 STM32 相关参考手册里,涉及中断【INTERRUPT】和事件【EVENT】二词表述的地方比较多,
加上这两个词的含义比较宽泛。手册里可能会用 interrupt 或 interrupt event 表述同一东西,或者说
interrup 泛指中断事件及后续中断响应全过程。比方类似下面语句的地方: