stm32按键消抖cubeide
时间: 2024-12-26 10:15:50 浏览: 8
### STM32按键消抖处理方法
在STM32CubeIDE环境中实现按键消抖可以通过硬件和软件两种方式来完成。通常情况下,为了简化设计并降低成本,更多采用的是软件消抖方案。
#### 软件消抖原理
当检测到按键状态变化时(例如从高电平变为低电平),并不是立即确认该次操作有效,而是等待一段时间后再读取一次按键的状态。如果在这段时间内按键仍然保持闭合,则认为是一次有效的按下事件;反之则视为噪声干扰而忽略掉这次波动[^1]。
#### 实现步骤说明
- **配置GPIO引脚作为输入**
使用STM32CubeMX工具设置相应的端口为浮空输入模式或上拉/下拉电阻输入模式。
- **编写延时函数**
可以利用SysTick定时器或其他合适的定时机制来提供必要的延迟周期,以便于后续判断按键是否真正被按下了。
- **加入去抖动逻辑**
在主循环里持续监测目标IO口的变化情况,一旦发现有下降沿触发就启动一段固定长度的时间间隔,在此之后再次验证当前水平是否依旧处于激活态从而决定最终的结果。
下面给出具体的C语言源码片段:
```c
#include "main.h"
#define BUTTON_PIN GPIO_PIN_0 /* 定义使用的按钮对应的管脚 */
#define BUTTON_PORT GPIOA /* 定义使用哪个端口 */
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void){
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
uint8_t buttonState = 0;
while (1) {
if(HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN)!=buttonState){ // 如果检测到了改变
HAL_Delay(20); // 延迟一小会儿
if(buttonState != HAL_GPIO_ReadPin(BUTTON_PORT,BUTTON_PIN)){// 再次检查
buttonState=HAL_GPIO_ReadPin(BUTTON_PORT,BUTTON_PIN);// 更新记录
if(!buttonState)// 当前是低电平时执行特定动作
printf("Button Pressed\n");
}
}
}
}
/**
* @brief 配置系统时钟.
*/
void SystemClock_Config(void){
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){
Error_Handler();
}
/** Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK){
Error_Handler();
}
}
/* 初始化GPIO */
static void MX_GPIO_Init(void){
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = BUTTON_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(BUTTON_PORT,&GPIO_InitStruct);
}
```
这段程序展示了如何在一个简单的应用程序中应用上述提到的按键消抖技术。这里采用了`HAL_Delay()`来进行短暂停顿,实际项目可根据需求调整这个值大小以适应不同场景下的响应速度要求[^2]。
阅读全文