欢迎来到SFWR的博客

训练题——按键部分

Author:Cherry_Ywj

1. 按键读取

CubeMx 配置:

  • 设置任意一 GPIO 口为GPIO_Input

  • 上拉和下拉

    这一步非常重要!如果你期望按键按下时是低电平,那么就需要上拉。如果没有上拉,此时输入引脚呈高阻态,时而会检测到高电平,时而会检测到低电平。

HAL 库相关函数

//读取引脚状态,这里读取的是PA0,高电平返回1,低电平返回0
int statue = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

按键消抖

按键在按下的那一刻是不稳定的,称为抖动

在这里插入图片描述

由于程序跑的很快,抖动的过程中很有可能识别成了多次按键按下,就不是我们想要的效果。相应的办法就是消抖

  • 软件消抖

    软件消抖的方法很简单,就是检测到按键按下时,加个延时函数,然后再检测一次,延时函数往往不用太长,因为抖动的时间也很短

    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0)
    {
        HAL_Delay(10);	//延时10ms
        //再次检测按键是否按下
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==0)
        {
            ...
        }
    }
    
  • 硬件消抖

    在按键两端并联一个电容即可,由于电容两端的电压不能突变,会消除按键按下带来的抖动

    image

2. 外部中断

外部中断的最常见形式是硬件监听一个引脚的信号状态,当该引脚的电平发生翻转时,即出现上升沿或下降沿,触发外部中断并进入中断处理函数。用户则可以在相应的回调函数中进行处理。

CubeMx 配置:

  • 设置某一 GPIO 口为GPIO_EXTIx模式

  • 选择电平触发模式

    如下图所示,最常用的是红色方框内的三个模式:上升沿触发、下降沿触发以及上升沿下降沿都触发。

    image

    :这里和按键检测一样,也需要加上拉或者下拉。如果希望是下降沿触发,即由高电平变为低电平触发中断,应该选择上拉电阻。

  • NVIC(嵌套向量中断控制器)

    在这里设置的是中断优先级,一般说来,对于实时性要求越高的中断,优先级越高。

    由于这里只有一个中断,可以不管。

HAL 库配置:

中断触发后,程序会进入void EXTIx_IRQHandler(void),这里的 x 根据实际引脚有不同的数值。内部有个HAL_GPIO_EXTI_IRQHandler(),该函数主要帮助我们清楚中断标志位等其他内容,这样我们就不需要考虑这些东西,只需考虑用户需要做的事情。

image

现在,找到HAL_GPIO_EXTI_Callback(GPIO_Pin)的定义,发现前面有个__weak,我们需要对该函数重新定义一遍,就会覆盖原本内容。

/**
  * 函数功能: 外部中断回调函数
  * 输入参数: GPIO_Pin:中断引脚
  */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if(GPIO_Pin==KEY1_GPIO_PIN)
  {
      ...
  }
  else if(GPIO_Pin==KEY2_GPIO_PIN)
  {
      ...
  }
}
posted @ 2022-11-13 11:35  SFWR  Views(185)  Comments(0Edit  收藏  举报