ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

STM32F103C8T6入门实战:从零实现LED闪烁的完整开发流程

2026/8/21 9:16:07 拓冰建站 浏览量
STM32F103C8T6入门实战:从零实现LED闪烁的完整开发流程 这次我们来看一个针对STM32F103C8T6最小系统的入门级开发实战。对于刚接触STM32的开发者来说从零开始搭建环境、配置引脚、编写第一个程序往往是最大的门槛。这个项目直接切入核心使用STM32CubeMX图形化工具快速完成芯片初始化配置然后在STM32CubeIDE中编写代码最终实现一个最经典的LED闪烁程序。整个过程不绕弯子重点就是“能不能跑起来”以及“如何一步步验证”。对于初学者最关心的几个问题通常是需要什么硬件和软件配置过程复不复杂代码怎么写怎么下载和调试这篇文章会直接回答这些问题。我们将从零开始手把手完成从安装软件、创建工程、配置时钟和GPIO、生成代码到编写逻辑、编译下载、硬件验证的全过程。如果你手头有一块STM32F103C8T6核心板或最小系统板以及一个ST-Link下载器那么跟着本文操作你就能在半小时内看到LED闪烁的效果。本文的重点不是深入讲解STM32的架构而是提供一套可复现的、最小化的操作流程。我们会重点关注STM32CubeMX的配置选项如何影响生成的代码STM32CubeIDE的基本使用方法以及如何排查下载和运行中的常见问题。目标是让你快速建立信心掌握从配置到烧录的完整工作流为后续更复杂的项目打下坚实基础。1. 核心能力速览在开始具体操作之前我们先通过一个表格快速了解完成这个项目所需的核心要素和最终达成的能力。能力项说明目标芯片STM32F103C8T6 (ARM Cortex-M3内核俗称“蓝桥杯”或“最小系统板”常用芯片)开发工具链STM32CubeMX (图形化配置工具) STM32CubeIDE (集成开发环境)主要功能实现配置一个GPIO引脚驱动LED实现周期性闪烁关键技能点使用CubeMX配置时钟树、GPIO使用CubeIDE编写用户代码、编译、下载、调试硬件门槛任意STM32F103C8T6最小系统板、1个LED、1个限流电阻约220Ω、ST-Link V2下载调试器、杜邦线若干软件环境Windows/macOS/Linux需安装Java运行环境供CubeMX使用代码生成CubeMX可生成基于HAL库的初始化代码极大简化底层寄存器操作适合场景嵌入式入门学习、STM32快速原型验证、HAL库开发模式熟悉这个配置组合是目前ST官方主推且对新手最友好的开发方式避免了直接操作寄存器的复杂性也规避了标准外设库Standard Peripheral Library已停止维护的问题。2. 适用场景与使用边界这个LED闪烁项目虽然简单但它是一个标准的“Hello World”程序在嵌入式开发中具有明确的适用场景和边界。它非常适合嵌入式开发初学者作为接触STM32乃至ARM Cortex-M系列MCU的第一个实操项目理解从软件配置到硬件动作的完整链路。快速硬件验证当你拿到一块新的STM32F103C8T6开发板时用这个程序可以最快速地验证核心芯片、电源、下载电路和至少一个GPIO引脚是否工作正常。熟悉HAL库开发流程学习并掌握ST官方推荐的HALHardware Abstraction Layer库开发模式包括如何使用CubeMX生成代码框架以及在何处添加自己的应用逻辑。评估开发工具链测试STM32CubeMX和STM32CubeIDE这一套工具在你自己电脑上的兼容性和易用性。它不适合或需要注意追求极致性能和代码尺寸HAL库为了通用性和易用性在代码尺寸和执行效率上会有一定开销。对于资源极度紧张或对实时性要求极高的场景可能需要直接操作寄存器或使用LLLow-Layer库。学习寄存器级操作如果你想深入理解STM32内部寄存器是如何工作的这个基于HAL库的项目只能作为起点后续需要查阅参考手册Reference Manual和数据手册Datasheet进行深入学习。复杂项目原型虽然本项目简单但其建立的项目框架CubeMX配置 CubeIDE开发是通用的完全可以作为更复杂项目如使用UART、ADC、定时器、中断等的基础。安全与合规边界本项目为纯技术学习与实验所有操作均在自有开发板上进行。请注意任何基于STM32的产品开发若涉及商业用途应遵循STMicroelectronics的软件许可协议并确保硬件设计符合相关电磁兼容EMC和安全规范。3. 环境准备与前置条件在打开软件之前我们需要准备好硬件和软件环境。这是确保后续步骤顺利的基础。3.1 硬件准备主控板STM32F103C8T6最小系统板一块。这是核心通常板载了3.3V稳压芯片、复位电路、Boot选择跳线和所有GPIO引脚。下载调试器ST-Link V2或兼容的DAPLink等。这是连接电脑和开发板的桥梁用于下载程序和调试。确保你有对应的连接线通常为4线SWDIO, SWCLK, GND, 3.3V。LED与电阻一个普通发光二极管LED和一个220Ω的限流电阻。LED长脚为正极阳极短脚为负极阴极。杜邦线若干用于连接。USB线为ST-Link和开发板供电如果开发板无独立供电接口。硬件连接示意图ST-Link的SWDIO接开发板的PA13或SWDIO标识引脚。ST-Link的SWCLK接开发板的PA14或SWCLK标识引脚。ST-Link的GND接开发板的GND。ST-Link的3.3V接开发板的3.3V注意切勿接错到5V。LED正极通过220Ω电阻连接到开发板的某个GPIO引脚如PC13LED负极接开发板的GND。3.2 软件准备STM32CubeMXST官方推出的图形化配置工具。用于选择芯片型号、配置时钟、引脚功能、中间件等并生成初始化代码。下载访问ST官网搜索“STM32CubeMX”下载安装包。安装按照向导安装。安装过程中会提示安装Java Runtime Environment (JRE)如果系统没有请同意安装。固件包管理首次运行CubeMX需要安装芯片对应的固件支持包Firmware Package。在Help-Manage embedded software packages中搜索F1找到STM32F1系列安装STM32Cube FW_F1 V1.x.x选择最新版本即可。STM32CubeIDEST官方推出的基于Eclipse的集成开发环境。它集成了代码编辑、编译、调试GDB和CubeMX配置界面。下载同样在ST官网搜索“STM32CubeIDE”下载。安装它是一个独立的安装包安装过程会设置好编译工具链ARM GCC和调试插件。注意CubeIDE内部已经集成了CubeMX的功能但为了流程清晰本文先使用独立的CubeMX软件进行配置再导入CubeIDE。你也可以直接在CubeIDE内启动CubeMX进行配置。确保你的电脑操作系统Windows 10/11, macOS, Linux满足上述软件的运行要求并且网络通畅以便下载固件包。4. 安装部署与启动方式这里我们分两步走先用独立的STM32CubeMX创建并配置工程然后用STM32CubeIDE打开、编写代码并下载。4.1 使用STM32CubeMX创建工程启动STM32CubeMX点击File-New Project。选择芯片在Part Number搜索框中输入STM32F103C8在列表中选择STM32F103C8Tx。右侧会显示芯片引脚图。点击Start Project。系统核心SYS配置在Pinout Configuration选项卡的左侧分类中找到System Core-SYS。将Debug设置为Serial Wire。这一步至关重要它启用了SWD调试接口否则芯片可能被锁死无法再次下载程序。时钟RCC配置找到System Core-RCC。将High Speed Clock (HSE)设置为Crystal/Ceramic Resonator。这告诉芯片我们使用外部高速晶振通常开发板上焊有8MHz晶振。时钟树Clock Configuration配置点击顶部的Clock Configuration选项卡。这里的目标是将系统时钟SYSCLK配置到芯片的最高运行频率72MHz。通常步骤将HSE旁的分频/倍频路径点亮。在PLL Source Mux选择HSE然后配置PLLMUL为9倍频。最后将SYSCLK的来源选择为PLLCLK。此时HCLK系统时钟应显示为72MHz。其他总线时钟APB1, APB2会自动调整确保APB1不超过36MHz这是F103的限制。如果对时钟树不熟悉一个简单的方法是直接在HCLK的输入框手动输入72然后按回车软件会自动尝试配置一个合理的倍频路径。GPIO引脚配置回到Pinout Configuration选项卡。在芯片引脚图上找到你计划连接LED的引脚例如PC13。左键点击该引脚在弹出的菜单中选择GPIO_Output。此时引脚颜色会变为绿色。在左侧System Core-GPIO中点击刚配置的PC13可以在右侧设置其初始状态和标签。我们将GPIO output level设置为Low低电平LED灭User Label可以设置为LED这样生成的代码中引脚会有更有意义的宏定义。工程管理设置点击顶部的Project Manager选项卡。Project子选项卡Project Name: 输入LED_Blink。Project Location: 选择一个干净的目录存放工程。Application Structure: 选择Basic。Toolchain / IDE:这里非常重要选择STM32CubeIDE。这决定了生成的代码结构和工程文件格式。Code Generator子选项卡勾选Generate peripheral initialization as a pair of ‘.c/.h’ files per peripheral这为每个外设生成独立的文件结构更清晰。勾选Backup previously generated files when re-generating这样重新生成代码时你手动修改的文件会被备份避免丢失。生成代码点击右上角的GENERATE CODE。软件会生成完整的工程代码框架。生成成功后点击Open Project会自动在STM32CubeIDE中打开该工程。如果未自动打开记住工程保存的路径。4.2 在STM32CubeIDE中打开与配置如果CubeMX自动打开了工程CubeIDE会启动并加载。如果没有手动启动STM32CubeIDE通过File-Open Projects from File System...选择刚才生成的工程目录包含.project文件的那个目录导入。首次打开IDE可能会自动构建索引。在左侧Project Explorer视图中你可以看到完整的工程结构。Core/Inc和Core/Src存放用户应用代码和头文件。main.c就在这里。DriversSTM32 HAL库和板级支持包。STM32F103C8TX_FLASH.ld链接脚本定义了内存布局。检查编译目标确保左上角的编译目标Build Target是Debug或Release并且芯片型号正确。至此软件的安装、工程的创建和基本配置已经完成。接下来我们进入核心的代码编写环节。5. 功能测试与效果验证我们的目标是让LED闪烁。这需要在CubeMX生成的代码框架中添加我们的应用逻辑。5.1 编写LED闪烁逻辑在Project Explorer中展开Core/Src双击打开main.c文件。找到main函数。在/* USER CODE BEGIN 2 */和/* USER CODE END 2 */注释之间添加我们的初始化后代码。这是CubeMX为我们预留的安全区域在此处添加的代码在重新生成工程时不会被覆盖。/* USER CODE BEGIN 2 */ /* 用户代码开始 */ /* 这里可以放置系统初始化完成后进入主循环前需要执行的代码 */ /* 例如我们可以先让LED快速闪烁一次表示系统启动 */ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 翻转LED状态 HAL_Delay(100); // 延时100ms HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(100); /* 用户代码结束 */ /* USER CODE END 2 */接下来找到while (1)主循环。在/* USER CODE BEGIN WHILE */和/* USER CODE END WHILE */之间添加LED闪烁的核心逻辑。/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* 用户代码开始 */ HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); // 翻转LED引脚电平 HAL_Delay(500); // 延时500毫秒 // 由于初始化时LED引脚为低电平LED灭。 // 第一次执行TogglePin变为高电平LED亮。 // 延时500ms后再次执行TogglePin变为低电平LED灭。 // 如此循环实现闪烁。 /* 用户代码结束 */ /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */代码解释HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin): 这是HAL库提供的函数用于翻转指定GPIO引脚的电平状态。LED_GPIO_Port和LED_Pin是我们在CubeMX中为PC13设置用户标签LED后自动生成的宏定义分别指向GPIOC和GPIO_PIN_13。使用宏定义提高了代码的可读性和可维护性。HAL_Delay(uint32_t Delay): 提供毫秒级的阻塞延时。该函数依赖于系统滴答定时器SysTick在CubeMX初始化时已自动配置好。5.2 编译工程点击工具栏上的锤子图标Build或使用快捷键CtrlBWindows/Linux/CmdBmacOS进行编译。编译过程会在底部的Console视图中输出信息。如果一切顺利最后会看到类似以下信息Finished building target: LED_Blink.elf ... text data bss dec hex filename 1234 0 16 1250 4e2 LED_Blink.elftext段大小就是程序占用的Flash大小。0 errors, 0 warnings表示编译成功。5.3 下载程序到芯片硬件连接确认确保ST-Link已通过USB连接电脑并且通过SWD接口正确连接到STM32开发板。开发板供电正常通常由ST-Link的3.3V线提供或独立供电。配置调试器在CubeIDE中确保使用的是ST-LINK (OpenOCD)调试配置。通常新建的CubeIDE工程已经默认配置好。开始调试/下载直接下载Load点击工具栏上的虫子图标旁边的下拉箭头选择Debug As-STM32 Cortex-M C/C Application或者直接点击虫子图标。首次运行会弹出调试配置对话框确认Main选项卡下的Project和C/C Application路径正确指向生成的.elf文件然后点击Debug。IDE会先编译如果代码有改动然后将程序下载到芯片Flash并自动进入调试视角。运行程序进入调试视角后程序会暂停在main函数的开始处。点击工具栏上的绿色继续运行按钮或按F8程序开始全速运行。观察现象此时你应该能看到连接在PC13引脚上的LED开始以1秒的周期亮500ms灭500ms闪烁。5.4 功能验证成功标准成功LED按照代码设定的500ms间隔稳定闪烁。开发板无异常发热。失败LED常亮、常灭或不规律闪烁。需要进入排查环节。6. 接口API与批量任务本项目的扩展理解对于LED闪烁这个基础项目本身不涉及对外通信接口如UART、USB或复杂的批量任务处理。但我们可以从这个点出发理解HAL库提供的“API”以及如何组织更复杂的任务。6.1 HAL库GPIO API概览在main.c中我们使用了HAL_GPIO_TogglePin。HAL库为GPIO提供了丰富的API构成了我们控制硬件的“接口”HAL_GPIO_WritePin(GPIOx, GPIO_Pin, PinState): 设置引脚输出高电平(GPIO_PIN_SET)或低电平(GPIO_PIN_RESET)。HAL_GPIO_TogglePin(GPIOx, GPIO_Pin): 翻转引脚电平。HAL_GPIO_ReadPin(GPIOx, GPIO_Pin): 读取输入引脚的电平状态。HAL_GPIO_LockPin(GPIOx, GPIO_Pin): 锁定引脚的配置防止意外修改。这些函数都定义在Drivers/STM32F1xx_HAL_Driver/Inc目录下的stm32f1xx_hal_gpio.h文件中源码在对应的.c文件中。通过查看这些文件可以学习HAL库的编程风格。6.2 模拟“批量任务”——管理多个LED虽然本项目只有一个LED但我们可以通过代码结构来模拟一个简单的“任务调度”为未来扩展做准备。/* 在main.c的/* USER CODE BEGIN PV */区域定义变量 */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ typedef struct { GPIO_TypeDef* port; uint16_t pin; uint32_t interval; // 闪烁间隔 uint32_t lastToggleTime; // 上次翻转时间 } LedTask_t; LedTask_t leds[] { {LED_GPIO_Port, LED_Pin, 500, 0}, // LED0: 500ms间隔 // 可以在此添加更多LED任务例如 // {GPIOC, GPIO_PIN_14, 300, 0}, // 假设PC14接了另一个LED }; const uint8_t ledCount sizeof(leds) / sizeof(leds[0]); /* USER CODE END PV */ /* 在while(1)循环中修改逻辑 */ /* USER CODE BEGIN WHILE */ while (1) { uint32_t currentTime HAL_GetTick(); // 获取系统启动后的毫秒数 for (int i 0; i ledCount; i) { if (currentTime - leds[i].lastToggleTime leds[i].interval) { HAL_GPIO_TogglePin(leds[i].port, leds[i].pin); leds[i].lastToggleTime currentTime; } } /* 可以在这里添加其他非阻塞任务 */ /* USER CODE END WHILE */这段代码引入了基于时间的非阻塞控制。HAL_GetTick()返回系统滴答计数通过比较时间差来控制每个LED的翻转时机。这样主循环可以高效地管理多个任务而不是被HAL_Delay()阻塞住。这是嵌入式系统从简单延时走向实时任务调度的关键一步。7. 资源占用与性能观察对于单片机程序了解其资源占用Flash和RAM是基本要求。CubeIDE在编译后会给出详细数据。7.1 查看编译输出编译成功后在Console视图的最后几行可以看到类似下面的信息text data bss dec hex filename 1234 0 16 1250 4e2 LED_Blink.elftext: 代码和常量数据所占用的Flash大小字节。本例约1.2KB。data: 已初始化的全局变量和静态变量占用Flash存储初值和RAM运行时。bss: 未初始化的全局变量和静态变量占用RAM。dec/hex: 总计的十进制和十六进制大小。STM32F103C8T6拥有64KB的Flash和20KB的RAM。这个LED闪烁程序只占用了极小一部分资源留有大量空间用于后续功能扩展。7.2 性能观察使用调试器STM32CubeIDE内置了强大的调试功能可以用来观察程序运行时的状态。在调试视角下点击虫子图标启动后可以在Variables或Expressions视图中添加要观察的变量如currentTime、leds[0].lastToggleTime等。使用Disassembly视图可以查看C代码对应的汇编指令理解底层执行过程。使用Step Over (F6)、Step Into (F5)、Step Return (F7)等按钮可以单步执行代码观察程序流和变量变化。Register视图可以查看CPU内核寄存器的值对于深入调试非常有帮助。对于简单的LED闪烁可能不需要复杂调试。但当你未来程序出现异常时这些工具是定位问题的关键。8. 常见问题与排查方法在实践过程中你可能会遇到以下问题。这里提供一个排查指南。问题现象可能原因排查方式解决方案CubeMX生成代码失败1. 工程路径包含中文或特殊字符。2. 未安装对应的芯片固件包(F1系列)。3. Java环境异常。1. 检查工程保存路径。2. 在CubeMX中Help-Manage embedded software packages查看。3. 尝试重新安装JRE。1. 使用全英文路径。2. 安装STM32Cube FW_F1固件包。3. 重装或修复Java。编译报错提示找不到头文件或未定义标识符1. 包含路径未正确设置。2. 拼写错误如HAL_GPIO_TogllePin。3. 未包含必要的头文件。1. 检查Core/Inc和Drivers/xxx/Inc是否在项目包含路径中。2. 仔细检查错误行代码的拼写。3. 检查是否包含了main.h它自动包含了其他必要HAL头文件。1. CubeIDE工程通常已自动配置好路径。2. 修正拼写错误。3. 确保在main.c开头有#include “main.h”。下载失败提示“No ST-LINK detected”或“Cannot enter debug mode”1. ST-Link驱动未安装或异常。2. ST-Link与开发板连接错误或接触不良。3. 开发板供电不足。4. 芯片的Debug模式未配置为Serial Wire。1. 检查设备管理器中是否有“ST-LINK”设备是否有感叹号。2. 检查SWDIO、SWCLK、GND、3.3V四根线是否连接正确牢固。3. 尝试给开发板独立供电。4. 检查CubeMX中SYS-Debug配置。1. 重新安装ST-Link驱动可从ST官网下载。2. 重新拔插连接线确保顺序正确。3. 使用外部5V供电或检查ST-Link的3.3V输出能力。4. 在CubeMX中正确配置并重新生成代码。如果芯片已锁需要按住复位键点击下载在连接瞬间释放复位键尝试或使用串口ISP方式擦除。程序下载成功但LED不亮/不闪烁1. LED正负极接反。2. 限流电阻值过大或短路。3. 代码中控制的GPIO引脚与实际连接的引脚不符。4. 程序未运行可能卡在启动或错误处理。1. 用万用表测量LED两端电压或交换正负极试试。2. 检查电阻连接尝试220Ω-1kΩ的电阻。3. 核对main.c中HAL_GPIO_TogglePin使用的端口和引脚宏定义并与硬件连接对比。4. 在main函数开始处设置一个断点看程序能否运行到。1. 确保LED长脚正极接GPIO短脚负极接GND。2. 使用合适的限流电阻。3. 修改代码或硬件连接确保一致。4. 检查系统时钟配置是否正确检查while(1)循环是否正常执行。可尝试在循环开始添加一个GPIO翻转指令用示波器或逻辑分析仪查看引脚是否有波形。LED闪烁频率明显不对太快或太慢系统时钟SYSCLK配置错误导致HAL_Delay延时不准。1. 检查CubeMX中Clock Configuration选项卡确认HCLK是否为72MHz。2. 检查外部晶振HSE是否选择正确开发板上的晶振频率是否与配置一致通常8MHz。1. 在CubeMX中重新正确配置时钟树确保HCLK为72MHzAPB1不超过36MHz。2. 确认硬件晶振频率并在RCC配置中选择对应的源。重新生成代码后自己写的代码不见了代码没有写在/* USER CODE BEGIN */和/* USER CODE END */注释对之间。查看main.c确认代码是否在用户代码区。务必将自定义代码写在CubeMX标记的用户代码区内。如果丢失可以从备份文件.bak或_backup文件夹中恢复。9. 最佳实践与使用建议基于这个入门项目可以总结出一些STM32开发的最佳实践帮助你在后续更复杂的项目中少走弯路。项目目录管理为每个独立的项目创建单独的文件夹并使用CubeMX在该文件夹内生成工程。避免多个项目文件混杂。善用CubeMX的用户代码区这是最重要的习惯。所有你自己的代码变量定义、函数、逻辑都必须放在/* USER CODE BEGIN xxx */和/* USER CODE END xxx */之间。这样当你因外设配置更改而重新生成代码时你的代码会被安全保留。版本控制即使个人学习也建议使用Git等版本控制工具。至少备份Core/Inc和Core/Src目录下的用户代码文件。CubeMX的.ioc配置文件也应纳入版本管理它记录了全部硬件配置。分步测试不要一次性写完所有功能。像本项目一样先让一个最简单的功能如一个LED跑起来确保开发环境、下载通道是通的。然后逐步添加其他外设如按键、串口打印调试信息。利用串口打印调试信息在后续项目中尽早配置USART串口并使用printf重定向到串口。通过电脑端的串口助手查看程序运行状态、变量值这是最有效的调试手段之一。理解HAL库的状态机制HAL库很多函数如HAL_UART_Transmit使用超时或中断、DMA模式。仔细阅读函数说明理解其阻塞Blocking、中断Interrupt或DMA模式的区别和适用场景。查阅官方文档STM32F103的参考手册RM0008、数据手册DS5319和HAL库用户手册UM1850是终极参考资料。遇到寄存器级或硬件细节问题应首先查阅这些文档。硬件排查从电源开始任何硬件不工作的第一步都是用万用表测量电源3.3V、GND是否正常晶振是否起振复位引脚电平是否正确。10. 总结与下一步通过这个STM32F103C8T6的LED闪烁项目我们完整走通了一套标准的、基于STM32Cube生态的开发流程芯片选型 - CubeMX图形化配置时钟、GPIO- 生成代码 - CubeIDE编写逻辑 - 编译 - 下载 - 硬件验证。这个过程看似简单却涵盖了嵌入式开发最核心的环节。最值得尝试的下一步不是去写更复杂的代码而是重复和变体。你可以尝试更换LED引脚在CubeMX中将LED配置到其他引脚如PA1, PB0等重新生成代码仅修改硬件连接验证你是否理解了引脚配置的映射关系。改变闪烁模式修改代码实现快闪100ms、慢闪1s、或者摩尔斯电码式的闪烁。添加一个按键配置另一个GPIO为输入模式连接一个按键。实现“按下按键LED亮松开按键LED灭”的功能。这会涉及到HAL_GPIO_ReadPin函数和输入引脚的上拉/下拉配置。使用定时器中断实现闪烁放弃HAL_Delay这种阻塞方式学习配置一个基本定时器如TIM2在中断服务函数中翻转LED。这将带你进入嵌入式实时性的世界。最容易踩的坑主要集中在开始阶段驱动安装、ST-Link连接、CubeMX的Debug配置以及代码没有写在用户区。只要成功完成了第一个项目这些经验就会成为你的肌肉记忆。这个项目提供的工程框架是通用的。当你下次需要用到UART、I2C、SPI、ADC、PWM等功能时只需在CubeMX中勾选并配置相应的外设代码框架会自动生成你只需要在用户代码区调用HAL库API即可。从点亮一个LED开始你已经拿到了开启STM32世界大门的钥匙。