尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

STM32开发四件套:CubeMX、Keil、ST-Link、串口助手的职责与协作

发布时间:2026/9/29 4:46:28

资讯中心
01
ARTICLE

STM32开发四件套:CubeMX、Keil、ST-Link、串口助手的职责与协作

STM32开发四件套:CubeMX、Keil、ST-Link、串口助手的职责与协作
很多人学STM32的第一周都是被软件安装劝退的。别人扔给你一个教程链接让你装Keil、装STM32CubeMX、装ST-Link驱动、再装一个串口调试助手你闷头装完四个软件桌面多了一排图标然后呢然后你根本不知道哪个是干嘛用的也只能乖乖照着教程往下点。我这个“嵌入式C编程之旅”系列写到这里已经到第4篇了后台收到最多的提问居然不是C语法而是这个工具链层面的困惑。这一篇我就把这四样东西一次讲透。它们分别是什么、为什么非要装、在一条完整的STM32开发流程里各自站在哪一环、哪个环节出问题该找哪个软件算账。讲清楚这些你后面学C、学HAL库、做项目才不会像盲人摸象。1. 先用一句话建立整体认知你装的是一整条流水线我习惯把嵌入式开发比作开一家小饭馆。你写的代码是“菜谱”但菜谱不能直接端上桌中间要有人买菜、切菜、炒菜、传菜最后还要有人试吃。STM32CubeMX是那个“备菜员”。你告诉它“我要用鸡腿肉、青椒、花生米”它帮你把原材料芯片引脚、时钟、外设全部备好切好整整齐齐码在盘子里——这盘菜就是自动生成的初始化代码。Keil MDK是“大厨”。真正掌勺炒菜的地方。你在这写业务逻辑C/C代码它把代码编译成芯片能执行的机器码然后通过调试器下载到板子里。ST-Link驱动是“传菜员”。它负责让电脑和板子之间能够对话。没有传菜员大厨炒好的菜根本端不到客人桌上。串口调试助手是那个“试吃的客人”。程序的运行结果通过串口发出来你在电脑上能看到“菜咸了淡了”——也就是程序跑得对不对。很多人装完软件就急着点灯把四个软件割裂地当成四个独立工具来学这是很大的弯路。它们本质上是一条协作链路。你只有先建立“一盘菜从备料到上桌”的整体流程感后面遇到任何报错才能第一时间判断是备菜CubeMX的问题还是炒菜Keil的问题还是传菜ST-Link的问题还是菜本身有问题串口里出来的数据不对。2. 逐个拆解这四个软件到底在干什么2.1 Keil MDK真正干活的“工地”Keil MDK全称Keil MDK-ARMIDE界面叫µVision是你以后大多数时间待在里面的环境。它的职能可以拆成四块第一写代码。它自带编辑器支持C和C语法高亮、自动补全、跳转定义。虽然很多老手后来会换VSCode或CLion写代码但新手阶段老老实实用Keil少一份折腾就多一分学核心知识的时间。你在这个编辑器里做的事就是对着main.c、gpio.c这些文件写出你自己的逻辑。第二编译。这是Keil最核心的价值。Keil内置了ARM的编译工具链AC5老版本编译器或AC6新版编译器把你的C/C源码翻译成ARM Cortex-M处理器能执行的机器码最后生成一个.hex或.bin文件。这就好比大厨把菜谱变成一盘能吃的菜。很多人第一次编译会看到一屏警告不用慌只要没有Error程序就能下载。第三下载。在Keil里点一下LOAD或按F8新版是F7编译、F8下载它就会通过ST-Link把刚才生成的机器码烧写到STM32芯片的Flash里。第四调试。打上断点全速运行单步执行实时看变量值、看寄存器内容、看外设状态。嵌入式开发一半的时间花在“程序为什么不按我想的跑”上Keil的Debug功能就是你的显微镜。需要多说一句的是Keil对C的支持风格偏老派。你在Keil里写.cpp文件没问题但STM32的HAL库本身是C写的所以在C里调用HAL库函数时要记得用extern C包一层不然链接阶段会报一堆“未定义的符号”。这个细节后面专门写C和HAL库封装时会展开你先知道有这么个坑。2.2 STM32CubeMX硬件配置的“图形化向导”STM32CubeMX是ST官方出的图形化配置工具。它解决的是嵌入式开发里最枯燥、最容量出错的一块寄存器配置。STM32芯片有几十个引脚每个引脚能复用成不同的功能还有一堆时钟、中断、定时器、串口、SPI、I2C外设。如果全部手工对着寄存器手册写初始化代码一个最简单的点灯工程都要写上百行寄存器操作而且很容易写错一个位导致整个芯片不工作。CubeMX的存在就是为了把这个过程图形化。你在CubeMX里做的是这样几件事选芯片。比如STM32F103C8T6在图形界面上找到这颗芯片点一下就搞定。配置引脚。界面上会显示芯片物理引脚图你用鼠标把某个引脚点成“USART1_TX”把另一个点成“GPIO_Output”Pinout视图上会变色非常直观。配置时钟。这是导致新手最容易懵的地方。STM32内部时钟源HSI精度低外部晶振HSE精度高你要在Clock Configuration视图里配置主频。比如F103系列外部8MHz晶振经过锁相环PLL倍频到72MHz再分频给各个总线。CubeMX里左边选一个时钟源右边填一个目标频率它会自动帮你把PLL系数算好。配置外设参数。比如串口的波特率115200、数据位8、停止位1比如GPIO是推挽输出还是开漏输出是上拉还是下拉。生成初始化代码。最后在Project Manager里填好工程名、选择工具链是MDK-ARM点GENERATE CODE它就会自动生成一个完整的Keil工程。打开这个工程你会看到HAL_Init、SystemClock_Config、MX_GPIO_Init这些函数已经被写好了。你要做的只是在这坨“骨架代码”之上填自己的业务逻辑。换句话说CubeMX帮你省掉了翻数据手册、死记寄存器的工作让新人把精力放在更值得的地方——系统架构和业务逻辑。等你有天遇到必须手工配寄存器的场景比如用到的外设CubeMX不支持你再来翻手册也不迟。新手阶段大胆用CubeMX不丢人。2.3 ST-Link驱动电脑和板子之间的“翻译官”ST-Link是ST官方出品的调试下载器它长什么样不重要重要的是你通过它的一根USB线连电脑、另一端几个排针连到开发板的SWD接口SWDIO、SWCLK、GND外加一个3.3V供电。它做的事情有两件一是把电脑编译好的程序下载到STM32芯片里二是在调试时让Keil能实时读取芯片内部的寄存器、Flash、RAM状态。但ST-Link本身是硬件电脑不认识它。所以你必须装一个ST-Link的USB驱动——这就是你装的第三个软件。装上驱动之后把ST-Link插到电脑上在设备管理器里就能看到一个“ST-Link Debug”设备这时候Keil才能跟它通信。顺便再提一个跟驱动绑在一起的工具ST-Link Utility。这是一个独立的小软件它可以直接通过ST-Link读写STM32的Flash比如整个芯片擦除、单独烧录某个hex文件、查看Flash内容。它在你调试时有一个救命用途如果程序写坏了导致芯片死机或者SWD接口被占用你用Keil下载时可能提示无法连接这时候用ST-Link Utility先执行一次“全片擦除”把芯片清空它又能正常连接了。这个操作我后面讲坑的时候还会再提。我自己踩过的一个经典弯路买了开发板把ST-Link插上电脑电脑提示“无法识别的USB设备”然后我以为是开发板坏了折腾了半天最后发现是驱动没装。你如果遇到同样的问题先别怀疑硬件先查驱动。2.4 串口调试助手看程序“开口说话”的窗户串口助手是四个软件里看起来最不起眼、但后期使用频率最高的一个。它本质上就是一个“收发文字/十六进制数据”的窗口工具。STM32通过UART外设把数据发出来经过板载的USB转串口芯片最常见的是CH340或CP2102变成USB数据到电脑串口助手把数据解析显示在屏幕上。为什么要用串口因为单片机上没有屏幕可以打印printf输出。你要想知道程序跑到哪个分支了、某个变量的值是多少、传感器读回来的数据正不正常最廉价的方式就是通过串口把调试信息发到电脑上看。这就是嵌入式工程师常说的“串口大法好”。用串口助手要注意一个关键通信双方的参数必须一致。你在CubeMX里把USART1配成115200、8、N、1那么串口助手这边也必须选115200、8位数据、无校验、1个停止位。任何一个不匹配屏幕上就会出乱码——这也是新手最爱遇到的问题原因一大半在参数不匹配上。串口助手本身体量很小XCOM、SSCOM、QCOM随便挑一个都行网上还有很多在线串口调试工具。功能大同小异选择COM口号、设置波特率、打开串口、发送数据。2.5 那四个“行业高频词汇”跟这有什么关系写这个系列的过程中评论区经常有人问我“嵌入式到底学什么”“应用层开发算不算嵌入式”“要不要学5种通信协议”。我在这里顺带说一点个人体会嵌入式开发的核心不是某一个软件而是“硬件资源 软件工具链 通信协议”三者之间来回折腾的能力。UART就是你要接触的第一种通信协议后面你还会遇到SPI、I2C、CAN、USB等等。你现在装好的这四个软件恰好就是这个能力闭环的四个支点CubeMX帮你配硬件资源Keil帮你把资源用起来ST-Link帮你把程序送到硬件上串口助手帮你验证硬件和程序的运行结果将来你用VSCode配插件写STM32或者换STM32CubeIDE本质上还是这四条链路只是换了“大厨”而已。3. 串一条完整链路从新建工程到看到串口输出这么多概念讲完了我们来实打实走一遍全流程。假设你手上是一块常见的STM32F103C8T6核心板板上有一颗8MHz外部晶振板载ST-Link接口和CH340串口芯片。目标很简单让单片机通过串口每隔一秒打印一行“Hello STM32”。你要先后打开四个软件按顺序协作。3.1 第一步在STM32CubeMX里备菜打开STM32CubeMX新建工程New Project在芯片选择界面搜“STM32F103C8T6”选它双击。接下来三件事配置时钟源在System Core - RCC里把High Speed ClockHSE设为Crystal/Ceramic Resonator。配置调试口在System Core - SYS里Debug选Serial Wire。这一步很多人会漏掉漏掉之后你下载程序会用不了SWD接口非常麻烦。配置串口在Connectivity - USART1里Mode选Asynchronous然后在Parameter Settings里把Baud Rate设成115200Word Length 8Parity NoneStop Bits 1。然后切到Clock Configuration页把HSE作为PLL时钟源PLL倍频拉到9倍得到72MHz系统时钟APB1分频器选/236MHzAPB2不用分72MHz。这一步不理解先照做后面学到时钟树再回头消化但你要知道“系统时钟不配好串口波特率一定不准”。最后在Project Manager里Project Name填个hello_uartToolchain/IDE选MDK-ARM V5如果你Keil装的是新版也可以选V5兼容。Code Generator里建议勾选“Generate peripheral initialization as a pair of .c/.h files per peripheral”这样每个外设单独一个文件好读也好找。点GENERATE CODE。3.2 第二步在Keil里写逻辑用Keil打开刚才生成的工程文件夹里的MDK-ARM子目录下的.uvprojx文件。你会看到左边Project窗口里有一堆自动生成的文件Core里的main.c、startup_stm32f103xb.sDrivers里的HAL库源码还有usart.c、gpio.c这些外设初始化文件。打开main.c找到main函数。你会看到CubeMX已经帮你调好了HAL_Init、SystemClock_Config、MX_GPIO_Init、MX_USART1_UART_Init。我们要做的就是在while(1)循环里加一点事情。在main函数while(1)前定义一条消息字符串然后在循环里发送uint8_t msg[] Hello STM32\r\n; while (1) { HAL_UART_Transmit(huart1, msg, sizeof(msg) - 1, 1000); HAL_Delay(1000); }HAL_UART_Transmit是HAL库的阻塞式串口发送函数第一个参数传句柄huart1第二个参数传要发的缓冲区第三个传字节数第四个是超时时间。1000毫秒的意思是如果一秒钟内没发完就算失败。这里我们把“\r\n”算进了消息里所以串口助手收到的每一行会干净地换行不会粘在一起。如果想用printf直接打印可以在usart.c里加一个fputc重定向函数。Keil里还要在Options - Target - Code Generation里勾选MicroLIB微库这样printf输出才会走串口并且占用资源少。很多新手卡在printf打不出东西十有八九是MicroLIB没勾或者fputc没实现。3.3 第三步让Keil认识ST-Link把ST-Link连到电脑和开发板的SWD口然后在Keil里点Options for Target魔术棒图标切到Debug页左边选“ST-Link Debugger”然后点右边的Settings。正常情况下这里会显示SW Device里有一个ARM CoreSight SW-DP设备这说明ST-Link已经成功和芯片握手了。接着切到Utilities页把“Update Target before Debugging”勾上Flash Download里建议勾选“Reset and Run”和“Program”。这样每次下载完程序芯片会自动复位运行省得你手动按复位键。这一步是新手的重灾区。很多人打开工程直接按F8下载Keil弹一个“No ST-Link detected”或者“Cannot access target”原因就是Target Driver Setup里你根本没选中ST-LinkKeil默认用的是ULINK或别的调试器。3.4 第四步编译下载在Keil里按F7编译。第一次编译会自动编译整个HAL库可能会要半分钟到一分钟输出窗口里出现“0 Error(s)”就说明编译通过。然后按F8或者点LOAD按钮下载下载完板子自动复位运行。如果一切顺利程序已经跑起来了但你看不到任何现象——因为代码什么都没做只往串口发数据。这就要用到第四个软件了。3.5 第五步用串口助手验证打开串口助手在设备管理器里看你的板子占了哪个COM口CH340一般叫“USB-SERIAL CH340”选好这个COM口号波特率选115200数据位8、停止位1、无校验然后点“打开串口”。这时候屏幕上应该每隔一秒蹦出一行“Hello STM32”。如果你看到的是乱码先不要慌八成是波特率不匹配或者CubeMX里时钟没配好导致波特率漂移。如果你什么都收不到先查一下串口助手用的COM口有没有选对再查一下板子上的TX/RX跳线有没有接对。到这里四个软件就走完了一个完整的闭环。CubeMX生成骨架Keil写逻辑、编译、下载ST-Link负责传数据串口助手负责反馈结果。这条链路你完整走过一遍嵌入式开发这句话才真正立起来。3.6 这条固定链路背后的逻辑很多人问一个问题为什么一定是这四个软件能不能不装CubeMX能不能不用Keil答案是都能但新手不建议。CubeMX的价值在于它把“硬件资源的核实”这个高错误率环节变成了图形化操作。你手写寄存器写错一个位芯片可能整个跑不起来而CubeMX生成的代码经过了官方充分测试至少不会错在初始化阶段。Keil的价值在于它的下载和调试跟ST-Link适配是“开箱即用”的。你在VSCode里要手写配置文件、装插件、处理编译链折腾一晚上可能还连不上调试器对新人来说挫败感太强。所以这套固定链路本质上是用“减少变量”来降低学习成本。等你把这套流程跑熟了再换成STM32CubeIDE、VSCode CMake OpenOCD你会发现底层逻辑一模一样只是工具不同罢了。4. 新手最容易踩的坑现象、原因与排查下面是我见过最多的五个坑也是后台私信里问得最频繁的问题。列成一张速查表你对着找就行。现象大概率原因排查建议电脑插上ST-Link提示无法识别的USB设备ST-Link驱动没装好重装ST-Link驱动检查USB线是否只支持充电不支持数据Keil按F8下载提示No ST-Link detectedKeil的Debug里没选ST-Link调试器Options - Debug - 选ST-Link Debugger再点Settings确认下载提示Error: Flash Download failed - Target DLL has been cancelled目标板供电不足或SWD接线松动检查开发板供电重新插拔SWD线降低SWD频率试试STM32CubeMX生成的工程编译报一堆错Keil编译器版本不匹配Options - Target - ARM Compiler换成AC5或AC6试一下串口助手收不到数据或全是乱码波特率不匹配或CubeMX时钟配置错误核对串口助手波特率回CubeMX检查HSE和PLL配置4.1 一定要警惕“CubeMX里把SWD禁用掉”这个隐蔽操作有个坑特别值得展开说。有的教程在配置引脚时会让你把某几个引脚复用成别的功能结果不小心把PA13/PA14SWDIO/SWCLK也复用走了。搞完以后你下载一次程序还行第二次再下载Keil就报“Cannot access target”——因为芯片的调试口被你的程序占用了ST-Link没法再跟芯片通信了。这时候怎么办两个办法办法一按住开发板复位键不放在Keil点LOAD松手之前的一瞬间点下载利用芯片刚上电还没来得及跑你自己的程序那短短几百毫秒把新的固件烧进去。这个操作很看手速但确实管用。办法二用ST-Link Utility连上芯片直接在工具栏点Full Chip Erase把整个Flash擦掉。芯片重启后程序为空SWD口恢复默认状态再用Keil下载就正常了。这是最保险的解法所以我建议你把ST-Link Utility留着它就是用来救命的。我自己的习惯是在CubeMX里配引脚时永远先把SYS - Debug - Serial Wire配好生成的代码里也尽量不在PA13/PA14上做手脚。从源头避免这个问题比事后擦Flash省心太多。4.2 串口乱码到底怎么查一个由浅入深的排查顺序串口乱码是二刷率最高的新手问题我也在这里亏过一整个下午。我的排查顺序是这样的第一步先排除参数问题。确认串口助手波特率和CubeMX里配置一致这个最简单但很多人第一个查错步骤就跳过了。第二步确认你是否真的用了外部晶振。如果CubeMX里HSE没启用、还是靠内部8MHz的HSI在跑而你在CubeMX里是按72MHz配的时钟树那么实际串口波特率会和配置值差很多出来的自然是乱码。最简单的方法是打开CubeMX看RCC里HSE是不是Crystal/Ceramic Resonator再看System Clock是不是72MHz。第三步如果前两步都没问题大概率波特率有小幅偏差。把串口助手的波特率往下调一个档位试试比如从115200调成57600如果乱码变成了清晰文字说明你的系统时钟实际频率只有配置的一半。第四步检查接线。TX要接RXRX要接TX用逻辑分析仪或者示波器看波形是最硬的证据但新手不具备条件的话就返回第二步再检查时钟。4.3 编译报错的经典场景AC5还是AC6Keil的新版本默认带了两套ARM编译器AC5是传统的老编译器AC6是基于Clang的新编译器。CubeMX生成工程的选项里如果选的是MDK-ARM V5用新版Keil打开时可能会自动切到AC6而某些老版本HAL库代码在AC6下会报一些语法警告甚至错误。遇到这种情况去Options - Target - ARM Compiler里把编译器从V6改成V5或者反过来重新编译一下多半就好了。这个操作看起来简单但很多人不知道编译器还可以换只能在报错里挣扎半天。5. 安装好之后还值得做的一件事这算是一点个人经验吧。安装四个软件之后我强烈建议你别急着点开发板的灯先花十分钟做一次“链路自检”CubeMX随便建一个空工程生成代码Keil编译一次ST-Link下载一次串口助手随便发条数据出去确认链路上每一个节点都能通。很多人的学习热情就死在“第一次下载失败”“第一次乱码”上面。其实不是你不会而是工具链本身还有问题没排除。工具本身没打通学任何知识点都会在实操时二次受阻因为你会把“工具问题”误判成“知识问题”。这个系列会一直讲下去后面接着会聊C怎么封装HAL库、怎么用类把外设抽象成对象、怎么规划一个工程的结构。但不管后面写多花哨的C用法底层还是今天这条链路CubeMX备菜、Keil炒菜、ST-Link传菜、串口试吃。把这条链在脑子里焊死往后不管换什么芯片、换什么IDE、换什么调试器你都能快速定位到问题出在哪一环。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。