STM32CubeMX加Keil5,是所有学STM32的人几乎绕不过去的第一个组合。CubeMX负责把硬件初始化以图形化方式配置好,自动生成基于HAL库的工程代码;Keil5(准确说是MDK-ARM)负责把代码编译成芯片能跑的机器码,再通过ST-Link这类调试器烧进板子。为什么有这么多人在第一步就卡住?因为安装真的不是简单的一路Next,中间还夹着Java环境、设备支持包、调试器驱动、固件包下载,任何一个环节出问题,都会出现“装好了却用不了”的状况。
这篇教程按宝宝级标准写,目标是:不需要懂原理,照顺序操作也能把环境装好,并且能当场烧录一个点灯程序。我会把每一步讲到没办法再细,从下载、安装、配置驱动,到CubeMX建工程、Keil编译烧录,全程走一遍。现在开始。
1. 安装之前,先把“三件套”的关系理清楚
1.1 三个软件各干什么活
很多新手一上来就双击安装包,装到一半才发现少装了一个、装错了版本。先花三分钟搞清楚这台电脑上最后要有什么东西,能省下后面一整天的折腾。
第一样是Java运行环境。STM32CubeMX本身是用Java写的图形化工具,所以电脑上必须先有一套它能调用的Java。这跟你用微信要先装个Windows系统是一个道理。Java版本太老或者根本没装,CubeMX就会启动报错。
第二样是STM32CubeMX本身。它的作用像一个自动设计院:你告诉它用哪颗芯片、哪些引脚、多快的主频,它帮你把底层初始化代码全部生成好。生成出来的代码基于ST官方HAL库,比如控制一个引脚的电平,你只需要调用HAL_GPIO_WritePin,不用自己去翻寄存器手册。在入门阶段,你的正事是在CubeMX里“画配置”,而不是从零手写启动代码。
第三样是Keil5。它相当于工地和监理:接收CubeMX生成出来的工程,负责编译、烧录、调试。点一下Build按钮,代码变成机器码;接上ST-Link,点一下Load按钮,机器码烧进芯片;配合调试器,你还能看到程序停在哪一行、变量值是多少。
这里我想特别纠正一个理解:CubeMX不是用来写代码的IDE。虽然它能把工程交给Keil,但日常开发环境是Keil,CubeMX只是在你需要改引脚、加外设、调时钟的时候再打开重新生成。这两个工具分工明确,谁也替代不了谁。
1.2 版本搭配与兼容性
宝宝级教程最怕的就是版本问题。我见过太多人装完发现Device列表里没有自己的芯片,或者CubeMX双击打不开,最后查下来全是版本不对。
我用下来比较稳的一套组合是这样:
| 软件 | 推荐版本 | 说明 |
|---|---|---|
| Java | JDK 17(64位) | CubeMX 6.8之后的版本要求Java 17起,JDK 17是长期支持版本 |
| STM32CubeMX | 6.12.x或6.13.x | 官网最新的正式版即可,不建议用太老的6.4/6.5 |
| Keil MDK-ARM | 5.38a或5.39 | 这是Keil5的ARM版本,别硬上6,老教程和兼容性都围绕5 |
| STM32F1固件包 | 1.8.x | 在CubeMX里联网安装,或ST官网手动下载 |
| STM32F4固件包 | 1.28.x | 按需安装,不需要4系列可以先不装 |
为什么反复强调版本?因为CubeMX更新很快,老版本对Java版本的要求和新固件包的支持都存在兼容边界。而Keil这边,MDK-ARM是给ARM内核单片机用的,Keil C51是给51单片机用的,两个是完全不同的产品。如果被网上“Keil5兼容C51和STM32”的说法带偏,第一次就把两者混着装,很容易出现界面和工程文件混乱。我的建议是:第一次只装MDK-ARM,跑通一遍流程之后再考虑C51共存。
还有系统层面的坑:安装路径和工程路径尽量不要出现中文、不要出现空格。D:\learn\led_test比E:\学习资料\LED实验安全得多。不是一定会出错,但编译器、烧录器遇到非英文路径时偶尔会莫名其妙出问题,为了一条路径折腾半天实在不值得。
2. 安装包下载:去哪里下、选哪个版本
2.1 STM32CubeMX的获取途径
下载CubeMX只有一个推荐来源:ST官网。在搜索引擎里搜“STM32CubeMX”,进到意法半导体官网对应的工具页面,点“Get Software”或“Download”按钮。第一次下载通常需要注册ST账号,填基本资料、验证邮箱就行。
为什么只说官网?因为第三方下载站的坑太多了。这类渠道下载的安装包,要么捆绑垃圾推广软件,要么版本被改动过,装完出问题你根本不知道是哪一步出的错。CubeMX安装包本身就是一个带版本号的exe,比如SetupSTM32CubeMX-6.12.0.exe,大小几百MB,从官网下虽然会慢一点,但是干净、版本明确。
固件包(Firmware Package)也是同样的原则。CubeMX里的Manage embedded software packages面板可以勾选对应系列直接装。如果下载太慢或者总是中断,可以拿固件包名去ST官网找对应的zip文件,手动放进本地仓库目录,这个操作细节我放在第5章专门说。
2.2 Keil5 MDK与Java的下载要点
Keil的官网是keil.com,下载页面选MDK-ARM,而不是C51。点击下载后会让你填一个很简单的表,公司、行业这些不想填的可以填“个人学习/Student”,邮箱收个下载链接。下载下来一般是mdk538a.exe这类文件,同样带版本号,大小1GB上下。
这里有两个细节容易被忽略。第一,官网默认让你下载的是当前最新的MDK版本,如果看到的是5.38或者5.39,放心下;如果官方页面主推的已经是MDK 6.x,也建议绕过去找5.x的下载入口,因为市面上绝大多数STM32教程都基于Keil5的界面和工程结构,用MDK 6会遇到很多操作对不上的情况。第二,MDK安装包不包含具体芯片的设备支持包(DFP),也就是说装完只是装好了IDE外壳,芯片型号的支持要靠后面单独装Pack,这一步漏掉的人特别多。
Java的获取我推荐两个来源:Oracle官网的JDK 17 LTS安装包,或者Adoptium(Eclipse Temurin)的JDK 17。如果你不想折腾环境变量,直接用安装版MSI的JDK,装完基本自动配好。不要图省事用那种“绿色版Java”“一键环境配置工具”,版本一旦混乱,CubeMX报的“Cannot find Java”会让你怀疑人生。下载时也注意系统位数:现在主流Windows都是64位,选x64版本,别下成x86的32位版本。
驱动提前备好也很重要。如果你的调试器是ST-Link V2,去ST官网搜STSW-LINK009下载驱动;如果你用DAP-Link,多数免驱;如果板子上有USB转串口芯片CH340,去沁恒官网下载CH340驱动;如果是CP2102芯片,则去Silicon Labs官网下载CP210x VCP驱动。驱动不用急着装,先下载好放一个文件夹,后面要用的时候不会找不到。
3. 手把手安装:Java → CubeMX → Keil5
3.1 先装JDK17,顺手把环境变量配好
安装顺序千万别乱:Java最先装,因为CubeMX启动需要它;CubeMX第二装,因为后面建工程要下固件;Keil最后装,因为工程生成需要对应编译器。
双击JDK安装包,一路Next,记住安装目录。Windows下默认是C:\Program Files\Java\jdk-17.x.x,这个路径看起来长,但它是英文和数字,没问题。安装完成后验证是否成功:按Win+R输入cmd回车,在命令行里敲java -version,如果看到类似“openjdk version 17.0.11”的输出,说明Java本身可以用了。
如果提示“不是内部或外部命令”,说明系统Path里没有Java路径。右键“此电脑”选“属性”→“高级系统设置”→“环境变量”,检查系统变量里有没有JAVA_HOME,没有就新建,变量值填JDK实际安装目录,比如C:\Program Files\Java\jdk-17.0.11;再在Path里加一条%JAVA_HOME%\bin。做完之后重新开一个cmd窗口验证。这一步看起来啰嗦,但很多人的CubeMX打不开,最后发现就是Path里缺了Java。
装完Java有个容易被忽略的点:如果电脑上以前装过别的Java版本,比如Java 8,而它恰好排在Path前面,CubeMX也可能加载到旧版本然后报错。稳妥做法是先把旧版本卸载,或者进系统环境变量手动调整,保证只有JDK 17这一个Java在执行路径上。装完重启一次电脑最保险,虽然大部分情况不重启也能用,但少数毛病重启就好,这几十秒值得花。
3.2 安装STM32CubeMX:一路Next也要留意几个选项
CubeMX安装包下载好后,双击运行。安装向导基本是标准流程,但安装目录建议保持默认的C:\ST\STM32CubeMX,不要手滑改成中文路径。安装完成后桌面会有图标。
第一次打开时会先弹许可协议,同意即可。接着会看到登录或注册ST账号的窗口。如果你用的CubeMX版本比较新,下载固件包和部分功能会要求登录账号,所以这里直接注册并登录最省事。注册过程就是填邮箱、设置密码、收一封验证邮件,几分钟搞定。
进入主界面后,先不要急着新建工程。打开Help菜单下的Manage embedded software packages,左边勾选STM32F1系列(如果你用的是F103等F1芯片),点Install安装固件包。这个过程取决于网络,面板上能看到下载进度。
这里我要特别多说一句:固件包下载的本地仓库默认在C:\Users\你的用户名\STM32Cube\Repository。如果你的用户名是中文,某些情况下解压、校验会有奇怪问题。建议打开Updater Settings,把Repository路径改成一个纯英文目录,比如D:\STM32CubeRepository。改完之后下载的固件包都会存到新位置,以后系统重装也不怕丢。这个操作看似多此一举,实际能帮你绕开很多中文路径的坑。
3.3 安装Keil5 MDK:装完必须先做三件事
MDK安装包运行后,一路默认设置,安装路径保持C:\Keil_v5。如果你之前装过C51版本,后续可以考虑共存;第一次我不建议混装,先让ARM这条线跑通。
安装进度条走到最后,安装向导会问是否立即运行Pack Installer,勾上它。Pack Installer打开之后,左边列表找STMicroelectronics,在右侧找对应芯片系列的Device Family Pack。比如用F103,找Keil::STM32F1xx_DFP,版本选2.x的最新版,点Install。这一步相当关键,没装DFP的Keil5,Device下拉列表里根本看不到STM32F103,就算有工程也编译不了。
装完Pack还要做三件事。第一,在File菜单下打开License Management,看一下License字段。个人学习没有购买MDK授权的话,这里显示评估模式,代码大小会有限制。入门点灯工程的代码量非常小,评估版完全够用,不用焦虑。我建议后面跟学校实验室或公司申请正版授权,不要去找来路不明的注册工具。第二,确认ST-Link驱动是否已装好,本章下一节会说。第三,检查Debugger选型,第4章会详细讲怎么设置。
如果你还要兼顾51单片机,我的建议是等这次安装、点灯、烧录全部跑通之后,再单独下载Keil C51版本,按官方向导装到同一个Keil_v5目录下。两个版本共用同一个IDE外壳,通过工具链选择切换,网上也有共存教程。但第一次千万别混,我自己就见过有人装完C51又装MDK,工程文件关联全乱了。
3.4 补齐ST-Link与串口驱动,别让板子“没反应”
软件装齐了,硬件驱动也不能缺。很多新手的“板子识别不到”“烧录失败”其实不是板子坏了,是Windows根本没认出调试器。
把ST-Link插到电脑USB口,右键“此电脑”选“管理”→“设备管理器”,展开“端口”和“通用串行总线设备”。如果能看到“ST-Link Debug”之类设备且没有黄色感叹号,驱动OK;如果有未知设备,双击它,选择“更新驱动程序”→“手动浏览”,指向你下载好的STSW-LINK009驱动目录,Windows会自动装上。装完再插拔一次ST-Link确认识别。
如果你的板子带USB转串口,比如常见蓝板用了CH340,那还需要装串口驱动。设备管理器里能看到“USB-SERIAL CH340 (COMx)”,说明装好了;如果只有“USB Serial”带感叹号,就装CH340驱动。要注意:串口驱动不影响你用ST-Link烧录,它只影响串口通信这种调试输出,这两件事不是一回事。
DAP-Link用户就省心了,CMSIS-DAP调试器绝大多数免驱,插上就能用,Keil里选CMSIS-DAP即可。驱动全部装完后的最终状态,是设备管理器里能看到调试器和串口设备,且没有任何黄色感叹号。这个“没有感叹号”的判断标准,是我排查问题最常用的第一板斧。
4. 从CubeMX生成工程到Keil5烧录,完整跑一遍
4.1 用CubeMX五步创建一个点灯工程
环境装完先别急着学语法,第一步应该是跑通“配置→生成→编译→烧录”这条流水线。我用最常见的STM32F103C8T6蓝板来演示,这颗芯片便宜量大,绝大多数人的第一块STM32都是它。
第一步:打开CubeMX,点击“New Project”,在MCU Selector界面顶部搜索框输入STM32F103C8。注意选带T6后缀的LQFP48封装那颗,双击进入配置界面。之后会看到一个芯片引脚图,这就是后续配置的图形化界面。
第二步:先配两个必选项。左边System Core目录下点SYS,右侧Debug下拉选择Serial Wire。这个选项决定生成代码里是否启用SWD调试接口。用Keil烧录基本都是走SWD协议,这里必须选上。然后点RCC,把High Speed Clock(HSE)设为Crystal/Ceramic Resonator。绝大多数蓝板上有8MHz晶振,这样后面时钟树才能从外部晶振做系统时钟,把主频拉到72MHz。如果选成Disable,CubeMX只能用内部HSI振荡器,主频上不去,延时和串口波特率都会不准。
第三步:点窗口上方的Clock Configuration(时钟树)标签,找到HCLK输入框,直接输入72然后回车,CubeMX会自动把PLL倍频、分频系数全部算好。看到HCLK变成72MHz、AHB/APB分频没有越界,这一步就完成。我知道有人想直接填128往上超频,但作为新手第一课,请务必按芯片规格最高72MHz来。
第四步:配置点灯引脚。在芯片引脚图上找到板载LED对应的引脚,常见有PA5、PC13、PB1、PD2,具体看板子原理图,不知道就看板子背面丝印。用鼠标左键点一下引脚,弹出菜单选GPIO_Output。然后在左边GPIO配置面板里,模式选Output Push Pull,上拉/下拉选No pull,速度选Low或High都行,对板载LED没有本质区别。
第五步:点Project Manager标签。Project Name填LED_Test,Location选一个纯英文目录比如D:\STM32_Project,Toolchain/IDE选择MDK-ARM,版本选V5。如果把工程放在中文桌面文件夹里,生成没问题,但Keil打开后编译有概率报奇怪错误,建议从一开始规避。最后点右上角GENERATE CODE,如果弹出是否打开工程的提示,选Open Project,Keil会自动启动并载入新工程。
4.2 Keil5编译与烧录:重点看这几个标签页
CubeMX自动帮你把Keil工程文件建好了,这一步非常省心。你现在要做的其实是检查三个地方,然后把程序烧进去。
打开工程后,界面左侧是Project窗口,在Core/Src/main.c里就是主程序。点工具栏“魔法棒”图标(Options for Target),打开工程设置对话框。第一个看Target页:Xtal(MHz)一般是8,表示外部晶振8MHz,这个值主要影响调试里的时钟估算,真正的时钟树是CubeMX生成的配置说了算。第二个看Debug页:右上角Use单选按钮,把默认的ULINK2 ASM Driver改成ST-Link Debugger;用DAP-Link就选CMSIS-DAP Debugger。改完之后点旁边的Settings,在弹出窗口里看SW Device区域,如果显示识别出一个Cortex-M3 SW-DP设备,甚至能看到一个IDCODE(常见像0x1BA01477或0x2BA01477),说明调试器已经和芯片握手成功。如果这里空白,回到第3.4节查驱动和接线。第三个看Utilities页:确认Use Debug Driver被选中,点Settings进入Flash Download,把Download to Flash和Reset and Run都勾上,Programming Algorithm里应该自动有对应芯片Flash算法,比如STM32F10x Flash。
设置完成后,按F7或点编译按钮(Build),下方Build Output窗口滚动编译信息,最后出现一行“0 Error(s), 0 Warning(s)”,说明代码生成和编译都正常。如果编译报错,双击错误信息跳到对应行,最可能的坑是头文件路径没配置好,稍后第5章讲。
编译通过后,把ST-Link四根线按SWDIO、SWCLK、GND、3.3V接好,板子供电正常。按F8或点Load按钮,看到下载进度,最后提示下载完成并自动复位运行。如果LED没闪,多半引脚记错或供电有问题,按下复位键再观察一次。
这里纠正一个常见误区:很多人第一次点Load后弹窗说连不上,第一反应是“芯片坏了”。实际上九成情况是驱动没装好、USB线没插对或SWD那几根线虚接。先在Debugger的Settings里看一眼识别结果,再判断板子是否坏了,这个顺序很重要。
4.3 代码写在哪、怎么改才不会被覆盖
成功跑了第一个程序后,就该开始真正写自己的代码了。CubeMX有个很贴心的机制叫User Code Section,全称是“用户代码段”。它会在main.c里预埋很多注释块,比如:
/* USER CODE BEGIN 2 */ /* USER CODE END 2 */你写自己的初始化逻辑就夹在BEGIN和END这两行注释之间。以后从CubeMX重新生成代码,只要注释块还在,里面的代码就不会被覆盖。反过来,把代码写在注释块外面,一次重新生成,修改就被清干净。这个机制是初学者最容易踩的坑,很多人只要在CubeMX里动过引脚就直接点GENERATE,然后发现代码没了,其实不是工具不好用,是代码写错了位置。
点灯代码量很小,把下面这段写在while (1)里面即可:
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); HAL_Delay(500);里面的LED_Pin和LED_GPIO_Port是CubeMX根据你命名的引脚自动生成的宏,不用手动记GPIOA、GPIO_PIN_5这些。如果你把引脚命名为LED,宏名就是LED_GPIO_Port和LED_Pin;命名为LED2,库里会生成对应的另外两个名字。这串代码的语义是:反转LED引脚电平,等500毫秒,再反转。HAL_Delay参数单位是毫秒,500代表0.5秒。
改完代码后一定要先按F7编译,再按F8下载。不要偷懒直接点Load,Keil的下载默认不会自动编译。养成“编译→下载→看现象”的循环习惯,后面排错效率会高很多。
5. 宝宝级避坑实录:这些问题我全踩过
5.1 安装期三大“装完不会用”难题
问题一:Keil的Device列表里找不到STM32。这几乎是“装完等于没装”的最高频问题,原因就是DFP没装。解决方法是打开Pack Installer,把Keil::STM32F1xx_DFP装好。如果Pack Installer卡在下载界面不动,可以去Keil官网下载对应.pack文件,下载好后双击,Pack Installer会识别并导入。导入之后重新打开工程,Device里就有了。
问题二:CubeMX双击图标没反应,或启动提示找不到Java。这类问题九成出在Java上。按第3.1节验证java -version,命令无效就去配Path;命令有效但CubeMX仍报Java缺失,很可能是Java位数或版本问题。我遇到过电脑里装了32位Java,CubeMX是64位程序,两边对不上,整了一晚上,卸载换64位JDK后立刻解决。
问题三:CubeMX下载固件包卡在Downloading Firmware,进度条很久不动。不同网络环境差别很大。我的办法是:先在Updater Settings里记下Repository路径,然后打开浏览器去ST官网找对应固件包的zip文件,下载完直接放进Repository目录,重启CubeMX让它校验并安装。这个方法听着土,实测比反复点Retry靠谱。注意先把之前下载残留的tmp文件清掉再放完整包,否则校验会失败。
5.2 烧录期三大“目标连不上”难题
问题一:Keil的Debug设置里显示No ST-Link detected。按这个顺序查:先看设备管理器有没有ST-Link设备,没有就装驱动;有但带感叹号就手动更新驱动;设备正常但Settings里就是没有,大概率是USB线问题——很多线看着正常,其实只供电不通数据,换根线试试;再不行就检查SWD四根线序,特别提醒GND一定要和板子共地。有些板子不单独供电时,靠ST-Link的3.3V也能点亮,但最好还是给板子独立供电。
问题二:下载时报Flash Download failed或Target DLL has been cancelled。这类提示多半和Flash算法没选对有关。回Utilities页,确认Use Debug Driver选中,Flash Download的Programming Algorithm里要有对应芯片的Flash型号。用F103C8时偶尔看到算法列表是空的,手动点Add按钮找STM32F10x Flash加进去就解决。另一种情况是芯片读保护已打开,需要用STM32CubeProgrammer先解除读保护,再回Keil烧录。
问题三:程序下载成功但上电不运行。按复位键看能否点亮。如果复位后依然没反应,检查BOOT0跳线帽是不是在1的位置。BOOT0拉高代表从系统存储器启动,芯片不会跑你的程序;正常应跳在0,从主Flash启动。这个细节能坑到一大片买开发板的新手。另外供电不稳也会导致程序跑飞,检查USB供电能力,别同时带动电机这类大电流外设。
5.3 Keil使用期两个小毛病:乱码与目录丢失
先说乱码。CubeMX生成的main.c里有很多英文注释,Keil5.38打开正常,但如果你自己在Keil里写中文注释,保存后再打开却乱码,通常是编辑器编码设置的问题。打开Edit→Configuration→Editor,Encoding选UTF-8即可。如果项目里已有其他编码的文件,统一改成UTF-8后重新打开就不会乱码。个别教程建议选GB2312,如果你不是写纯中文项目,建议以UTF-8为准,因为CubeMX和Keil的现代版本都对齐UTF-8。
再说左侧目录不见了。有时候关工程再打开,左测Project窗口不显示,很多人以为工程坏了。其实只是视图被关,在View菜单里勾选Project Window就能恢复。另外新装Keil的Project窗口可能在左上角缩成小标签,点一下展开。如果左侧目录在CubeMX重新生成后被重置,这也正常:CubeMX只保护User Code段,不负责保留你在Keil里手动建的文件夹分组,所以复杂工程建议把文件组织逻辑放回CubeMX的Project Manager里设置。
把上面这些坑汇总成速查表,方便以后直接对照排查:
| 现象 | 直接原因 | 处理办法 |
|---|---|---|
| Device列表找不到STM32芯片 | 缺少设备支持包DFP | 装Keil::STM32F1xx_DFP |
| CubeMX打不开 | Java缺失或版本不对 | 装JDK17并配好Path |
| 固件包下载卡住 | 网络到ST仓库不稳定 | 手动下载zip放入Repository目录 |
| Keil识别不到ST-Link | 驱动/USB线/接线 | 依次查设备管理器、换线、查线序 |
| Flash下载失败 | Flash算法缺失或读保护 | 检查Utilities页算法,CubeProgrammer解锁 |
| 下载成功但不运行 | BOOT0跳线错误 | 把BOOT0跳回0并复位 |
| 工程打开后目录不显示 | 视图被关闭 | View菜单勾选Project Window |
| 中文注释乱码 | 编码不一致 | Keil Editor统一UTF-8 |
最后再分享一个我个人的习惯:每次装完新环境,不会急着跑复杂项目,而是只烧录一个50ms翻转的点灯程序,确认IDE、编译器、调试器、时钟和Flash下载这五个环节全部打通,再开始学别的。这套流程能帮你省掉大量“学了半天才发现环境有问题”的返工时间。遇到问题也别慌,排查顺序永远是:先看设备管理器,再看Keil Debugger识别结果,最后才怀疑板子坏了。按这个顺序走,八成问题能在十分钟内定位。环境这套东西,一次摸通之后,以后换电脑、换板子都能照方抓药。