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

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.kler.cn/a/583009.html

相关文章:

  • C# AOT生成的hellowwordEXE运行占用多少内存1-5MB?
  • ESP8266远端可变的UDP传输
  • Java高频面试之集合-09
  • IDEA修改项目的JDK版本(无缝切换8和11)
  • 前端发布缓存导致白屏解决方案
  • SpringBoot实现文件上传
  • Excel两列和依次相减
  • 【C++入门】变量和基本类型
  • 版本控制器Git(2)
  • [数据结构]排序之希尔排序( 缩小增量排序 )
  • upload-labs-master通关攻略(13~16)
  • 计算机视觉|一文读懂NeRF:为3D场景重建带来新突破
  • CMD批处理一些冷门命令,编写windows脚本常用?
  • java每日精进 3.11 【多租户】
  • ST电机库电流采样 三电阻单ADC
  • Oracle VirtualBox安装CentOS 7
  • FFmpeg入门:最简单的音视频播放器(Plus优化版)
  • dns劫持是什么?常见的劫持类型有哪些?如何预防?
  • XML Schema 实例
  • 深入理解 HTML 链接:网页导航的核心元素