2-STM32GPIO输入之按键
创始人
2024-01-28 15:56:19
0

文章目录

  • 1-硬件设计
    • 1.1 按键消斗
      • 1.1.1 RS触发器
      • 1.1.2 电容滤波
    • 2 按键电路设计
    • 2.1 软件消斗
    • 2.2 硬件消斗
    • 2.3 检测原理
  • 2-软件设计
    • 2.1 软件消斗
      • 2.1.1原理
      • 2.1.2 编程要点
      • 2.1.3 步骤
    • 2.2 代码编写
      • 2.2.1 主程序
      • 2.2.2 按键初始化
      • 2.2.2 按键扫描

本章讲述GPIO输入的应用,使用独立按键来进举例验证。GPIO请查看5 - STM32GPIO详解(看这篇就够了)

本章所用到的库函数:

GPIO_Init、GPIO_WriteBit、
GPIO_ReadOutputDataBit,
GPIO_ReadInputDataBit。

1-硬件设计

1.1 按键消斗

对于普通的按键来说,因为是机械是的原因,在按下弹出时会有一定的波动(触点接触导通需要一点时间),因此在这方面需要进行消除抖动,消除的方式有两种:一种是硬件消斗(主要是RS触发器、电容滤波这两种),一种是软件消斗(加延时最长不要超过10ms,最佳在5-10ms,当然这种延时和按键有关系,主要看机械特性。有的按键需要100ms才可以消除抖动,但对于大部分来说5-10ms就可以)
如下图按键抖动原理:

这里介绍一下这几种方式:

1.1.1 RS触发器

利用RS触发器来吸收按键的抖动。一旦有键按下,触发器立即翻转,触电的抖动便不会再对输出产生影响,按键释放时也一样。RS触发电路消抖电路图如下。
RS触发器(图片来源于网络)

1.1.2 电容滤波

将电容并联在按键的两端,利用电容的放电的延时特性。将产生抖动的电平通过电容吸收掉。从而达到消抖的作用,电容消抖电路图如下图所示。
电容滤波(图片来源于网络)
上面两种方式没有MCU时时做常用的,如果有MCU的话就可以使用延时进行消斗,但是,如果电路设计中有按键消斗了,就不在需要使用软件延时了。

2 按键电路设计

2.1 软件消斗

2.2 硬件消斗

2.3 检测原理

根据电路设计,当按键未按下时,GPIO端口输入状态为低电平,按键两端没有导通;当按键按下时,按键导通,GPIO引脚端口输入高电平(把按键当做一根导线,当按键按下的时候,单片机引脚端口与正极连接,这时候GPIO端口就是连接的正极,同样,没有按键也是一样的道理)。所以检测按键是否按下只需要判断高低电平(以此设计为例**,高电平就是接通,低电平就是断开,如果你的按键是接地的和这相反**)。

2-软件设计

2.1 软件消斗

2.1.1原理

独立按键软件扫描方法,需要在程序运行过程中循环或定时检测按键连接的引脚,①在首次检测到按键有效电平时,②延时10ms(不同按键延时不同)后,③再检测一次引脚电平,如能再次检测到有效电平,则是一次有效按键动作,反之则认为是误操作。

软件消斗一般流程如下:
软件消斗一般流程

2.1.2 编程要点

(1)使能GPIO时钟。调用函数RCC_AHB1PeriphClockCmd()。
(2)初始化GPIO模式。调用函数GPIO_Init()。
(3)操作GPIO,读取引脚状态。调用函数GPIO_ReadInputDataBit();

2.1.3 步骤

1、使能相应片上外设的时钟(非常重要),设计到的文件有
头文件:stm32f4xx_rcc.h
源文件:stm32f4xx_rcc.c
使用的主要函数:
RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
RCC_AHB2PeriphClockCmd(uint32_t RCC_AHB2Periph, FunctionalState NewState)
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState)
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

2、设置对应于片上外设使用的GPIO工作模式。

3、如果使用复用功能,需要单独设置每一个GPIO引脚的复用功能。

4、在应用程序中读取引脚状态、控制引脚输出状态或使用复用功能完成特定功能

2.2 代码编写

2.2.1 主程序

int main(void)
{delay_init(); 	//初始化SysTick,用于延时	LED_Config();	//初始化LED灯的GPIO引脚Key_Config();	//初始化按键的GPIO引脚/*按键控制LED灯*/while (1){	/*按键S扫描判别,高电平有效*/if(Key_Scan(GPIOC,GPIO_Pin_13,1) == KEY_ON){LED_ON;		//点亮LED	}/*按键扫描判别,低电平有效*/if(Key_Scan(GPIOA,GPIO_Pin_13,0) == KEY_ON){LED_OFF;		//熄灭LED	}}
}

2.2.2 按键初始化

void Key_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;	/*开启按键GPIO口的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE)	/*选择按键的引脚*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;/*设置引脚为输入模式*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;   /*设置引脚不上拉也不下拉*///引脚电平受到外部电压影响在这里浮空/上拉/下拉都可以的GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;	/*使用上面的结构体初始化按键*/GPIO_Init(GPIOC, &GPIO_InitStructure);  

2.2.2 按键扫描

初始化按键后,就可以通过检测对应引脚的电平来判断按键状态

#define KEY_OFF	    0
#define KEY_ON		1uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin,uint8_t Key_Lvl)
{			/*检测是否有按键按下*/if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Lvl )//第一次检测电平{	 		delay_ms(10);  	//去抖动if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == Key_Lvl)//第二次检测电平return 	KEY_ON; 	//确认有效按键动作返回elsereturn KEY_OFF;	//无有效按键动作返回}elsereturn KEY_OFF; //无有效按键动作返回
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...