当前位置: 首页 > 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)
    {
        // 主循环代码...
    }
}

 

 

相关文章:

  • 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
  • 湖南慈利一村干部用AI生成通知并擅自发布,乡纪委立案
  • 终于,俄罗斯和乌克兰谈上了
  • 俄媒:俄乌代表团抵达谈判会场
  • 新城悦服务:独董许新民辞任,新任独董与另两人组成调查委员会将调查与关联方资金往来
  • 从能源装备向应急装备蓝海拓展,川润股份发布智能综合防灾应急仓
  • 佩斯科夫:俄方代表团15日将在伊斯坦布尔等候乌克兰代表团