凡从事过ST MCU应用开发的人往往会遇到事件、中断事件中断三个概念或术语。这三个概念彼此关联,有时会让人有点混淆或犯迷糊。
先拿一件生活中的事情打比方对上述三个概念做个基本的粗略理解,之后再分享一个STM32 GPIO外部中断配置案例。
比如一老师在教室里给学生们上课。课堂上的学生可能做出各种行为动作,比方做笔记、打哈气、翻书包、讲小话等,我们把这些行为统称为事件,其中有些行为老师往往只是视而不见,继续他的上课;而有些行为可能导致老师的上课中止,比方讲小话,并对学生的相关行为予以警告、批评或纠正等,然后继续上课。我们把老师因为学生的某些行为而中止授课,并产生后续动作,之后接着上课的这个过程理解为中断或中断响应。我们把可能导致老师上课中断的学生行为理解为中断事件。
结合上面的比方,不难理解中断事件是一种可以导致中断发生的事件,中断则是因为中断事件的发生而导致的后续行为过程。事件与中断事件是包含关系,即事件可分为中断事件或非中断事件。而中断事件与中断之间属于前后关联的因果关系,虽有关联,但二者在时序上、行为上并不一样。
结合具体的ST MCU运行过程,其中会有许多各种各样的事件,比方管脚电平变化、计数器溢出、DMA空、FIFO非空、AD转换结束、超时、外设使能、初始化等等,其中有些事件是不会导致中断产生的,比方外设使能或部分初始化动作是不会导致中断发生的,有些事件就可能导致中断发生,比方计数器溢出,AD转换结束等,这些就是中断事件。当然这些中断事件最终能否触发后续中断,得看是否开启了该中断事件的中断使能,相关中断矢量控制器【NVIC】是否配置,最终让CPU内核参与进来,并完成后续的中断服务动作。
不妨借助STM32 MCU的GPIO的外部事件与中断控制器的框图来理解上述概念。
从上图可以看出,不论外部电平变化成为中断事件还是非中断事件,绿色方框部分都是一样的,即具有相同的触发源。差别就在后面。一般性事件要变为中断事件,得有相关中断使能位的允许。中断事件再向CPU激活相关中断请求,在NVIC配置相应中断矢量后,CPU便参与进行后续的中断响应服务【如保存现场、执行中断服务程序、恢复现场并返回】,而非中断事件就没有中断事件后续的流程,只是有些硬件触发信号或标志的产生。当然非中断事件的形成也是可控的。
既然一个可以触发中断的事件可能被配置中断事件或非中断事件,那么在相关事件的触发配置时就出现两种可能,即允许产生中断或禁止产生中断。于是乎,ST MCU参考手册里在谈到事件的触发方式时就引出了事件模式和中断模式两个概念。
比方STM32的GPIO口的电平跳变基本都是可以触发外部中断的。但在具体配置时,可以根据需要来决定启用还是禁用相关脚的中断功能,从而选择不同的事件触发方式,即事件模式和中断模式。如果不希望电平跳变事件触发中断,就配置为事件模式,反之,配置为中断模式。
好,我们一起来看看一个具体的案例。
某工程师做了一块STM32F407的工程样板,利用ST官方推出的STM32配置工具STM32CubeMx做MCU基本管脚和外设的软硬件配置并生成相关代码。令他郁闷的是,竟然在做某GPIO做按键中断时卡壳了,发现不论怎么按键就是不进中断程序。
经沟通了解,他用到的的那个GPIO是个很普通的脚,并非什么特别功能脚。按键电路也很常规简单。顺便看了下的相关配置代码。看到其GPIO初始化代码时,发现有关GPIO模式的地方有问题,也就是如下红色标注的代码行的地方。
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__GPIOE_CLK_ENABLE();
/*Configure GPIO pin : PE2 */
GPIO_InitStruct.Pin = GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_EVT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
}
红色语句代码是将该GPIO配置为下降沿触发的事件模式了,而不是中断模式。在利用STM32CubeMx对GPIO管脚进行模式配置时往往有很多选项,这些选项又可分为2大类。分别是中断模式和事件模式。【interrupt mode / event mode】
既然配置成了事件模式,按键自然没法触发中断及相关服务程序。让其修改为中断模式,即将上面配置修改为下面语句后即OK.
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
在STM32相关参考手册里,涉及中断【INTERRUPT】和事件【EVENT】二词表述的地方比较多,加上这两个词的含义比较宽泛。手册里可能会用interrupt或interrupt event表述同一东西,或者说interrup泛指中断事件及后续中断响应全过程。比方类似下面语句的地方:
有时用Interrupt event明确出来。比方下面表格中提到interrupt event.
总之,不管手册上怎么写,不必拘泥于字词符号,结合上下文弄清怎么回事就好。
上一篇:STM32 中断初识
下一篇:STM32 控制74HC595 驱动点阵 文字能移动
推荐阅读最新更新时间:2024-03-16 16:03