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

STM32使用EXTI触发进行软件消抖(更新中)

        在STM32的HAL库中,为了实现按键的软件消抖,通常需要在按键中断处理或轮询程序中加入一定的延时和状态检测逻辑。以下是一个简单的示例,展示了如何使用HAL库来实现按键的软件消抖。

        假设你有一个按键连接到GPIO引脚,并且已经配置好了相应的GPIO初始化代码。以下步骤将帮助你实现软件消抖:

  1. 定义按键状态变量
    定义一个变量来存储按键的当前状态和上一个状态,以及一个计时器变量来记录按键被检测到的次数。

  2. 按键处理函数
    在按键中断服务程序(ISR)或轮询函数中,实现按键检测和软件消抖逻辑。

以下是一个简单的代码示例:

// 定义按键状态变量
typedef enum {
    BUTTON_RELEASED,
    BUTTON_PRESSED,
    BUTTON_DEBOUNCED
} ButtonState_t;
 
ButtonState_t currentButtonState = BUTTON_RELEASED;
ButtonState_t previousButtonState = BUTTON_RELEASED;


uint32_t debounceTimer = 0;
 
// 消抖延时(毫秒)
#define DEBOUNCE_DELAY 50

// 按键处理函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == BUTTON_PIN)
    {
        // 检测按键状态变化
        if (HAL_GPIO_ReadPin(BUTTON_GPIO_PORT, BUTTON_PIN) == GPIO_PIN_RESET)
        {
            // 按键被按下
            currentButtonState = BUTTON_PRESSED;
            debounceTimer = HAL_GetTick(); // 记录当前时间
        }
        else
        {
            // 按键被释放
            if ((HAL_GetTick() - debounceTimer) > DEBOUNCE_DELAY)
            {
                // 如果在消抖延时后按键仍然保持释放状态,则确认按键释放
                currentButtonState = BUTTON_RELEASED;
            }
        }
 
        // 检查状态变化以确认按键动作
        if (currentButtonState == BUTTON_PRESSED && previousButtonState == BUTTON_RELEASED)
        {
            // 按键从释放到按下的动作
            // 在这里添加按键按下时要执行的代码
        }
        else if (currentButtonState == BUTTON_RELEASED && previousButtonState == BUTTON_PRESSED)
        {
            // 按键从按下到释放的动作
            // 在这里添加按键释放时要执行的代码
        }
 
        // 更新上一个状态
        previousButtonState = currentButtonState;
    }
}
 
int main(void)
{
    HAL_Init();
    MX_GPIO_Init();
 
    // 其他初始化代码...
 
    while (1)
    {
        // 主循环代码...
    }
}

 

 

http://www.dtcms.com/a/64425.html

相关文章:

  • CDefView::_GetPIDL函数分析之ListView_GetItem函数的参数item的item.mask 为LVIF_PARAM
  • Linux_17进程控制
  • 某快餐店用户市场数据挖掘与可视化
  • 强大的数据库DevOps工具:NineData 社区版
  • 使用Dockerfile构建一个Docker镜像
  • 达梦数据库-学习-10-SQL 注入 HINT 规则(固定执行计划)
  • 状态模式的C++实现示例
  • VX iOS分析随记
  • 深度学习基础-onnxruntime推理模型
  • LLM推理和优化(1):基本概念介绍
  • 毛利率计算方式
  • AI心情日记后端迁移K8s部署全流程
  • Linux之系统文件目录理解
  • 紧急救援!MySQL数据库误删后的3种恢复方案
  • 一种改进的Estimation-of-Distribution差分进化算法
  • 19 | 实现身份认证功能
  • 实现客户端的网络不影响主线程且随时与服务器通信
  • (每日一题) 力扣 2418. 按身高排序
  • Java多线程与高并发专题——阻塞和非阻塞队列的并发安全原理是什么?
  • H.264语法结构分析之frame_cropping_flag
  • PySide(PyQT)的mouseMoveEvent()和hoverMoveEvent()的区别
  • 关于Flutter中两种Widget的生命周期详解
  • JQuery
  • 泛微ecode的页面开发发送请求参数携带集合
  • 嵌入式八股C语言---面向对象篇
  • Linux多进程学习
  • 【JavaWeb学习Day25】
  • Java 大视界 -- Java 大数据在智能安防视频摘要与检索技术中的应用(128)
  • 1.8 双指针专题:四数之和
  • 销售易CRM:赋能企业销售与客户管理的数字化升级