STM32事件 中断事件 中断的详解

发布者:meilidaowl最新更新时间:2018-05-30 来源: eefocus关键字:STM32  中断事件 手机看文章 扫描二维码
随时随地手机看文章

凡从事过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事件 中断事件 中断的详解

上一篇:STM32 中断初识
下一篇:STM32 控制74HC595 驱动点阵 文字能移动

推荐阅读最新更新时间:2024-03-16 16:03

关于USART很多人都容易忽视的一个问题
Ⅰ、 写在前面 今天这篇文章分享的知识点比较少,但比较重要,是大部分人在实际项目开发中都容易忽视,且容易犯下的低级错误。 本文讲述在项目开发中,或在学习中经常遇到USART发送字符串,对方没有接收完成(最后一两字节),也就是最后字节数据丢失了。具体可以看下面章节实验。 关于本文的更多详情请往下看。 Ⅱ、实例工程 为了方便大家学习,提供实验源代码工程给大家参考。 STM32F10x_USART(验证USART发送字符串): https://yunpan.cn/ckInh8YTwWHVP 访问密码 81f9 提供下载的实例实现的功能比较简单,主要是用于验证不同情况下,发送字符的不同。 实例实现功能可以从
[单片机]
关于USART很多人都容易忽视的一个问题
STM32的GPIO使用的函数剖析
该文是自己学习了一段STM32后所写,是对STM32使用固件库编程最简单的一段程序,是对固件库函数的一部分进行解析。如有错误之处请指正,不胜感激。 一、 GPIO_Init函数解析 1 1、参数GPIO_TypeDef 1 2、参数GPIO_InitStruct 2 3、函数代码详解 4 4、备注 6 一、GPIO_Init函数解析 首先来看一下GPIO_Init函数的原型void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)。这个函数的实现是在Stm32f10x_gpio.c文件中,若要使用该函数在相应的应用程序的前
[单片机]
STM32系列第3篇--GPIO初始化
使能和初始化IO口: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOD,
[单片机]
基于STM32的家庭服务机器人系统设计
引言   随着人工智能和传感器技术的发展,机器人已从工厂的结构化环境进入人们的日常生活环境,机器人不仅能自主完成工作,还能与人共同协作完成任务或在人的指导下完成任务 。家庭服务机器人是智能家居系统 的一个重要组成部分,在生活中的作用越来越重要。当前,大部分的家庭服务机器人不具备行走功能或只具有简单的避障能力,机器人的研究很多依赖于仿真实现,但是现实情况和仿真结果可能大相径庭。也有一些研究将问题复杂化,反而走了更多的弯路。   针对当前家庭服务机器人的不足和现代智能服务机器人的要求,本文提出一种基于STM32的家庭服务机器人系统的设计方案。该方案模拟智能家居环境,简化了定位方式,有效地利用了ZigBee技术低成本、低功耗的特点
[安防电子]
基于<font color='red'>STM32</font>的家庭服务机器人系统设计
STM32和ROS的串口通信
1 前言 之前有不少小伙伴,因为不知道如何使用这里分享的代码、或者是对系统结构不太清楚等等,导致调用不成功的,这里我深表歉意。下面我会对整个通信方案的部署进行详细的说明,确保每一个看到这篇文章的小伙伴,都能解决自己的问题。 2 本方案解决的问题 解决以STM32做ROS机器人底层驱动的串口通信问题、其他需要stm32和ros通信的小伙伴也可以使用。 -1- 介绍 1 最终协议的样子 我这里实现的STM32和ROS的串口通信协议如下图: STM32端和ROS端都有一个数据发送函数和一个数据接收函数,发送和接收的内容就是如上图所示的数据包,该数据包含有数据头(55aa)、数据尾(0d0a)、校验(crc8),
[单片机]
<font color='red'>STM32</font>和ROS的串口通信
STM32 JTAG引脚做普通I/O口用
1、开启AFIO时钟: RCC_APB2PeriphClockCmd (RCC_APB2Periph_AFIO, ENABLE) 2、改变指定管脚的映射GPIO_Remap_SWJ_Disable,SWJ完全禁用(JTAG+SW-DP): GPIO_PinRemapConfig (GPIO_Remap_SWJ_Disable, ENABLE) 3、改变指定管脚的映射GPIO_Remap_SWJ_JTAGDisable,JTAG-DP禁用+SW-DP 使能: GPIO_PinRemapConfig (GPIO_Remap_SWJ_JTAGDisable, ENABLE) 注意:注意顺序,一定要先使能复用时钟,再失能JATG。
[单片机]
STM32单片机中Hex、Bin文件的区别及应用详解
STM32、51等单片机程序经过编译后,生成的hex文件、bin文件,它们都是单片机烧写文件,本文介绍它们的区别与应用。Hex文件Keil5中生成hex文件的配置 如上图,分别点击“魔术棒”-“Output选项卡”,勾选“Create HEX File”选项,确认即可。STM32CubeIDE中生成hex文件的配置 如上图,先用鼠标点击选中项目名,之后点击菜单栏“File”-“Properties”。 如上图红框处,依次点击“C/C++ Build”-“MCU Post build outputs”,勾选“Convert to Intel Hex file”,应用并关闭窗口。 hex烧写用ISP方式烧写程序,首先找来I
[单片机]
<font color='red'>STM32</font>单片机中Hex、Bin文件的区别及应用详解
STM32如何收发float类型数据?
在之前文章里提到了共用体用来传输浮点数的用法,但那篇笔记中没有详细介绍,这篇笔记我们一起来看一看具体实例。 实际应用中,我们可能需要两个设备通过串口传输浮点数据: 本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下: 我们创建一个用于管理float类型数据的共用体: unionfloat_data { floatf_data; uint8_tbyte ; }; 数据的流向如: 本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。 创建两个共用体变量,用于发送与接收: unionfloat_datarx_float_data,tx_float_data; 收发相关代码: 左
[单片机]
<font color='red'>STM32</font>如何收发float类型数据?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved