当前位置: 首页 > news >正文

STM32HAL 快速入门(二):用 CubeMX 配置点灯程序 —— 从工程生成到 LED 闪烁

前言

大家好,这里是 Hello_Embed。上一篇笔记我们做好了点灯的准备工作,了解了硬件原理和控制逻辑。本篇将通过 STM32CubeMX 工具,一步步配置 GPIO 引脚、生成工程,并编写代码实现 LED 点亮与闪烁,带你掌握 HAL 库开发的基础流程。

一、用 CubeMX 生成基础工程

STM32CubeMX 是 HAL 库开发的核心工具,能通过图形化配置自动生成初始化代码。首先生成一个空工程,方便后续对比配置前后的差异。

步骤 1:添加芯片包并选择芯片
  • 打开 CubeMX,点击 “ACCESS TO MCU SELECTOR” 添加芯片包:
    请添加图片描述
  • 搜索并选择 “STM32F103C8T6” 芯片
    请添加图片描述
步骤 2:配置工程参数
  • 点击 “Project Manager”,命名工程并通过 “Browse” 选择存放路径;
  • “Toolchain/IDE” 选择 “MDK-ARM”(适配 Keil)
    请添加图片描述
  • 左侧 “Code Generator” 中勾选 “Generate peripheral initialization as a pair of .c/.h files per peripheral”(为每个外设生成独立的.c 和.h 文件
    请添加图片描述
步骤 3:生成工程并配置烧录器
  • 点击 “GENERATE CODE” 生成工程,在指定文件夹中可查看生成的文件;
  • 用 Keil 打开工程,编译无错误后,配置烧录器:
    • 点击 “魔法棒”→“Debug”,选择 “ST-Link Debugger”;
    • 点击 “Settings”→“Flash Download”,勾选 “Reset and Run”(烧录后自动运行);
    • “Pack” 中取消 “Enable” 勾选(避免不必要的设备包检查)。
      这是 CubeMX 生成工程的通用烧录配置,后续可直接复用。
二、配置 GPIO 引脚:实现 LED 点亮

接下来通过 CubeMX 配置 PC13 引脚(连接 LED),生成初始化代码。

步骤 1:配置 PC13 为输出引脚
  • 回到 CubeMX,进入 “Pinout & Configuration”→“System Core”→“GPIO”;
  • 右侧引脚图中搜索 “PC13”,点击该引脚并选择 “GPIO_Output”(配置为输出模式)。
步骤 2:对比配置前后的工程差异

重新生成代码后,对比空工程可见:

  • 新增了GPIO.cGPIO.h文件,包含 GPIO 的初始化代码;
  • main.c中自动调用了MX_GPIO_Init()函数,完成 GPIO 的初始化。
步骤 3:解析MX_GPIO_Init()函数

右击MX_GPIO_Init()选择 “查找定义”,函数内容如下:

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOC_CLK_ENABLE();  // 使能GPIOC时钟/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);  // 初始化为低电平/*Configure GPIO pin : PC13 */GPIO_InitStruct.Pin = GPIO_PIN_13;          // 引脚13GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式GPIO_InitStruct.Pull = GPIO_NOPULL;         // 无上下拉GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;// 低速模式HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);     // 应用配置
}

该函数对应了点灯的前三步核心操作(见上篇笔记):

  1. 使能 GPIO 模块__HAL_RCC_GPIOC_CLK_ENABLE()开启 GPIOC 时钟;
  2. 引脚功能选择:通过结构体配置,将 PC13 设置为 GPIO 功能;
  3. 配置方向GPIO_MODE_OUTPUT_PP设置为输出模式。
    其中,“先设置引脚为低电平” 是为了避免配置输出模式时的电平不确定 —— 提前定义初始电平,确保模式切换瞬间输出已知状态。
三、编写代码:实现 LED 点亮与闪烁

初始化完成后,只需控制 PC13 的输出电平,即可实现 LED 的亮灭与闪烁。

步骤 1:点亮 LED

根据 HAL 库手册,用HAL_GPIO_WritePin()函数设置电平:
请添加图片描述
需要注意的是,我们的代码最好写在用户代码区,这是因为每次用CubeMX生成工程时会覆盖配置文件内除用户代码区外的代码,以下是部分用户代码区,都用相关注释标注了:

  /* USER CODE BEGIN Init *//* USER CODE END Init */.../* USER CODE BEGIN 2 *//* USER CODE END 2 */.../* USER CODE BEGIN WHILE */
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */  
  • 点亮 LED(低电平):HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  • 将该语句放入main()函数的while(1)循环中,编译烧录后,PC13 对应的 LED 点亮
    请添加图片描述
步骤 2:实现 LED 闪烁

直接交替设置高低电平会因切换太快导致 LED 看似常亮(人眼视觉暂留效应),需添加延时:

while (1)
{// 点亮LED(低电平)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);HAL_Delay(500);  // 延时500ms// 熄灭LED(高电平)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);HAL_Delay(500);  // 延时500ms/* USER CODE END 3 */
}

HAL_Delay(500)提供 500ms 延时,使亮灭周期达到 1 秒,人眼可清晰观察到闪烁效果。

注意事项
  1. ST-Link 连接:确保接线正确(VCC、GND、SWCLK、SWDIO 对应连接);
  2. 复位问题:部分最小系统板需按复位键(红色按键)才能启动程序;
  3. 代码保护区域:CubeMX 重新生成代码时会覆盖配置文件,用户代码需写在/* USER CODE BEGIN X *//* USER CODE END X */之间,避免被覆盖。
结尾

本文通过 CubeMX 完成了 LED 点灯的全流程:生成工程、配置 GPIO、解析初始化函数,最终实现了 LED 点亮与闪烁。核心是理解 HAL 库函数如何对应底层硬件操作(如__HAL_RCC_GPIOC_CLK_ENABLE()使能时钟、HAL_GPIO_WritePin()控制电平)。
下一篇笔记,我们将深入 HAL 库的本质,聊聊这些函数背后的底层实现逻辑。Hello_Embed 继续带你吃透 STM32HAL 开发,敬请期待~

http://www.lryc.cn/news/613962.html

相关文章:

  • 如何在Vue中使用拓扑图功能
  • 相机坐标系与世界坐标系的点相互转换:原理、可视化与实践
  • HTML 与 CSS:从 “认识标签” 到 “美化页面” 的入门指南
  • Numpy科学计算与数据分析:Numpy数据分析与图像处理入门
  • 使用Python提取PDF大纲(书签)完整指南
  • Date、Calendar、LocalDateTime:Java 处理时间的类该怎么选?
  • 【网络自动化】利用Python脚本与计划任务,实现H3C/HPE设备配置无人值守备份
  • 安装向量数据库chromadb
  • Java+uniapp+websocket实现实时聊天,并保存聊天记录
  • mac笔记本如何重新设置ssh key
  • React Hooks 完全指南:从概念到内置 Hooks 全解析
  • 五种IO模型与⾮阻塞IO
  • leetcode1456:定长子串中元音的最大数目(定长滑动窗口)
  • 云平台运维工具 —— 阿里云原生工具
  • 云原生时代的 Linux:容器、虚拟化与分布式的基石
  • react的form.resetFields()
  • 人工智能之数学基础:事件独立性
  • Java中重写和重载有哪些区别
  • MySQL vs PostgreSQL 深度对比:为你的新项目选择正确的开源数据库 (2025)
  • LVS高可靠
  • Java-注解
  • Azure OpenAI gpt5和AWS Secrets Manager构建智能对话系统
  • Windows10中wls2因网络问题无法拉取Docker/Podman容器镜像
  • mysql复制连接下的所有表+一次性拷贝到自己的库
  • 深入解析C++流运算符(>>和<<)重载:为何必须使用全局函数与友元机制
  • 专利服务系统平台|个人专利服务系统|基于java和小程序的专利服务系统设计与实现(源码+数据库+文档)
  • 基于Flask + Vue3 的新闻数据分析平台源代码+数据库+使用说明,爬取今日头条新闻数据,采集与清洗、数据分析、建立数据模型、数据可视化
  • 在 Debian 系统上安装 Redis服务
  • 驾驭数据库迁移:在 Django 与 Flask 中的全流程实战指南
  • Spark01-初识Spark