【STM32C5教程】(3)GPIO 按键输入实验
欢迎关注 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

相关新闻

RK3588与Jetson双芯协同:边缘AI智能盒子硬件架构与推理性能实测

RK3588与Jetson双芯协同:边缘AI智能盒子硬件架构与推理性能实测

1. 从一块开发板到一台“智能盒子”:我为什么盯上了这个组合前阵子有个做边缘计算的朋友甩给我一个链接,说“你看看这个,RK3588加Jetson的AI盒子,有点意思”。我当时第一反应是:这俩放一起?RK3588是瑞芯微的…

2026/10/13 10:22:52 阅读更多 →
从‘补全‘到‘任务托管‘:编码Agent进入云端化+多子代理阶段,开发者要不要把整个任务交出去?

从‘补全‘到‘任务托管‘:编码Agent进入云端化+多子代理阶段,开发者要不要把整个任务交出去?

从“补全”到“任务托管”:编码 Agent 进入云端化 多子代理阶段,开发者要不要把整个任务交出去? 一、正在发生的变化:Agent 不再只是“更聪明的补全” 如果你还在把编码 Agent 理解成“自动补全的高级版”,那么这个…

2026/10/13 10:22:52 阅读更多 →
Android RTSP播放Demo完整拆解:选型、参数配置与高频避坑指南

Android RTSP播放Demo完整拆解:选型、参数配置与高频避坑指南

简介:一份可直接运行的 Android RTSP 播放示例工程,面向需要在直播、网络摄像头或视频监控等场景中接入实时流媒体的 Android 开发者,既适合入门学习也适合快速原型验证;其核心通过 MediaPlayer 加载 rtsp:// 地址,完整…

2026/10/13 10:22:52 阅读更多 →

最新新闻

MySQL慢查询定位与索引设计:EXPLAIN与B+树实战全解析

MySQL慢查询定位与索引设计:EXPLAIN与B+树实战全解析

接手线上业务系统这几年,最让我头疼的问题之一就是MySQL慢查询。明明功能开发完了、测试也过了,一到流量高峰期,几个核心接口突然就卡了几秒,数据库CPU飙高,紧接着就是连接数打满、应用报错。排查下来,十有…

2026/10/13 11:00:03 阅读更多 →
ASIO2WASAPI:让普通声卡也能跑低延迟ASIO的桥接实践

ASIO2WASAPI:让普通声卡也能跑低延迟ASIO的桥接实践

简介:ASIO2WASAPI 是面向 Windows Vista 及以上系统的开源音频驱动方案,为音乐制作人与音频工程师提供硬件无关的 ASIO 支持。它借助中间层将 ASIO 协议和 Windows 原生 WASAPI 结合,用独占模式逼近硬件极限延迟,解决无专用音频接…

2026/10/13 11:00:03 阅读更多 →
JumpServer统一纳管PostgreSQL:从资产配置到安全审计的完整实践

JumpServer统一纳管PostgreSQL:从资产配置到安全审计的完整实践

搞了这么多年运维,数据库资产一直是权限管理里最让人头疼的一环。尤其PostgreSQL这种逻辑库多、角色权限细的系统,直接让人连生产库,账号密码满天飞不说,出事了你连谁干的都查不到。前阵子刚把一套PostgreSQL完整接进了JumpServer…

2026/10/13 11:00:03 阅读更多 →
MySQL Workbench 从下载到实战:安装避坑、连接配置与日常管理技巧

MySQL Workbench 从下载到实战:安装避坑、连接配置与日常管理技巧

最早学数据库那会儿,我一直在黑窗口里敲命令。建表、导数据、改权限全靠手打,一条语句写错就得整条回滚,效率低不说,眼睛也是真遭罪。后来换了 MySQL Workbench,整个体验完全不一样:不用背那么多命令&#…

2026/10/13 11:00:03 阅读更多 →
快速搭建规范开源项目:从零构建可协作可维护的GitHub仓库

快速搭建规范开源项目:从零构建可协作可维护的GitHub仓库

1. 为什么“快速搭建规范开源项目”这件事,比你想象中更值得花时间 “快速在GitHub搭建一个规范的开源项目(一)”——这个标题里藏着三个被新手普遍低估的关键词: 快速 、 规范 、 (一) 。不是“建个…

2026/10/13 11:00:03 阅读更多 →
用帕累托图做线上问题优先级排序:从频次统计到加权决策

用帕累托图做线上问题优先级排序:从频次统计到加权决策

作为负责线上稳定性的工程师,我每天到工位后的第一件事,不是看代码,而是先扫一眼昨夜的问题清单。以前团队排故障优先级基本靠嗓门,谁在群里吼得凶就修谁的;直到我们用帕累托图把问题频次和影响摊开做排序,…

2026/10/13 10:58:59 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →