通过GPIO_Input完成按键控制LED亮灭

墨山箐
发布于 2025-04-26 / 47 阅读
2
0

通过GPIO_Input完成按键控制LED亮灭

利用ReadPin函数,实现按键的控制LED灯的亮灭。

函数解析

HAL_GPIO_ReadPin( GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin );

该函数可以读取IO引脚的电平,第一个参数是指向端口的指针( GPIOA、GPIOB...), 第二个参数是需要读取的引脚 ( GPIO_PIN_0、GPIO_PIN_1...)

CubeMX工程准备

使用STM32CubeMX创建工程,选择STM32F103C8Tx并配置引脚。设置好RCC与SYS,HCLK为72MHz。

PA0 设置 GPIO_OutputPA2 设置为 GPIO_Input

CLion设置

由于在CLion中创建STM32程序不会生成.ioc文件,在MX中生成后再打开项目

设置下载配置文件

根据ST还是DAP选择相应cfg,需要自己存放到对应文件夹中方便每次项目创建选用

面板配置文件路径 盘符 :\安装路径\OpenOCD-20240916-0.12.0\share\openocd\scripts\board

创建用户文件编写代码

创建与Core文件夹平级文件夹User,创建 Key.c Key.h 文件

在 CMakeLists.txt 中添加头文件路径,确保扫描到此文件夹

# 添加愿文件,在原有文本后面添加
add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT}  User/Key.c)
# 添加包含目录
include_directories(User)

编写程序代码

// Key.c文件内容
#include "Key.h"
// 定义键值读取宏,用于简化GPIO引脚的读取操作
#define  KEY HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2)

/**
 * @brief 键盘初始化函数
 * 
 * 该函数用于初始化键盘,并进行按键检测和去抖处理。如果检测到按键被按下,
 * 则会点亮一个LED(连接在GPIOA的GPIO_PIN_0上),直到按键释放。这样可以避免按键抖动带来的影响。
 */
void key_init() {
    // 检查按键是否被按下
    if (KEY == GPIO_PIN_SET) {
       // 点亮LED,指示按键已被按下
       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
       // 等待按键释放,去抖动处理
       while (KEY == GPIO_PIN_SET);
       // 熄灭LED,按键处理完成
       HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
   }
}


//Key.h 内容
#include "main.h"
void key_init();

主程序调用

//在25行添加文件引用
/* USER CODE BEGIN Includes */
#include  "Key.h"
/* USER CODE END Includes */

//在main方法的while(1)循环中调用方法,在100行
key_init();

硬件接线

根据之前MX中配置模式,将LED负极接入 A0 ,正极接3.3V,按键开关接到 A2 与 GND.

烧录并测试


评论