当前位置: 首页 > article >正文

【STM32】GPIO输入(按键)

目录

    • 一、如何分辨GPIO输入使用什么电频
    • 二、输入抖动问题如何消抖
    • 三、示例代码

一、如何分辨GPIO输入使用什么电频

先看原理图
在这里插入图片描述
即可知道他的初始输入状态需要高电平
在这里插入图片描述
判断可知使用上拉输入

二、输入抖动问题如何消抖

  • 电路图中, 按键输入有额外的电容电阻, 是为了消抖

在这里插入图片描述

  • 消抖方案:

    • 硬件消抖1, RC电路

    • 硬件消抖2, 施密特触发器
      在这里插入图片描述

    • 软件消抖: 延时法, 状态法, 统计法

一般软硬件配合

三、示例代码

.h

#ifndef _DRV_BTN_H_
#define _DRC_BTN_H_

#include "stm32f10x.h"
#include "drv_systick.h"

#define BTN_K1_Port GPIOA
#define BTN_K2_Port GPIOC
#define BTN_K1_Pin GPIO_Pin_0
#define BTN_K2_Pin GPIO_Pin_13


/**
 * @brief 初始化
 * 
 */
void BTN_Init(void);

/**
 * @brief 按下后谈起
 * 
 * @param keyport 
 * @param keypin 
 * @return ErrorStatus 
 */
ErrorStatus BTN_IsClicked(GPIO_TypeDef *keyport,uint16_t keypin);

/**
 * @brief 是否按下
 * 
 * @param keyport 
 * @param keypin 
 * @return ErrorStatus 
 */
ErrorStatus BTN_IsPressed(GPIO_TypeDef *keyport,uint16_t keypin);


/**
 * @brief 是否放开
 * 
 * @param keyport 
 * @param keypin 
 * @return ErrorStatus 
 */
ErrorStatus BTN_IsReleased(GPIO_TypeDef *keyport,uint16_t keypin);

#endif

.c

#include "drv_btn.h"

void BTN_Init(void)
{
    //RCC时钟配置
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC,ENABLE);

    GPIO_InitTypeDef BTN_InitStruct;

    BTN_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    BTN_InitStruct.GPIO_Pin = BTN_K1_Pin;
    GPIO_Init(BTN_K1_Port, &BTN_InitStruct);

    // 配置K2
    BTN_InitStruct.GPIO_Pin = BTN_K2_Pin;
    GPIO_Init(BTN_K2_Port, &BTN_InitStruct);

}


ErrorStatus BTN_IsClicked(GPIO_TypeDef *keyport,uint16_t keypin)
{
    uint8_t ret;

    // 先判断是否按下, 注意按下是高电平
    ret = GPIO_ReadInputDataBit(keyport, keypin);
    if (!ret)
        return ERROR;

    // 如果当前是按下, 开始等待10ms
    MYSTK_DelayMs(10);
    // 再次判断
    ret = GPIO_ReadInputDataBit(keyport, keypin);
    if (!ret)
        return ERROR;

    // 如果仍然是按下, 再等待弹起
    while (0 != GPIO_ReadInputDataBit(keyport, keypin))
    {
    }
    return SUCCESS;
}

ErrorStatus BTN_IsPressed(GPIO_TypeDef *keyport, uint16_t keypin)
{
    uint8_t ret;

    ret = GPIO_ReadInputDataBit(keyport, keypin);
    if (!ret)
        return ERROR;

    return SUCCESS;
}

ErrorStatus BTN_IsReleased(GPIO_TypeDef *keyport, uint16_t keypin)
{
    uint8_t ret;

    ret = GPIO_ReadInputDataBit(keyport, keypin);
    if (ret)
        return ERROR;
    return SUCCESS;
}


http://www.kler.cn/a/613650.html

相关文章:

  • 交换机与路由器的区别:深入解析
  • 新手村:逻辑回归-理解04:熵是什么?
  • # 线性代数:660习题总结660# 宋浩讲解视频
  • 安装docker版jira8.0.2
  • Go 语言标准库中reflect模块详细功能介绍与示例
  • 如何使用 GPT-4o API 实现视觉、文本、图像等功能 附赠gpt升级和4o额度购买
  • OPPO Pad 4 Pro图赏,轻薄大屏,多面出色
  • QT四 资源文件;绘图;绘图设备;qpixmap 和 qimage 转换;QPixmap、QBitmap、QImage和 QPicture的区别
  • Golang中间件的原理与实现
  • 使用 Selenium 构建简单高效的网页爬虫
  • Docker Compose 基础知识
  • rnn的ho的维度 (num_layers * num_directions, batchsize, hidden_size)
  • 付账问题 | 第9届蓝桥杯省赛C++A组
  • Kafka 偏移量
  • 安卓车载app面经
  • 嵌入式单片机程序的映像文件解读
  • idea中如何使用git
  • git在实践使用中的操作流程
  • Java----用正则表达式爬取数据
  • SpringCloud Hystrix的用法详解