资讯动态

【STM32C5教程】(3)GPIO 按键输入实验

发布时间:2026/10/13 10:22:48 来源:尧图企业网站定制
欢迎关注 youcansxidian【嵌入式软件AI编程】专栏【STM32C5教程】1STM32C5系列介绍【STM32C5教程】2STM32CubeMX2 安装与STM32C5闪灯【STM32C5教程】3GPIO 按键输入实验1. 项目简介1.1 实验目标本实验在 NUCLEO-C542RC 开发板上通过主循环轮询用户按键 B1PC13实现按键控制板载 LED 状态翻转掌握 STM32C5 系列 GPIO 输入与输出的基本用法。功能需求在主循环中轮询用户按键PC13每次有效按下时切换板载 LEDPA5的状态持续按住不重复触发松开后可响应下一次按键消抖时间 20 ms1.2 实验条件硬件NUCLEO-C542RC 开发板支持数据传输的 USB Type-C 线用于连接 ST-LINK 接口软件STM32CubeMX2用于引脚、时钟配置与代码生成VS Code STM32Cube 插件用于编译、烧录、调试2. 硬件说明2.1 NUCLEO-C542RC 开发板NUCLEO-C542RC 是 ST 基于 STM32C542RCT6 推出的 Nucleo-64 开发板。主要特性MCUSTM32C542RCT6Arm Cortex-M33 内核最高主频 144 MHz256 KB Flash64 KB RAM调试器板载 STLINK-V3EC支持大容量存储、虚拟串口和调试端口三种功能用户 LEDLD1连接 PA5用户按键B1连接 PC13复位按键B2扩展接口Arduino Uno V3 和 ST morpho 连接器本实验使用板载的 LD1 和 B1无需额外外设。2.2 引脚说明引脚别名功能方向有效电平PA5LD1板载用户 LEDGPIO 输出高电平点亮PC13B1用户按键GPIO 输入按下为高电平松开为低电平PA5LD1配置为推挽输出输出高电平时 LED 点亮输出低电平时 LED 熄灭。复位后初始状态为低电平LED 熄灭。PC13B1配置为输入模式。PC13 通过外部电阻 R1310K下拉到地按键按下时接 3V3。因此空闲时为低电平按下时为高电平。3. STM32CubeMX2 工程配置3.1 新建工程本实验采用 MCU 方式创建工程即以芯片型号 STM32C542RC 为起点而非开发板方式。进入 MCU 选择界面启动 STM32CubeMX2在首页点击 MCU进入芯片型号选择列表。搜索并选中芯片在 MCU name 输入框中输入 STM32C542RC或完整型号 STM32C542RCT6从筛选出的列表中选择对应型号。填写项目信息输入项目名称 GPIO_Button 和项目保存路径。项目名称避免使用特殊字符路径建议使用纯英文目录。3.2 基础配置工程创建后软件自动进入 Pinout 视图。时钟配置保持默认即可CubeMX2 创建工程后的默认系统主频为48 MHz时钟源为 HSI 分频本实验无需修改。注意本工程的系统时钟为 48 MHz与之前点灯实验144 MHz不同。这是 CubeMX2 的默认配置不影响 GPIO 功能HAL_Delay()仍可正常工作。3.3 GPIO 配置PA5 输出在 Pinout 视图中找到PA5引脚。根据 UM3615 手册向 PA5 写入高逻辑电平“1”即可点亮 LD1。右键点击 PA5选择Assign signal→GPIO把引脚的功能分配给 GPIO 模块。再次右键点击 PA5选择Configure GPIO进入 GPIO 详细配置界面。将 PA5 的Mode设置为Output。保持默认参数Output level 为 LowOutput mode 为 Push PullPull-up/Pull-down 为 No pull-up and no pull-downMaximum output speed 为 Low。在 PA5 的配置项中找到 User Label用户标签输入框填入 LD1。设置别名后CubeMX2 生成的代码中会自动创建对应的宏定义例如 LD1_GPIO_Port 和 LD1_Pin后续在 main.c 中可以直接使用这两个宏来操作 LED无需再手动记忆 GPIOA 和 GPIO_PIN_5。3.4 GPIO 配置PC13 输入在 Pinout 视图中找到PC13引脚。右键点击 PC13选择Assign signal→GPIO。再次右键点击 PC13选择Configure GPIO进入 GPIO 详细配置界面。将 PC13 的Mode设置为Input。保持默认参数Pull-up/Pull-down 为 No pull-up and no pull-down。在User Label输入框中填入B1。本实验采用轮询方式不启用外部中断因此不需要勾选 EXTI 相关选项。3.5 项目配置点击Project Settings进入工程设置页面。在IDE Format下拉选项中选择CMake。在CMake Toolchain下拉选项中选择GCC。确认配置无误后点击Generate Code。CubeMX2 会执行配置检查如果没有错误开始在指定路径下生成 CMake 工程文件。生成完成后项目路径下会出现标准 CMake 工程结构包含Core/、Drivers/、CMakeLists.txt等。4. 编程实现4.1 实现思路采用“检测 → 消抖 → 二次确认 → 翻转 → 等待松开”的轮询方案主循环 │ └─ 读取 PC13 电平 │ ├─ 非按下低电平→ 继续轮询 │ └─ 按下高电平 ├─ HAL_Delay(20ms) 消抖 ├─ 二次确认仍为按下 │ └─ 否 → 视为抖动忽略 ├─ 是 → 有效按下 → 翻转 PA5 状态 └─ 阻塞等待松开读到高电平后才回到轮询各步骤使用的 HAL 函数步骤HAL 函数作用读取按键HAL_GPIO_ReadPin(B1_PORT, B1_PIN)读取 PC13 电平消抖延时HAL_Delay(DEBOUNCE_TIME_MS)延时 20 ms翻转 LEDHAL_GPIO_TogglePin(LD1_PORT, LD1_PIN)切换 PA5 输出电平4.2 关键代码在 VS Code 中打开生成的 CMake 工程找到Core/Src/main.c添加以下代码。1文件头部添加宏定义/* Private define ------------------------------------------------------------*/#defineDEBOUNCE_TIME_MS20u/* 按键消抖时间 */#defineB1_PRESSED_STATEHAL_GPIO_PIN_SET/* 按下时 B1(PC13) 为高电平 */2声明按键扫描函数/* Private functions prototype -----------------------------------------------*/staticvoidButton_Scan(void);3主函数intmain(void){if(mx_system_init()!SYSTEM_OK){return(-1);}else{while(1){Button_Scan();}}}4按键扫描函数/** * brief: Poll user button B1 (PC13) and toggle onboard LED LD1 (PA5) on each * valid press. Debounces the press, and waits for the release so that * holding the button down does not re-trigger. * retval: none */staticvoidButton_Scan(void){if(HAL_GPIO_ReadPin(B1_PORT,B1_PIN)B1_PRESSED_STATE){/* A press is detected, confirm it after the debounce time */HAL_Delay(DEBOUNCE_TIME_MS);if(HAL_GPIO_ReadPin(B1_PORT,B1_PIN)B1_PRESSED_STATE){/* Valid press: toggle the onboard LED */HAL_GPIO_TogglePin(LD1_PORT,LD1_PIN);/* Wait for the release before scanning again */while(HAL_GPIO_ReadPin(B1_PORT,B1_PIN)B1_PRESSED_STATE){}}}}代码说明B1_PORT、B1_PIN、LD1_PORT、LD1_PIN四个宏由 CubeMX2 生成在generated/hal/mx_gpio_default.h通过main.h链入在main.c中可直接使用。第 1 步检测到高电平后第 2 步延时 20 ms 消抖第 3 步再次确认。两次都为低电平才判定为有效按下。第 4 步翻转 LED 状态。第 5 步的while空循环阻塞等待按键松开这是实现“按住不重复触发”的关键。松开后回到外层可响应下一次按下。5. 编译烧录与运行测试5.1 编译与烧录打开工程用 VS Code 打开 CubeMX2 生成的 CMake 工程文件夹如GPIO_Button_cmake。编译点击 VS Code 底部状态栏的Build按钮或使用命令面板执行 CMake 构建。编译完成后终端应输出Build finished with exit code 0无 error。3.连接开发板用支持数据传输的 USB Type-C 线连接 NUCLEO-C542RC 的 ST-LINK USB 口CN1。4.确认设备识别打开设备管理器在“端口 (COM 和 LPT)”下应能看到STLink COMx。5.烧录点击 VS Code 中的 运行按钮将固件下载到开发板。5.2 运行与测试烧录完成后程序自动开始运行。依次验证以下功能初始状态复位开发板按下黑色复位按键 B2观察 LD1。复位后 LD1 应保持熄灭状态说明 GPIO 初始化正确。按键响应按下蓝色用户按键 B1观察 LD1 是否翻转。如果当前 LED 熄灭按下后应点亮再次按下LED 应熄灭。反复测试几次确认每次按下都能可靠触发翻转。按住不重复按住 B1 不放观察 LD1。LED 应该只翻转一次持续按住期间不会再翻转。松开可再响应松开 B1 后再次按下LD1 应能再次翻转说明等待松开的逻辑正常。消抖验证快速连续按下 B1 多次观察 LED 响应。如果消抖正常每次按下只触发一次翻转不会因按键机械抖动产生多次翻转。测试结果按一下 B1LD1 翻转一次持续按住 B1LD1 只翻转一次不重复触发松开后再次按下LD1 再次翻转快速连按无明显误触发20 ms 消抖生效功能正常。6. 小结本实验通过轮询方式实现了按键控制 LED 状态翻转掌握了 STM32C5 GPIO 输入与输出的基本配置和使用方法。核心逻辑可以概括为“检测 → 消抖 → 二次确认 → 翻转 → 等待松开”。其中“等待松开”这一步是保证按住不重复触发、松开可再响应的关键不可缺少。需要注意的是本方案采用阻塞式轮询HAL_Delay(20)消抖和等待松开的空循环都会占用主循环期间无法执行其他任务。对于功能简单的应用这是可接受的如果系统还有其他实时任务建议改用外部中断方式或非阻塞状态机。下一篇将介绍用外部中断实现同样的按键控制功能。版权声明欢迎关注 youcansxidian【嵌入式软件AI编程】专栏转发必须注明原文链接【STM32C5教程】3GPIO 按键输入实验 (https://youcans.blog.csdn.net/article/details/167586577)Copyright by ai4mcuqq.com 2026Crated2026-10

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑