写出stm32按键消抖程序,使用hal库轮询,不用exit
时间: 2024-10-23 09:18:13 浏览: 21
STM32 (基于HAL库)4×4矩阵按键驱动程序
5星 · 资源好评率100%
STM32按键消抖的程序通常会涉及到GPIO配置、中断以及定时处理。以下是一个使用HAL库(Hardware Abstraction Layer)编写的基本示例,用于读取按键输入并消除按键按下瞬间的抖动:
```c
#include "stm32f1xx_hal.h"
#include "stm32f1xx_hal_gpio.h"
// 定义按键和对应的GPIO
#define KEY_PIN GPIO_PIN_0
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_RCC __HAL_RCC_GPIOA_CLK_ENABLE()
// 按键状态标志
volatile uint8_t key_state = GPIO_PIN_RESET;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == KEY_PIN) {
// 防止连续两次触发中断
if ((key_state != GPIO_PIN_SET) && (__HAL_GPIO_READPin(KEY_GPIO_PORT, KEY_PIN) == GPIO_PIN_SET)) {
key_state = GPIO_PIN_SET;
// 这里你可以添加按键事件处理逻辑
// ...例如打印一条消息
while (!__HAL_GPIO_GET_FLAG(KEY_GPIO_PORT, GPIO_PIN_TOFLAGS(KEY_PIN, GPIO_FLAG_RISING))) {} // 轮询直到按键释放
}
}
}
int main(void) {
KEY_GPIO_RCC; // 初始化GPIOA
__HAL_GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStruct); // 设置按键配置
GPIO_InitStruct.Pin = KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 触发模式设置为下降沿
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_EXTI_Init(&EXTI_InitStructure); // 初始化EXTI
// 开启按键中断
HAL_NVIC_EnableIRQ(GPIOA_IRQn);
while (1) {
// 主循环可以做其他事情...
}
return 0;
}
阅读全文