历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2019年02月18日 | stm32实现GPIO输入按键检测

2019-02-18 来源:eefocus

1、硬件设计


按键机械触点断开、闭合时,由于按键触点的弹性作用,按键开关不会马上稳定接通或一下就断开,使用按键时就会产生下图中的带纹波信号,需要软件消抖处理滤波



由于用软件消抖处理滤波不方便输入检测,所以提出了如下带有硬件消抖的电路。



从按键的原理图可知,当按键没有被按下时,GPIO引脚通过一个下拉电阻R64使引脚处于低电平状态,当按键被按下时,按键所在的电路导通,VCC通过一个限流电阻R33连接到GPIO引脚,使GPIO引脚的输入状态为高电平,只要我们检测引脚的输入电平为高电平,即可判断按键是否被按下。


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


bsp_keyscan.c中代码如下


#include "bsp_keyscan.h"

 

 

/**

* @brief 配置按键检测用到的I/O口

* @param 无

* @retval         无

*/

void key_GPIO_Config(void)

{


GPIO_InitTypeDef GPIO_key_InitStructure;

RCC_AHB1PeriphClockCmd(key1_GPIO_CLK, ENABLE); //enable AHB1 periphral clock

RCC_AHB1PeriphClockCmd(key2_GPIO_CLK, ENABLE); //enable AHB1 periphral clock


GPIO_key_InitStructure.GPIO_Mode  =  GPIO_Mode_IN;

GPIO_key_InitStructure.GPIO_OType =  GPIO_OType_PP;

GPIO_key_InitStructure.GPIO_PuPd  =  GPIO_PuPd_DOWN;

GPIO_key_InitStructure.GPIO_Speed =  GPIO_Fast_Speed;        //keyscan gpio port register configure


GPIO_key_InitStructure.GPIO_Pin   =  key1_pin;

GPIO_Init(key1_GPIO_PORT,&GPIO_key_InitStructure); //Initializes the gpio according to the specified parameters in the GPIO_key_InitStructure

 

RCC_AHB1PeriphClockCmd(key2_GPIO_CLK, ENABLE); //enable AHB1 periphral clock

GPIO_key_InitStructure.GPIO_Pin   =  key2_pin;

GPIO_Init(key2_GPIO_PORT,&GPIO_key_InitStructure); //Initializes the gpio according to the specified parameters in the GPIO_key_InitStructure

}

 

 

/**按键按下标志宏

  *按按键按下为高电平,设置KEY_ON = 1 , KEY_OFF = 0

*若按键按下为低电平,设置KEY_ON = 0 , KEY_OFF = 1 即可

*/

 

 

/**

* @brief 检测是否有按键按下

* @param GPIOx:具体的端口,x可以是(A...K)

* @param GPIO_PIN:具体的端口位,可以是GPIO_PIN_x(x可以是0...15)

* @retval 按键的状态

* @arg  KEY_ON  :按键按下

* @arg KEY_OFF :按键没按下

*/

uint8_t Key_Scan(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin )

{

if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON)                  //Detect whether the key is pressed

{

while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);     //Loosen the detection

return KEY_ON;

}

else

{

return KEY_OFF;

}

 

}


第一个函数是按键GPIO初始化函数,初始化的流程与LED GPIO 初始化函数 类似,主要区别是引脚的模式。函数执行流程如下:


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


(2) 调用库函数 RCC_AHB1PeriphClockCmd 来使能按键的 GPIO 端口时钟。


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


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


(5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它按键检测时使用的GPIO引脚  第二个函数是按键扫描函数,在这里我们定义了一个 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函数中做软件滤波,防止波纹抖动引起误触发。


bsp_keyscan.h的代码如下


#ifndef _BSP_KEYSCAN_H

#define _BSP_KEYSCAN_H

#include "stm32f4xx.h"

 

/*************************引脚定义***********************/

#define key1_pin   GPIO_Pin_0

#define key1_GPIO_PORT            GPIOA

#define key1_GPIO_CLK   RCC_AHB1Periph_GPIOA

 

 

#define key2_pin   GPIO_Pin_13

#define key2_GPIO_PORT            GPIOC

#define key2_GPIO_CLK   RCC_AHB1Periph_GPIOC

 

 

#define KEY_ON 1

#define KEY_OFF 0

 

void key_GPIO_Config(void);

uint8_t Key_Scan(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin );

 

 

 

#endif

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


主函数代码如下


#include "stm32f4xx.h"

#include "bsp_led.h"

#include "bsp_keyscan.h"

 

 

 

int main (void)

{

LED_Config();

key_GPIO_Config();

while(1)

{

if(Key_Scan(key1_GPIO_PORT,key1_pin) == KEY_ON )

{

LED_R_Toggle;

}

if(Key_Scan(key2_GPIO_PORT,key2_pin) == KEY_ON )

{

LED_B_Toggle;

}

}


}

编译运行后,按下KEY1则红灯状态改变,按下KEY2蓝灯状态改变一次

推荐阅读

史海拾趣

HTC Korea(TAEJIN Technology )公司的发展小趣事

HTC Korea自成立以来,一直致力于国际化布局,与全球各地的合作伙伴建立了良好的关系。目前,HTC的产品已在欧美、亚泰地区大量销售,与各地的电信运营商、芯片制造商等保持了紧密的合作关系。这种广泛的合作伙伴网络为HTC提供了强大的市场支持和技术保障,推动了其在全球范围内的快速发展。同时,HTC还通过了ISO9001及ISO14001质量体系认证,以系统、人性化的管理努力成为行业的佼佼者。

飞翼科技(FEIYI)公司的发展小趣事

HTC Korea自成立以来,一直致力于国际化布局,与全球各地的合作伙伴建立了良好的关系。目前,HTC的产品已在欧美、亚泰地区大量销售,与各地的电信运营商、芯片制造商等保持了紧密的合作关系。这种广泛的合作伙伴网络为HTC提供了强大的市场支持和技术保障,推动了其在全球范围内的快速发展。同时,HTC还通过了ISO9001及ISO14001质量体系认证,以系统、人性化的管理努力成为行业的佼佼者。

Acmelux Taiwan Inc公司的发展小趣事

Acmelux Taiwan Inc公司自成立以来,一直致力于电子技术的研发与创新。早期,公司凭借一款具有独特功能的半导体产品,成功打破了市场的固有格局,赢得了众多客户的青睐。随着技术的不断迭代,Acmelux逐渐在芯片设计、封装测试等领域取得了突破,成为行业内的技术领军者。公司通过持续的研发投入,不仅巩固了现有市场地位,还积极拓展新的应用领域,为公司的长远发展奠定了坚实基础。

DURABLE公司的发展小趣事

面对电子行业的快速变化和技术更新,DURABLE公司始终保持着敏锐的洞察力和创新精神。公司不断加大对新技术和新产品的研发力度,积极探索物联网、人工智能等前沿技术在电子行业的应用。通过一系列的技术创新和产品升级,DURABLE成功实现了从传统电子材料供应商向智能电子解决方案提供商的转型升级。这一转型不仅提升了公司的核心竞争力,还为公司的未来发展奠定了坚实基础。

Hitachi Chemical Co America Ltd公司的发展小趣事

面对电子行业的快速变化和技术更新,DURABLE公司始终保持着敏锐的洞察力和创新精神。公司不断加大对新技术和新产品的研发力度,积极探索物联网、人工智能等前沿技术在电子行业的应用。通过一系列的技术创新和产品升级,DURABLE成功实现了从传统电子材料供应商向智能电子解决方案提供商的转型升级。这一转型不仅提升了公司的核心竞争力,还为公司的未来发展奠定了坚实基础。

ACI [Applied Concepts, Inc.]公司的发展小趣事

在电子行业的激烈竞争中,ACI公司凭借其卓越的技术创新能力脱颖而出。公司研发团队不断攻克技术难关,推出了一系列具有竞争力的电子产品。这些产品不仅性能卓越,而且设计独特,满足了消费者的多样化需求。通过技术创新,ACI成功打开了市场,赢得了消费者的青睐。

问答坊 | AI 解惑

什么是单片机汇编中的子码表,怎么用啊?

什么是单片机汇编中的子码表,怎么用啊?…

查看全部问答>

MIC的电路原理

MIC的电路原理 FET:(场效应管)MIC的主要器件,起到阻抗变换和放大的作用。C:是一个可以通过膜片震动而改变电容量的电容,声电转换的主要部件。C1,C2:是为了防止射频干扰而设置的,可以分别对两个射频频段的干扰起到抑制作用。C1一般是10PF,C2 ...…

查看全部问答>

关于ExpandEnvironmentStrings的问题

请问给为在WinCE下面可以 用ExpandEnvironmentStrings吗? 如果不可以怎么解决? 谢谢了!…

查看全部问答>

分析下这段程序,真的很考人

这本程序是从龚俊S3C44BO_BIOS中的一个小段程序,实在是看不懂,那位能分析下??? if((prog_begin==0)&&overwrite0) {    unsigned int ins;       ins = *(unsigned int *)data_begin;      &n ...…

查看全部问答>

我用API写了一个从一台数字天平串口中读取数据的函数,为一串16进制数组,请问如何转换为天平的读数?

我读取的数据和用“串口调试助手”读取的数据一样,为下列一串16进制字符: 00 00 80 00 80 00 80 F8 78 3C 0F 80 78 3C 0F 00 80 00 80 00 80 F8 78 3C F0 00 80 00 80 78 00 80 78 00 80 80 F8 80 F8 F8 80 80 78 C0 F8 F8 80 00 80 00 80 F8 80 ...…

查看全部问答>

介绍一个单片教程给大家,写的很不错的哦。

本教程适合广大单片机爱好者,高校在校大学生。也适合硬件设计工程师对单片机的学习, 了解.我也是从网上下载的,看完了,和大家分享一下…

查看全部问答>

Wince的具体移植和使用过程

不知道这个版块有没有高手,可以讲一下关于Wince的使用,以便帮助初学者了解Wince。从而带动这个版块的活跃程度…

查看全部问答>

近期程序.STM32+SIM300.短信远程控制

很菜的程序.可是还是调了好几天..需要做远程控制的童鞋拿去吧~最近在看GPRS通信.奈何我没有外网IP....打算休息几天.过阵子再看.PS埋怨句.边准备考研.边学STM32.还要对付一周20来节的课.真的挺累的 …

查看全部问答>

至今还没收到Launchpad,郁闷啊

还没有收到 8月5号  就搞TI杯大赛了  我带4组学生 只有3个launchpad   刚好少一个 ,希望能在比赛前   到我手上  呵呵…

查看全部问答>