打印
[应用相关]

基于STM32的按键输入检测

[复制链接]
248|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、硬件设计
在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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

4229

帖子

0

粉丝