STM32的GPIO 输入—按键检测

发布时间:2023-02-23  

硬件设计

按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图1 中的带波纹信号,需要用软件消抖处理滤波,不方便输入检测。本实验板连接的按键带硬件消抖功能,见图2,它利用电容充放电的延时,消除了波纹,从而简化软件的处理,软件只需要直接检测引脚的电平即可。

图1 按键抖动说明图

图2 按键原理图



从按键的原理图可知,这些按键在没有被按下的时候,GPIO引脚的输入状态为低电平(按键所在的电路不通,引脚接地),当按键按下时,GPIO 引脚的输入状态为高电平(按键所在的电路导通,引脚接到电源)。只要我们检测引脚的输入电平,即可判断按键是否被按下。


若您使用的实验板按键的连接方式或引脚不一样,只需根据我们的工程修改引脚即可,程序的控制原理相同。


软件设计

LED 的工程,为了使工程更加有条理,我们把按键相关的代码独立分开存储,方便以后移植。在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,这些文件也可根据您的喜好命名,这些文件不属于STM32 标准库的内容,是由我们自己根据应用需要编写的。


编程要点

  • 使能GPIO端口时钟;

  • 初始化GPIO目标引脚为输入模式(浮空输入);

  • 编写简单测试程序,检测按键的状态,实现按键控制LED 灯。


代码分析

  1. 按键引脚宏定义

同样,在编写按键驱动时,也要考虑更改硬件环境的情况。我们把按键检测引脚相关的宏定义到 “bsp_key.h”文件中,见代码清单1。

代码清单1 按键检测引脚相关的宏


以上代码根据按键的硬件连接,把检测按键输入的GPIO 端口、GPIO 引脚号以及GPIO端口时钟封装起来了。


2. 按键 GPIO 初始化函数

利用上面的宏,编写按键的初始化函数,见代码清单2。

代码清单2 按键GPIO初始化函数


同为GPIO的初始化函数,初始化的流程与“LED GPIO 初始化函数”章节中的类似,主要区别是引脚的模式。函数执行流程如下:

(1) 使用GPIO_InitTypeDef 定义GPIO 初始化结构体变量,以便下面用于存储GPIO 配置。

(2) 调用库函数RCC_APB2PeriphClockCmd 来使能按键的GPIO 端口时钟,调用时我们使用“|”操作同时配置两个按键的时钟。

(3) 向GPIO初始化结构体赋值,把引脚初始化成浮空输入模式,其中的GPIO_Pin 使用宏“KEYx_GPIO_PIN”来赋值,使函数的实现方便移植。由于引脚的默认电平受按键电路影响,所以设置成浮空输入。

(4) 使用以上初始化结构体的配置,调用GPIO_Init 函数向寄存器写入参数,完成GPIO的初始化,这里的GPIO 端口使用“KEYx_GPIO_PORT”宏来赋值,也是为了程序移植方便。

(5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它按键检测时使用的

GPIO引脚。


3. 检测按键的状态

初始化按键后,就可以通过检测对应引脚的电平来判断按键状态了,见代码清单3。

代码清单3 检测按键的状态


在这里我们定义了一个Key_Scan 函数用于扫描按键状态。GPIO 引脚的输入电平可通过读取IDR 寄存器对应的数据位来感知, 而STM32 标准库提供了库函数GPIO_ReadInputDataBit 来获取位状态,该函数输入GPIO 端口及引脚号,函数返回该引脚的电平状态,高电平返回1,低电平返回0。Key_Scan 函数中以GPIO_ReadInputDataBit 的返回值与自定义的宏“KEY_ON”对比,若检测到按键按下,则使用while 循环持续检测按键状态,直到按键释放,按键释放后Key_Scan 函数返回一个“KEY_ON”值;若没有检测到按键按下,则函数直接返回“KEY_OFF”。若按键的硬件没有做消抖处理,需要在这个Key_Scan 函数中做软件滤波,防止波纹抖动引起误触发。


4. 主函数

接下来我们使用主函数编写按键检测流程,见代码清单4。

代码清单4 按键检测主函数


代码中初始化LED 灯及按键后,在while 函数里不断调用Key_Scan 函数,并判断其返回值,若返回值表示按键按下,则反转LED 灯的状态。


下载验证

把编译好的程序下载到开发板并复位,按下按键可以控制LED 灯亮、灭状态


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    ”模型实现按键控制LED反转,当然其中的"Switch"模型去掉也可以实现同样的效果,读者朋友还可以尝试使用其它模型搭建实现同样效果。 读者朋友可以思考下我们以往使用传统方式开发单片机按键输入......
    STM32数据手册开发实现按键输入功能;上一篇我们讲解了如何通过数据手册和库函数手册开发STM32的LED驱动(也就是通用GPIO的输出功能),今天我们讲解其输入功能实现。接上......
        delayms(1000);   }   return 0; } 是不是比起寄存器点灯方便多啦!!! 二、按键库函数开发 按键库开发要添加库文件:stm32f4xx_gpio.c (1)理解按键输入......
    STM32的GPIO 输入按键检测;硬件设计 按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图1 中的带波纹信号,需要用软件消抖处理滤波,不方便输入......
    如何实现一种基于STM32单片机的电子密码锁设计;一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、矩阵按键、蜂鸣器、EEPROM模块、继电......
    单片机对数据处理完成高精度的测量,随后加上各种算法,完成多种功能的计算;最后在配合液晶显示,触摸输入,语音播报等完成友好的人机交互。 2、系统组成 根据设计的需求,硬件上需要有称重传感器,AD转换电路,单片机最小系统,按键输入......
    为电子爱好者必备的开发工具。本文介绍的系统主要包括以下模块:印刷加热台、主控制板、温度采集系统、液晶LCD 显示模块、按键输入模块、外观结构设计等。控制板是整个系统的核心大脑,将按键输入和温度输入整合后做出处理,通过PID 算法......
    驱动文件key.c 和相关头文件key.h,驱动代码参考按键输入例程 创建FLASH驱动文件stmflash.c 和相关头文件stmflash.h uint16_t STMFLASH_ReadHalfWord......
    器、I/O 端口和其他纯数字电路进行工作。逻辑输入电压还能让I/O 端口输入或输出数字信号的电压。假如我们要使用I/O端口点亮LED 或者让一个按键输入,都会用到逻辑电源输入的电压。 而模拟电源输入......
    、存储器、I/O 端口和其他纯数字电路进行工作。逻辑输入电压还能让I/O 端口输入或输出数字信号的电压。假如我们要使用I/O端口点亮LED 或者让一个按键输入,都会用到逻辑电源输入的电压。 而模拟电源输入......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>