STM32使用EXTI触发进行软件消抖(更新中)
在STM32的HAL库中,为了实现按键的软件消抖,通常需要在按键中断处理或轮询程序中加入一定的延时和状态检测逻辑。以下是一个简单的示例,展示了如何使用HAL库来实现按键的软件消抖。
假设你有一个按键连接到GPIO引脚,并且已经配置好了相应的GPIO初始化代码。以下步骤将帮助你实现软件消抖:
-  
定义按键状态变量:
定义一个变量来存储按键的当前状态和上一个状态,以及一个计时器变量来记录按键被检测到的次数。 -  
按键处理函数:
在按键中断服务程序(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)
    {
        // 主循环代码...
    }
} 
