HAL库开发#02——按键开发

本文详细介绍STM32按键开发的全过程,从原理分析到HAL库函数应用,再到CubeMX配置与MDK编程实践。通过具体代码示例,展示了如何读取GPIO状态,并实现按键扫描与延时防抖,最后通过LED闪烁反馈按键状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#02——按键开发

1.原理分析

在这里插入图片描述

2.HAL库函数在这里插入图片描述

3.1 CubeMX配置在这里插入图片描述

3.2MDK编程在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

#define KEY2 HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY4 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5)

void Scan_Keys()
{
    if(KEY2 == GPIO_PIN_RESET)
    {
        HAL_Delay(5);
        if(KEY2 == GPIO_PIN_RESET)
        {
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);
            while(KEY2 == GPIO_PIN_RESET);
        }
    }
    if(KEY3 == RESET)
    {
        HAL_Delay(5);
        if(KEY3 == RESET)
        {
            while(KEY3 == RESET);
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
        }
    }
    if(KEY4 == 0)
    {
        HAL_Delay(5);
        if(KEY4 == 0)
        {
            HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9|GPIO_PIN_8,GPIO_PIN_RESET);
            while(KEY2 == 0);
        }
    }
}
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    Scan_Keys();
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */

注:
这是我的学习笔记 , B站视频(av号:av87017878)
这个UP的原博客为:https://www.xmf393.com/2020/02/10/20200210/
链接: link.

### 配置 EXTI 中断以实现按键控制 LED 灯 #### 使用 STM32 HAL 配置 EXTI 中断 为了使用外部中断线 (EXTI) 来响应按键并控制 LED 的状态变化,需按照如下方法进行配置: #### 初始化 GPIO 和 EXTI 在 `main.c` 文件中,首先需要初始化 GPIO 口用于连接按键和 LED。这可以通过 STM32CubeMX 自动生成的代码来完成。 ```c // 在 main 函数之前定义全局变量 extern UART_HandleTypeDef huart2; GPIO_InitTypeDef GPIO_InitStruct = {0}; void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { // 初始化所有MCU外设... HAL_Init(); SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); while (1) { // 主循环体 } } ``` 接着,在 `MX_GPIO_Init()` 函数内指定哪些引脚作为输入(按键)以及输出(LED)。对于按键来说,通常会启用上拉或下拉电阻,并将其模式设定为 IT_RISING 或者 IT_FALLING 以便触发上升沿/下降沿中断事件[^1]。 #### 设置 EXTI 中断服务程序 为了让特定的按键按下能引起相应的动作,还需要编写一个专门处理这些事件的服务函数——即所谓的 "回调" 函数。该函数会在每次检测到有效的边沿信号时被调用执行。 ```c /* USER CODE BEGIN PV */ uint8_t led_state = 0; // 记录当前LED的状态 /* USER CODE END PV */ /** * @brief This function handles External lines interrupt. */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == KEY_BUTTON_PIN){ switch(led_state){ case 0: HAL_GPIO_WritePin(LED_RED_PORT, LED_RED_PIN, GPIO_PIN_SET); led_state++; break; case 1: HAL_GPIO_WritePin(LED_GREEN_PORT, LED_GREEN_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_RED_PORT, LED_RED_PIN, GPIO_PIN_RESET); led_state++; break; case 2: HAL_GPIO_WritePin(LED_BLUE_PORT, LED_BLUE_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_GREEN_PORT, LED_GREEN_PIN, GPIO_PIN_RESET); led_state=0; break; } } } ``` 上述代码片段展示了如何利用 HAL 提供的 API 创建了一个简单的状态机逻辑,每当接收到由按键产生的中断请求时就会改变一次 LED 显示的颜色顺序红->绿->蓝->重复此过程[^2]。 #### 注册中断向量表项 最后一步是在启动文件 (`startup_stm32f4xx.s`) 中注册对应的 IRQ 处理器入口地址至 NVIC 向量表里去。不过当采用标准外设或者 HAL 开发时,这部分工作往往已经自动完成了;因此开发者只需关注于应用程序级别的编程即可。 ```assembly // 这部分一般不需要手动修改,因为 CubeMX 已经帮我们做好了。 Vectors: .word _estack /* Top of Stack */ .word Reset_Handler /* Reset Handler */ ... .word EXTI0_IRQHandler /* EXTI Line0 Interrupts */ ... ``` 以上就是基于 STM32 HAL 通过 EXTI 实现按键控制 LED 功能的主要步骤和技术要点说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值