一、硬件设计
在STM32系统中,按键输入是最基础的人机交互方式之一。硬件连接通常采用上拉或下拉电阻方式,防止引脚浮空。常见设计有:
独立按键:每个按键连接一个GPIO引脚,通过10KΩ电阻上拉至VCC,按键另一端接地。按下时引脚被拉低,释放时恢复高电平。
矩阵键盘:通过行列扫描方式实现多按键检测,可显著减少GPIO占用,适合需要多个按键的应用场景。
二、软件实现
1. GPIO初始化
首先需要配置GPIO引脚为输入模式,以上拉输入为例:
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0; // 以PA0为例
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
2. 按键检测方法
简单轮询法:
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
// 按键按下处理
HAL_Delay(20); // 简单消抖
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET); // 等待释放
}
高级消抖算法:
uint8_t Key_Scan(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) {
if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET) {
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET) {
while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);
return 1;
}
}
return 0;
}
三、中断方式实现
对于实时性要求高的应用,可采用外部中断方式:
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
中断服务程序:
void EXTI0_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if(GPIO_Pin == GPIO_PIN_0) {
// 按键中断处理
}
}
四、注意事项
消抖处理:机械按键存在5-10ms的抖动,必须通过硬件或软件方式消除
实时响应:中断方式适合快速响应,但要注意中断服务函数尽量简短
低功耗设计:在电池供电场合,可配置为唤醒中断模式
通过合理设计按键输入模块,可以大大提高STM32系统的人机交互体验,为后续功能实现奠定基础。
五、实战
/* LED 端口初始化 */
LED_GPIO_Config();
/*初始化按键*/
Key_GPIO_Config();
/* 轮询按键状态,若按键按下则反转LED */
while (1) {
if ( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON ) {
/*LED1反转*/
LED1_TOGGLE;
}
if ( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON ) {
/*LED2反转*/
LED2_TOGGLE;
}
}
}
通过按键控制LED;至此按键输入点亮LED灯完成,大家也可以试试中断方式;
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/m0_75187370/article/details/147049783
|