ARTICLE DETAIL

建站实战干货

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

STM32嵌入式开发必装四件套:CubeMX、Keil、ST-Link与串口助手详解

2026/10/1 1:32:32 拓冰建站 浏览量
STM32嵌入式开发必装四件套:CubeMX、Keil、ST-Link与串口助手详解 搞嵌入式最尴尬的时刻不是板子烧了也不是代码编译不过而是别人让你装了四个软件装完之后你看着桌面一排图标心里只有一个问题这几个东西到底谁干嘛的我当年学STM32的时候就是这个状态——CubeMX、Keil、ST-Link驱动、串口助手四个软件装完教程说“下一步”我就跟着点“下一步”结果连“为什么需要四个软件”都没搞明白后面遇到问题就彻底抓瞎了。这篇就专门把这四个软件掰开揉碎讲清楚。它们不是摆设而是嵌入式开发这条流水线上的四个工位一个负责画图纸、一个负责加工、一个负责把成品送到板子里、一个负责和板子对话。搞懂它们的分工你再回头看STM32、嵌入式、C这套东西会顺畅很多。无论你是刚开始学还是装了软件没搞懂想补课这文都适合。1. 为什么嵌入式开发要装“一堆”软件1.1 先认清你手里的开发板是谁很多新人第一步就栽在“搞不清自己手里是什么芯片”。STM32是一个大家族从低端的F0系列到高端的H7系列甚至还有无线系列的WB、WL。你装软件之前必须先知道你的板子上焊的是哪颗芯片因为这直接决定了你装什么芯片包、在CubeMX里选什么型号、在Keil里下载什么器件支持。怎么看芯片型号两种最靠谱的方法第一个看芯片表面丝印。STM32芯片表面一般写着类似“STM32F103C8T6”这样的字符串如果字太小用手机微距拍一张放大看。第二个看开发板背面或者商品详情页比如常见的“STM32F103C8T6最小系统板”那就对应芯片型号。这里插一句芯片第一脚怎么确认很多新手接线或者画板子的时候容易把引脚数错。芯片上通常有一个圆形凹点或者斜切角那就是第一脚的标记。从第一脚开始逆时针方向数就是1、2、3……直到最后一只脚。封装越大越要养成“先找圆点再数引脚”的习惯不然你后面接SWD下载线的时候VCC、GND、SWDIO、SWCLK这四根线只要错一根轻则识别不到重则烧芯片。1.2 四条腿的桌子四款软件的协作逻辑回到那个“四个软件”的问题。你可以把开发流程理解成做一张桌子STM32CubeMX是“设计师”。你告诉它你要用哪个引脚、开哪个外设、跑多快它帮你把工程骨架画好生成一套初始化代码。Keil是“加工厂”。它拿到设计师的图纸CubeMX生成的工程负责把C/C代码编译成芯片能运行的机器码然后通过下载器把程序烧进去还能单步调试。ST-Link驱动是“物流通道”。下载器ST-Link插在电脑USB口上电脑如果没有驱动就认不出这个硬件Keil也就没法把加工好的成品送进芯片。串口终端是“电话”。程序烧进去了到底跑没跑对你总不能在芯片上挂个显示器于是通过串口把调试信息发出来用电脑上的串口助手接收查看。这四样东西缺一不可但很多人只记住了“装四个软件”没记住它们是一条链上的四个环节。理解了这层关系后面每一个软件弹出来的配置界面你就知道它是干什么的了——CubeMX让你选引脚是在画图纸Keil让你选择编译器和Debug工具是在选加工方式和物流路线串口助手让你选波特率是在约定电话里的语速。2. 逐个拆解四个软件它们到底干了啥2.1 STM32CubeMX画配置图的“施工蓝图”STM32CubeMX是ST官方出的图形化配置工具。它的核心价值是不用你手写底层寄存器配置鼠标点一点自动生成初始化代码。比如你想让PA5引脚输出高电平来点亮LED传统写法需要查寄存器手册配置GPIOA的时钟、配置模式、配置输出类型、配置速率然后写一行GPIOA-ODR | (15)。寄存器手册几百页新手直接劝退。用CubeMX你只需要在芯片图上点击PA5引脚选GPIO_Output然后生成代码它会自动帮你写好HAL库版本的初始化函数你只需在while(1)里加一句HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET)。CubeMX能做的事情远不止点灯。它还可以配置时钟树比如STM32F103默认外部8MHz晶振通过PLL倍频到72MHz。在CubeMX的Clock Configuration页面里它会自动计算各种分频倍频关系并且用红色/绿色提示你配得合不合理。外设功能UART串口、I2C、SPI、定时器PWM输出、ADC采集、USB设备、CAN总线以及以太网、SDIO这些复杂外设。中间件比如FreeRTOS实时操作系统、FatFs文件系统、USB协议栈、LVGL图形库勾选一下就能集成。引脚冲突检测如果同一个引脚被两个外设复用它会直接报错提示省去你查手册排雷的时间。这里有一个关键点CubeMX生成的是C文件但我们的标题里说了“嵌入式C”。CubeMX本身不排斥C后面在Keil里做一点小改动就能把工程变成C工程。后面实操部分我会专门讲。2.2 Keil MDK真正干活的“编译工厂”Keil MDK核心是一个IDE但它的本质是集成了编译器和调试器的一套工具链。你写的C或C代码经过编译器变成机器码再通过链接器把各个目标文件拼起来最后形成一个可烧录的.hex文件。这个过程在Keil里按一个F7Build就完成了但背后其实是好几道工序只是IDE帮你隐藏了细节。为什么要用Keil因为它对ARM Cortex-M系列芯片支持成熟ST官方也默认提供Keil工程模板很多开发板教程都用它遇到问题容易搜到答案。不过也有很多开发者用STM32CubeIDEST自己的免费IDE基于Eclipse或者VS Code配合CMake工具链这些都是后话。Keil里你必须理解两个概念编译器版本ARMCCAC5和ARM Compiler 6AC6。AC5是老牌编译器稳定但C标准支持较老AC6基于Clang对C11/14/17支持更好也更快。如果你要在STM32上正经写C我强烈建议用AC6。打开Keil在Options for Target - Target标签页里把ARM Compiler切换成“Use default compiler version 6.x”。芯片包Keil本身是个空壳它需要安装对应芯片的器件支持包Device Family Pack才能在新建工程时选到“STM32F103C8”这个型号。这个芯片包就是你装CubeMX之后还要装Keil相关包的原因之一当然版本一定要匹配。很多人装了Keil之后发现新建工程找不到STM32就是因为没装芯片包。这个坑我在常见问题部分会详细讲。2.3 ST-Link驱动开发板和电脑之间的“翻译官”ST-Link是意法半导体官方的调试烧录工具。你可能买开发板的时候会看到一个是“ST-Link/V2”的小U盘形状的东西它通过USB口连电脑另外一头通过SWD排线连开发板。它的作用有两件一是烧录程序把Keil编译出来的.hex文件写进STM32的Flash二是调试支持单步执行、读寄存器和内存值这是排查程序逻辑错误的神器。但是ST-Link插上电脑之后操作系统默认不认识它。你需要安装一个驱动程序让电脑把它识别为一个“调试设备”。装上驱动之后你在设备管理器里能看到类似“STMicroelectronics STLink dongle”或者“ST-Link Debug”这样的设备。这里要注意两个常见误区ST-Link驱动不等于“点开就能用的软件”。它没有界面不常驻桌面很多人装了之后不知道装到哪里了这很正常。它的存在与否只需要去设备管理器确认即可。有些便宜的“ST-Link”其实是盗版或者兼容版驱动可能要装特定的版本。如果插上后电脑识别成未知设备先换USB线再换驱动版本还是不行就考虑是不是硬件问题。ST-Link的接线也很重要。SWD只需要四根线3.3V、GND、SWDIO、SWCLK。个别开发板还有NRST可以不接。接线必须一一对应不要接反不然有烧毁风险。2.4 串口终端嵌入式世界的“对讲机”串口终端的作用就是在电脑屏幕上表现STM32发出的字符串。硬件上是USB转TTL串口模块比如CH340连接开发板的USART引脚电脑上运行串口助手软件如XCOM、SSCOM、PuTTY、MobaXterm设置好串口号和波特率就能收到单片机打印出来的数据。比如你在代码里初始化好UART1重定向printf到串口然后在程序里写一句printf(Hello STM32\r\n);烧录后打开串口助手设置波特率为115200你就能在接收区看到这行字。这就是嵌入式开发里最基本的“程序活没活”的反馈手段。串口助手还有一个隐藏功能指令交互。比如做智能小车你在电脑上发送字符F小车前进发送B小车后退。这种简单的人机交互在调试阶段特别有用比用按键加OLED屏高效得多。有人会问为什么不能直接用USB线连接开发板很多STM32开发板上的USB口其实是给USB通信用的不是给串口调试用的。除非板子上自带了一颗USB转串口芯片比如CH340或CP2102才能直接通过USB线看到串口数据。学习板上一般都有STM32最小系统板则要单独配一个USB转TTL模块。3. 从零跑通一个带C的工程四件套配合实操3.1 安装顺序和版本选择别再随便下一步很多教程说“安装很简单一路下一步”但实际安装顺序错了会踩坑。我推荐的顺序是先装ST-Link驱动。因为后面Keil下载调试时要用先装好可以避免后续识别不到。再装STM32CubeMX。它是Java程序新版已经内置了Java环境不需要额外装。下载时注意选择适合你操作系统的安装包。接着装Keil MDK。安装完后再安装你所需芯片的Device Family Pack。最后装串口助手。这类软件一般是绿色版解压即用。版本选择上STM32CubeMX建议用最新的长期支持版比如6.x以上Keil MDK用5.30以上在中文路径下没有问题串口助手选XCOM或者SSCOM都行。特别提醒所有安装路径都不要带中文也不要带空格太长的目录。Keil 默认安装在C:\Keil_v5尽量不要改到带中文的路径否则后续编译会出现一些莫名其妙的错误。3.2 用CubeMX生成带C支持的初始化工程打开CubeMX它会问你“选择MCU还是选择开发板”。如果你用的是某宝常见的“STM32F103C8T6最小系统板”我建议选择“Access to MCU Selector”然后在搜索框输入STM32F103C8双击后进入配置界面。这里需要说明一个C相关的重要设置在Project Manager - Project选项卡里Toolchain / IDE选择“MDK-ARM V5”或者“MDK-ARM V6”这个决定生成工程能不能直接在Keil中打开。在Project Manager - Code Generator选项卡里建议勾选“Generate peripheral initialization as a pair of .c/.h files per peripheral”每个外设生成独立的.c/.h方便管理。如果CubeMX版本支持可以勾选“Use C”或类似选项实际上CubeMX生成的依然是C文件但工程里默认不会包含.cpp文件。要改成C工程最经典的做法是生成后把main.c改名为main.cpp然后在Keil里设置编译器为AC6并处理好extern C。所以在CubeMX里先把基础配置做了比如配置一个LED引脚为输出再配置一个UART串口用作printf输出。配置完时钟树后点击GENERATE CODE选择MDK-ARM工程生成到一个不带中文的路径下。3.3 在Keil里写C类和编译下载生成工程后用Keil打开项目里的.uvprojx文件。你会发现顶部的初始化代码还是C风格的但这不妨碍你写C。具体操作如下第一步把main.c改名为main.cpp。在Keil左侧Project窗口里右键main.c选择“Manage Project Items”或者在文件管理器里改名后重新添加。改名后Keil会把它当作C文件编译这个时候你就能在main.cpp里写class、namespace、模板这些C语法了。第二步处理C和C的兼容问题。CubeMX生成的核心头文件、HAL库函数都是C语言写的在C文件里包含C头文件时必须加extern C否则链接时会报undefined reference。比如extern C { #include main.h #include usart.h #include gpio.h } // 你的C类 class Led { public: void On() { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET); } void Off() { HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET); } }; int main() { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); Led led; while (1) { led.On(); HAL_Delay(500); led.Off(); HAL_Delay(500); } }当然工程里已经生成的stm32f1xx_hal_conf.h等文件不需要改因为它们在main.cpp里被extern C包住了链接会正常。第三步切换编译器到AC6。在Options for Target - Target里把ARM Compiler选为Use default compiler version 6.x。AC6对C的语法支持更完整编译速度也快。如果用默认的AC5编译C你也需要把GNU extension相关选项放开否则一些新特性用不了。第四步配置下载器。在Options for Target - Debug标签页选择右上角的Use:下拉框选ST-Link Debugger然后点击旁边的Settings如果驱动和硬件都没问题这一页会直接识别到你的ST-Link编号。再切到Flash Download选项卡勾选Reset and Run这样烧录后程序会自动运行不用手动按复位键。然后F7编译如果代码没有错误会在Build Output窗口出现“0 Error(s), 0 Warning(s)”然后按F8下载。这时候ST-Link会把编译好的.hex烧进芯片如果一切正常你板子上的LED就会闪起来。3.4 用串口终端验证程序是否真跑起来了程序闪灯只能说明代码在跑但不能说明跑了多少、状态如何。这时候串口就该登场了。在main.cpp里用printf输出信息。但STM32的HAL库默认没有把printf重定向到串口。你需要重写fputc或者_write函数或者在CubeMX生成的usart.c里加上一段重定向代码。以AC6编译器为例常见做法是#include stdio.h int fputc(int ch, FILE *f) { HAL_UART_Transmit(huart1, (uint8_t *)ch, 1, 0xFFFF); return ch; }把它放在main.cpp里就可以然后再调用printf。注意串口波特率要和代码里配置一致比如CubeMX里USART1配置为115200那串口助手也选115200。打开串口助手选择对应的COM口在设备管理器里查看USB转串口芯片生成的是COM几打开串口然后按一下开发板复位键你就能看到printf输出的内容。这一步走通了说明你已经具备了“看芯片内部状态”的能力后面做调试就从容很多。4. 常见问题与排查技巧实录4.1 芯片包装不上、芯片型号找不到怎么办Keil新建工程时找不到STM3290%的原因是芯片包没装或者装错版本。正确方式是在Keil官网或者软件内部的Pack Installer中根据你的芯片系列下载对应Pack。比如STM32F1系列就下载Keil.STM32F1xx_DFP。常见问题是下载速度慢、安装失败。可以试试手动下载Pack文件然后在Pack Installer里双击安装安装成功后在Pack Installer的“Devices”列表里能看到对应芯片。还有一种情况你装了CubeMX但没装Keil的DFPCubeMX生成工程时选择MDK-ARM会提示缺少Pack这时候去Pack Installer装好再回来生成即可。CubeMX搜索不到芯片型号也遇到过。如果你用的CubeMX版本太老可能不包含较新的芯片系列。解决办法是升级到最新版CubeMX并检查网络是否能访问ST的官网资源。新版CubeMX一般会把芯片包数据放在云端首次启动需要下载如果网络不好搜索就会转圈。4.2 Keil和C51冲突、许可证过期怎么处理网上有个热搜词叫“keil5兼容c51和stm32安装”很多人想知道一个Keil能不能同时开发8051和STM32。答案是可以装两个不同的KeilMDK和C51它们可以共用同一个uVision开发界面只要安装在不同目录或者安装时选择共存。但要注意许可证要分别处理MDK需要ARM编译器许可证C51需要C51编译器许可证。以前可以用免费的评估版但代码量限制16KB/32KB而STM32F103C8T6的Flash有64KB评估版可能不够用。如果你在Keil里编译时报许可证过期或激活错误先打开License Management重新添加许可证。如果你买不起正式版用评估版或换STM32CubeIDE是常见路径。不要在这个问题上折腾太久嵌入式开发工具链的选择很多Keil不是唯一解。4.3 下载失败No ST-Link detected / RDDI-DAP Error这是新手最容易遇到且最崩溃的错误其实原因就那么几个。第一驱动没装或者被360之类软件拦截。去设备管理器看有没有带感叹号的设备。如果有重装驱动右键更新驱动程序手动选择“从电脑查找驱动”。第二SWD接线错误。ST-Link的3.3V和GND别接反SWDIO和SWCLK别接反这个接反往往不是一点信号都没有而是识别不稳定。第三芯片型号不对。在Keil的Options for Target - Device里必须选择正确的芯片型号如果选成其他系列下载时地址映射错乱也会报错。第四引脚冲突导致芯片进入低功耗或者被占用SWD引脚。有些开发板把PA13/PA14重新映射为普通IOSWD功能被关掉了此时用按住复位键再点击下载的方式可以抢在程序跑起来之前把新程序烧进去。这个技巧很实用。RDDI-DAP Error这个报错在Keil里出现时我首先会检查ST-Link的固件版本是否过老。用ST官方工具STM32CubeProgrammer可以升级ST-Link固件升级后很多兼容问题会消失。4.4 C工程最容易被坑的三个地方第一main.c改名为main.cpp后CubeMX重新生成代码会把文件名改回来导致C代码丢失。解决办法不要在CubeMX生成的核心文件里写太多业务逻辑把C类放在独立文件中主循环调用即可。第二C异常和动态内存很多STM32芯片Flash和RAM都很小开着C异常特性会明显增加代码体积。嵌入式实时场景一般不推荐用异常建议在Keil的C配置里关闭异常支持改用错误码或断言。第三中断函数是C语言格式。你写了一个C类成员函数想作为中断回调直接丢进中断向量表是不行的。正确做法是在中断处理函数里调用全局对象的方法或者用静态成员函数。比如class TimerHandler { public: static void IRQ() { // 处理中断 } }; // 在stm32f1xx_it.c里调用但要注意extern C和extern声明说到底嵌入式C不是禁区但要有取舍。HAL库本身是C接口你可以用C封装成类但底层操作还是C。类、模板、namespace、lambda表达式在AC6下都能用只要控制好代码体积和实时性C反而能让工程更清晰。4.5 常用调试技巧速查表现象可能原因检查方向编译报错找不到头文件工程路径含中文或未包含头文件目录Options - C/C - Include Paths程序烧录后没反应复位引脚被拉低或电源问题检查电源灯和复位电路串口收到乱码波特率不匹配或GND没共地确认串口参数和共地下载时提示Flash满Flash大小选错芯片型号和下载算法是否正确LED微亮但不闪烁GPIO引脚模式未配置为推挽输出CubeMX里改GPIO输出模式定时器不准时钟树配置错误或Prescaler计算有误用CubeMX时钟计算器重新估算这张表是我排查问题时的第一反应列表。遇到问题先不要急着乱改代码按表格逐项确认能省不少时间。5. 说点实话和我的习惯装了四个软件其实只是第一步真正要做的是把这四个软件串成一条属于自己的开发流水线。我个人现在的习惯是CubeMX负责所有外设初始化Keil只负责编译和下载调试串口助手常年挂在后台看日志ST-Link驱动装完就不管了。每次拿到一个新板子我会先用CubeMX生成一个最小工程然后写一个LED闪烁加串口打印的测试程序跑通了再往上加业务代码。这个流程的意义在于先把“软硬件通路”打通再开始写具体功能。很多同学喜欢一上来就写超声波测距、USB设备这些大功能结果程序里全是配置代码根本分不清是硬件问题还是软件问题。先跑通最小系统后面你加任何一个新外设心里都会很有底。最后再分享一个小技巧STM32的调试过程中printf和断点要搭配使用。串口看整体流程断点看局部细节。有时候定时器中断里执行频率太高printf反而会干扰实时性这时候就果断把串口关掉用逻辑分析仪或者调试寄存器来看。工具都是死的怎么配合才是活的。这套四软件的组合也许不是你职业生涯最后一套工具但把它吃透后面你不管换VSCode、换STM32CubeIDE、换CLion都会很快上手。嵌入式开发的世界里工具永远在变但“画图-编译-烧录-输出”这条链路不会变理解了这条链你就算真正入门了。