2-STM32GPIO输入之按键

简介: 2-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触发电路消抖电路图如下。


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 主程序


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.3 按键扫描

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

      #define KEY_OFF      0#define KEY_ON    1
      uint8_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;   //确认有效按键动作返回     else  return KEY_OFF;  //无有效按键动作返回  }  else  return KEY_OFF; //无有效按键动作返回}
      相关文章
      |
      芯片
      最详细STM32,cubeMX 按键点亮 led
      最详细STM32,cubeMX 按键点亮 led
      191 0
      |
      4月前
      STM32CubeMX 按键控制LED
      STM32CubeMX 按键控制LED
      67 0
      |
      4月前
      stm32f407探索者开发板(八)——按键输入实验--GPIO做输入
      stm32f407探索者开发板(八)——按键输入实验--GPIO做输入
      STM32速成笔记(三)—按键检测
      本文介绍了如何利用STM32进行按键检测,先介绍了原理,后面给出了配置步骤和应用例程。此外,本文还叙述了如何利用一个按键单独控制一个LED亮灭,以及如何检测按键长短按。
      631 0
      STM32速成笔记(三)—按键检测
      |
      6月前
      |
      数据安全/隐私保护 芯片
      【STM32基础 CubeMX】按键的检测
      【STM32基础 CubeMX】按键的检测
      162 0
      No.6 STM32F429IGT6 LED按键检测 按键点灯 (STM32F429/F767/H743)
      No.6 STM32F429IGT6 LED按键检测 按键点灯 (STM32F429/F767/H743)
      使用STM32CubeMX实现按下按键,电平反转
      使用STM32CubeMX实现按下按键,电平反转
      196 0
      使用STM32CubeMX实现按下按键,电平反转
      |
      C语言
      STM32矩阵按键
      STM32矩阵按键
      |
      芯片
      STM32CubeMX按键模块化 点灯
      我们继续讲解 stm32 f103,这篇文章将详细 为大家讲解 如何 使用 按键点亮 RGB 灯。
      158 0