stm32基于标准库实现4个IO信号消抖的完整代码
时间: 2024-12-14 07:26:27 浏览: 5
STM32微控制器中,为了处理外部输入信号如按键、中断等可能存在抖动的问题,通常会采用延时或软件滤波的方式来消除这种瞬时波动。这里提供一个基本的示例,展示如何使用标准库函数` HAL_Delay()`以及自定义的延时结构体来实现四个IO信号的消抖。
```c
#include "stm32f1xx_hal.h"
#include <stdint.h>
#include <stdbool.h>
// 定义消抖时间(毫秒)
#define DEBOUNCE_DELAY_MS 50
typedef struct {
GPIO_TypeDef *port; // IO口地址
uint16_t pin; // IO口的引脚编号
bool state; // 信号的状态,0 或 1
volatile bool flag; // 抖动标志位
uint32_t timestamp; // 最近一次检测的时间戳
} DebounceInfo;
DebounceInfo debounce_pins[4]; // 创建四个IO信号的消抖实例
void EXTI_Debounce_IRQHandler(uint16_t GPIO_Pin)
{
for (int i = 0; i < 4; i++) {
if (GPIO_Pin == debounce_pins[i].pin) {
debounce_pins[i].flag = true;
debounce_pins[i].timestamp = HAL_GetTick(); // 获取当前系统时间
}
}
}
void EXTI_Callback(uint16_t GPIO_Pin)
{
if (debounce_pins[GPIO_Pin].flag) { // 如果有抖动标志
while (HAL_GetTick() - debounce_pins[GPIO_Pin].timestamp <= DEBOUNCE_DELAY_MS); // 检查是否超过消抖时间
if (!debounce_pins[GPIO_Pin].state && GPIO_ReadInputDataBit(debounce_pins[GPIO_Pin].port, debounce_pins[GPIO_Pin].pin)) { // 当信号从低变高
debounce_pins[GPIO_Pin].state = true;
// 这里可以设置你的IO口操作,比如点亮LED或触发中断
} else if (debounce_pins[GPIO_Pin].state && !GPIO_ReadInputDataBit(debounce_pins[GPIO_Pin].port, debounce_pins[GPIO_Pin].pin)) { // 当信号从高变低
debounce_pins[GPIO_Pin].state = false;
// 这里也可以设置相应的操作
}
debounce_pins[GPIO_Pin].flag = false; // 清除抖动标志
}
}
int main(void)
{
// 初始化GPIO和EXTI
// ...
// 配置EXTI中断,例如按键A配置为上升沿触发
// ...
// 注册EXTI回调函数
HAL_NVIC_EnableIRQ(EXTI_IRQn);
EXTI_Init();
while (1)
{
// 主循环
}
return 0;
}
```
注意:这只是一个简化的示例,实际应用中你需要根据具体的STM32型号和外设连接进行适当的修改,并且确保中断和GPIO配置都已经正确完成。此外,如果需要实时性强的操作,可能还需要考虑硬件级别的中断机制。
阅读全文