STM32 HAL库通过一个按键控制LED灯亮灭

本文详细介绍了如何在STM32平台上使用KEY2按键,通过GPIO控制LED灯的开关,并提供了关键函数如key_init和key_scan的实现,以及在主函数中的应用示例。

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

把点亮LED灯的那个项目复制过来并在这个地方创建一个KEY文件夹

 里面放对应的key.c和key.h文件

这里使用KEY2按键

PA0:设置为 输入下拉

PE2-4:设置为输入上拉

key.c

#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"



void key_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;//定义gpio的结构体
    
    __HAL_RCC_GPIOE_CLK_ENABLE();
    
    gpio_init_struct.Pin = GPIO_PIN_2;
    gpio_init_struct.Mode = GPIO_MODE_INPUT;
    gpio_init_struct.Pu
### STM32 HAL 实现按键控制 LED 为了通过STM32 HAL实现按键控制LED功能,可以采用外部中断的方式。下面是一个简单的例子来展示如何配置并编写相应的程序。 #### 配置环境 首先,在STM32CubeMX工具中设置项目参数,选择合适的MCU型号(如STM32F407或STM32F103C8T6),然后启用必要的外设:GPIO用于连接LED按键;EXTI作为外部中断源处理按键事件[^1]。 #### 初始化函数 初始化部分主要涉及两个方面——硬件资源初始化和服务于这些资源的功能模块初始化: ```c // GPIO Initialization Function static void MX_GPIO_Init(void) { /* USER CODE BEGIN GPIO_Init 0 */ /* USER CODE END GPIO_Init 0 */ __HAL_RCC_GPIOA_CLK_ENABLE(); // Enable clock for Port A GPIO_InitTypeDef GPIO_InitStruct = {0}; // Configure button pin as input with pull-up resistor enabled. GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Configure LED pin as output push-pull type without internal resistors. GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 这段代码设置了PA0为输入端口,并启用了下降沿触发的外部中断,而PA5被设定成推挽输出模式用来驱动LED[^2]。 #### 中断服务例程 (ISR) 当按下按钮时会触发一次中断请求,进入对应的中断服务例程执行特定的任务。这里定义了一个全局变量`LedState`保存当前状态,并在每次检测到按键动作后切换该值从而改变LED的状态。 ```c volatile uint8_t LedState = 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_0){ LedState ^= 1; // Toggle the state of variable 'LedState' if(LedState){ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // Turn ON LED }else { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // Turn OFF LED } } } ``` 此段代码实现了每当检测到按键产生的中断信号时就反转LED的工作状态[^3]。 #### 主循环体 最后是主函数中的无限循环结构,它保持应用程序运行而不做任何事情,因为所有的操作都在中断发生时完成。 ```c int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while(1){} } ``` 以上就是利用STM32 HAL实现按键控制LED一个基本实例说明。需要注意的是实际开发过程中还需要考虑去抖动等问题以提高系统的稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

从糕手变成高手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值