1. 准备工作与工具认知
1.1 这套组合到底是干嘛的
很多刚接触STM32的朋友第一次听到“STM32CubeMX + Keil5”这个组合,会有点懵:这俩不是一个东西吗?为什么要装两个?其实它们的职责完全不同。STM32CubeMX是ST官方出的图形化配置工具,用来帮你选择芯片型号、配置引脚功能、设置时钟树、使能外设(串口、SPI、I2C、ADC等),然后自动生成初始化代码。你只需要用鼠标点一点,它就把底层那些容易写错的地方全给你处理好了。Keil5(准确说是MDK-ARM)则是编译、烧录和调试的集成开发环境,负责把你写的业务逻辑代码编译成芯片能运行的机器码,通过下载器烧进STM32,还能在线打断点调试。
我在带新手的过程里发现,大家最容易犯的错就是把“生成代码”和“编译运行”混为一谈。你用CubeMX画完电路配置,生成的只是一份“骨架代码”,这份代码要拿到Keil里打开、编译、下载,最终才能在开发板上跑起来。这两个工具是前后接力关系,缺一不可。
这套环境适合谁?如果你是大一电子/嵌入式专业的学生、刚转入单片机开发的在职工程师、或者纯粹自己买了一块板子想折腾的爱好者,这篇文章都适用。我会把安装过程中那些“教程里不会写但新人必然会踩”的坑都列出来,帮你少走几个小时的弯路。
1.2 安装前需要准备的物料清单
先别急着双击安装包,动手之前把以下几样东西备齐,不然中途很容易卡住:
- 一台Windows电脑,Win10/Win11都可以,64位系统最佳。Win7老电脑也能装,但新版CubeMX和Keil对Win7的支持已经逐渐变弱,如果你还在用Win7,最好装老一版的软件。
- 一块STM32开发板。最推荐的是STM32F103C8T6的“蓝板”或者Nucleo系列,因为资料多、成本低,网上随便一搜就是大把例程。手里没有板子的也没关系,CubeMX配置逻辑是通用的,你先装好环境、能编译出hex文件也算入门了一半。
- 一根USB数据线。这里有个很容易忽略的坑:很多Type-C或Micro-USB线是“纯充电线”,里面没有数据引脚,插上电脑完全识别不到设备。建议直接找手机的“数据线”,而不是充电线。STM32F103C8T6蓝板用的是Micro-USB接口,Nucleo板本身自带ST-Link调试器,用Type-C或Mini-USB直接连电脑就行。
- 稳定的网络环境。后面CubeMX首次打开需要下载芯片固件支持包,Keil5的Pack Installer也需要联网拉取STM32芯片支持包,这一步对网络要求比较高。如果你在实验室、公司的内网环境,很可能会遇到下载超时,后面我会单独说怎么处理。
1.3 版本选择建议:别一上来就装最新版
关于软件版本,我强烈建议你遵循一个原则:够用、稳定、教程对得上。STM32CubeMX目前主流版本是6.x,安装包自带Java运行时环境,不需要你再单独装JDK——这是6.x相比5.x最大的变化,对新手友好很多。如果你看到网上老教程说“STM32CubeMX需要先装Java”,那是针对5.x及更早版本的,6.x完全不需要,别被旧教程带偏。
Keil5这边,官方叫“Keil MDK-ARM”,不要装成“Keil C51”。这两个是完全不同的产品线,C51是给8051单片机用的,STM32属于ARM Cortex-M内核,必须用MDK-ARM版本。很多人装完发现“为啥我的Keil里找不到STM32芯片”,十有八九就是装错了版本。
版本号方面,MDK-ARM老版本5.20到5.37我都用过,日常开发区别不大,建议直接装5.36以后的新版本,因为带新版Arm Compiler 6,编译效率高一些。但也不要盲目追最新的每一个小补丁版本,新版本偶尔会有一些莫名其妙的兼容性问题。我目前推荐5.36或5.37这个区间的稳定版本。
2. STM32CubeMX完整安装全流程
2.1 从官方渠道下载安装包
打开搜索引擎,搜“STM32CubeMX官网”或者直接输入ST的官方网址,找到“STM32CubeMX”的产品页面。注意认准域名是st.com结尾的官网,别去了第三方下载站。第三方站点的安装包经常捆绑垃圾软件,而且版本往往是旧的,甚至有可能被植入恶意代码。
打开官网产品页面后,选择“Get Software”或“Download”按钮。ST官网通常要求你注册一个ST账号,这个账号是免费的,几分钟就能搞定。很多新手看到“注册”就不想弄了,我劝你别懒这一步,因为后面下载固件包、申请license试用都会用到同一个账号。
下载的时候记得选Windows版本,文件是一个类似en.stm32cubemx-win_v6-11-1.zip的压缩包,注意它是个zip,不是exe。下载完成后先解压,解压出来的文件夹里会有一个SetupSTM32CubeMX.exe或者类似的文件,双击开始安装。
安装过程本身很无聊:一路Next,选安装路径。这里有一个必须强调的硬性要求:安装路径一定不要有中文。举个例子,你可以装到D:\STM32CubeMX,但绝对不要装到D:\软件\STM32CubeMX这种目录。STM32CubeMX和Keil对路径中的中文字符兼容性时好时坏,一旦出问题,表现是打不开工程、生成代码失败、固件包下载不了,排查起来让人非常痛苦。说的极端一点,所有嵌入式开发工具都建议装到纯英文、没有空格的路径下。
2.2 首次启动和Workspace路径设置
安装完之后第一次启动CubeMX,它会问你要一个Workspace路径。这个Workspace是用来存放你以后的CubeMX工程文件的,默认在C盘的用户目录下。我建议你改到D盘建一个英文路径,比如D:\STM32CubeMX_Workspace,理由同样是为了避免C盘空间耗尽、路径带中文等问题。
设置完路径后,主界面会出来。刚开始你会觉得界面有点复杂,左边是芯片选择列表,右边是信息和帮助区,顶部菜单栏有一堆功能。第一次用不需要害怕,你只需要认识一个核心入口:在左边“Board Selector/ MCU Selector”区域输入芯片型号,比如输入STM32F103C8T6,然后双击选中,就会进入图形化配置界面。
这里会遇到第一个可能的拦路虎:如果是6.x版本,打开配置界面时如果本地没有对应的芯片固件支持包,CubeMX会提示你是否在线下载,英文叫“Download”。新手直接点下载就行,等它下载完自动安装。但如果你点击下载后进度条纹丝不动、一直转圈,十有八九是网络问题。接下来细说怎么处理。
2.3 固件包下载失败的三种自救方案
芯片固件支持包(Firmware Package,FP)是CubeMX生成代码所需的底层库。缺少它,你连工程都建不了。所以这一步非常关键。
第一种方案:检查网络环境后重试。校园网、公司网经常拦截来自国外服务器的下载请求,你可以试着连手机热点,下载成功率会高很多。
第二种方案:手动下载固件包并放到本地。打开浏览器访问ST官网的“STM32Cube MCU Package”页面,找到你需要的那一款,比如STM32F1系列对应的是STM32CubeF1,下载STM32Cube_FW_F1_V1.8.5.zip这类包。然后把zip文件放进电脑某个目录,在CubeMX的Help->Manage embedded software packages界面里点击“From Local”或“Import from folder”,选中你下载的zip文件,它就会完成导入安装。这个方案在国外服务器访问不畅时非常管用。
第三种方案:设置代理。以上就是第三种,但我不展开说,很多读者会遇到。总之记住一个原则:下载固件包的问题大多是网络问题,多换几种网络环境试试,实在不行就手动下载本地导入,肯定能解决。
2.4 关于“汉化”的几句话
网上搜索“STM32CubeMX汉化”能找到很多第三方汉化包,但我个人建议:不要汉化。原因有两点:第一,第三方汉化包和软件版本不匹配的话,轻则界面不全,重则软件崩溃;第二,CubeMX的英文界面其实非常有限,核心单词就几十个:Pinout(引脚)、Clock Configuration(时钟配置)、Project Manager(项目管理)、Generate Code(生成代码)。你用一次两次就熟了,完全不需要汉化。嵌入式开发中大量资料本来就是英文的,早点适应英文工具,以后看芯片手册、查数据手册都会轻松很多。
3. Keil5(MDK-ARM)安装完整全流程
3.1 安装前必须搞清楚的版本坑
Keil5在圈内一般就是指“Keil MDK-ARM”这个版本,但很多人下载的时候会搜到“Keil C51”,这是给8051单片机用的另一个独立软件。如果你下载的是C51版,安装后打开界面会发现里面根本没有STM32相关的芯片选项,你会误以为自己安装失败。正确姿势是直接去ARM官网或Keil官网的MDK-ARM下载页面,下载安装包。文件通常叫MDK536.EXE或者Keil.MDK.5.36.exe这类名字。
这里还有一个经典问题:能不能让Keil5同时支持C51和STM32?答案是这两个版本的内核不一样,不能装在同一目录里“二合一”。网上有流传的一些兼容包、合并工具,本质上是在两个不同目录分别装好后做文件层面的手工整理,非常折腾,而且版本一升级就失效。如果你手头既要玩51又要玩STM32,我的建议是安装两次,一次MDK-ARM,一次C51,装到两个不同的目录,桌面放两个快捷方式,互不干扰。别去追求“一个Keil搞定全部”,省那点空间不值得。
3.2 安装过程几步走
拿到安装包后,右键选择“以管理员身份运行”。安装路径同样要求纯英文,比如D:\MDK-ARM,别用默认的C盘也行,但路径中绝对不能有中文。安装过程中它会问你你是否要安装“ULINK Driver”等调试器驱动,保持默认全选即可,这些驱动后面烧录时会用到。
这里有个细节:MDK-ARM本体装完后,你打开它,迎面而来的不是熟悉的Keil界面,而是一个“Pack Installer”窗口。如果你不小心把这个窗口关了,可以通过Keil菜单栏的Tools->Pack Installer重新打开。Pack Installer的作用是管理各种芯片的支持包,我们后面要用它给Keil装上STM32系列芯片的描述文件和数据包。
3.3 给Keil5添加STM32芯片支持包(Device Pack)
这一步是新手最容易忽略、又最关键的步骤。你打开Pack Installer后,会看到一大堆厂商列表,找到STMicroelectronics这一条,点开它,展开后会看到STM32F1 Series之类的子项。在每一项后面有个“Install”按钮,点一下就开始下载安装对应的芯片支持包。
这里我建议只安装你用到的系列就够了。比如你用的是STM32F103C8T6,那就只装STM32F1 Series DFP即可,不必把F0、F3、F4、H7全装了。全装会占用大量时间,而且PACK包的体积不小,纯粹浪费时间。如果你用的是别的型号,比如STM32F407,就找STM32F4 Series DFP。
下载安装芯片支持包同样可能遇到网络不给力的问题。和CubeMX固件包类似,你可以去Keil官网的Device Pack页面下载对应.pack离线包,然后在Pack Installer界面右下角选“File” -> “Import…”导入离线pack文件。离线包在官网的下载速度有时候比在软件里直接下载还快,强烈建议网络不畅的同学走这条路。
安装完成后,回到Keil主界面,新建工程,点击Project->New µVision Project,然后在弹出的选择框里展开STMicroelectronics,你会看到STM32F1 Series下面列出各种型号,输入STM32F103C8快速筛选,选中它。如果这一步你能顺利看到型号列表,说明支持包安装成功了。
3.4 Keil5的授权问题怎么处理
关于软件授权,我只能说有两点:一是Keil MDK官方提供30天评估版,你装完后什么都不用做直接能用30天,用来学习入门完全足够了;二是如果你是学生或者个人开发者,可以关注厂商的教育授权计划,有些还有免费或优惠渠道。正版授权的流程是在Keil的File->License Management里输入你的订单号或激活码,然后在线激活。
我也知道网上很多教程会让你“下载注册机”,我劝你别碰那东西,来历不明、捆绑病毒的案例太多,以前还有开发者编译的代码被篡改后导致电脑中毒的事情。嵌入式开发绕不开知识产权的问题,如果你只是学习,30天试用期用完,重新安装一次系统环境或者申请官方试用续期,都比冒电脑风险去用破解要靠谱。这篇教程只谈技术安装,不涉及任何破解内容。
3.5 安装ST-Link驱动
很多开发板自带ST-Link/V2下载器(比如Nucleo板),或者你单独买了一个十几块钱的ST-Link/V2的小棒子,插上电脑后Windows可能会弹出“设备驱动未安装成功”。不装好驱动,后面Keil烧录时百分百提示“No Target Connected”找不到芯片。
去ST官网搜索“ST-Link USB Driver”或“STSW-LINK009”下载驱动包,解压运行ST-Link_USBDriver.exe安装即可。安装完成后,把ST-Link插入电脑USB口,在设备管理器里能看到STM32 ST-Link相关的设备,就说明驱动OK了。
4. 第一个STM32工程:从CubeMX生成到Keil烧录
4.1 在CubeMX里新建工程并配置引脚
环境都装好后,我们直接实战一次。打开STM32CubeMX,在MCU选择界面输入STM32F103C8,双击选中芯片,进入Pinout配置界面。
这个界面长得像一块芯片的引脚图,左边一堆引脚标着默认功能。我们的第一个目标很简单:点亮开发板上的LED。以最常见的STM32F103C8T6蓝板为例,板上有一个LED接在PC13引脚(少数板子是PB2或PA1,你看下板子丝印或者卖家资料确认),所以我们把PC13这个引脚配置为GPIO输出。
鼠标左键点击PC13引脚,在出现的菜单中选择GPIO_Output。然后在左侧栏目里找到System Core->GPIO,展开后可以看到PC13的配置项:GPIO output level选High或Low都行,GPIO mode选Output Push Pull,速度无所谓。LED点亮逻辑取决于板子电路,低电平点亮还是高电平点亮可以在代码里灵活调整。
4.2 时钟树配置:别再被“72MHz”吓到
点击页面上方的“Clock Configuration”标签,进入时钟树配置界面。这里新手容易一脸迷茫,但其实只需要三步:把HSE(外部高速晶振)设为Crystal/Ceramic Resonator,然后把PLL Source设为HSE,最后把System Clock MUX(系统时钟选择)设为PLL,在HCLK输入框直接输入72,回车。软件会自动帮你计算好分频倍频,并提示你参数是否合法。HCLK也就是系统主频跑到72MHz,这是STM32F103的最高频率。
为什么这里要选HSE而不是HSI?因为板子上通常有8MHz的外部晶振,用它做时钟源比芯片内部的HSI精准得多。串口通信、ADC采样这些对时钟精度敏感的功能,最好都走外部晶振。当然,如果你的板子没有外部晶振(非常少见),就保持默认HSI,功能也能跑。
4.3 生成MDK-ARM工程代码
在生成代码前,先设置Project Manager。点击页面上部的“Project Manager”标签,在Project选项卡里设置工程名称,比如LED_Test,路径就是你之前设置的Workspace。这里有一个马虎不得的地方:Toolchain / IDE那一栏必须下拉选MDK-ARM V5,因为我们要用Keil5打开,选V5对应的工程文件格式更兼容。如果你装了最新版Keil且编译器是AC6,也可以选MDK-ARM V5然后在Keil里自己切换编译器,问题不大。
设置完成后,点击右上角的Generate Code按钮。如果之前固件包安装正常,你会看到右下角提示生成完成,还可能弹出一个“Open Project”的按钮,点它就直接打开Keil工程了。
4.4 在Keil5里写第一行用户代码
Keil打开工程后,左侧Project栏找到Application/User/Core下的main.c,双击打开。找到int main(void)函数里的while (1)循环,在里面加点亮LED的代码。最经典的做法是:先在main函数外定义一个延时函数,或者直接用HAL库的HAL_Delay:
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay(500); } /* USER CODE END WHILE */写完代码后,点编译按钮(快捷键F7)。如果一切顺利,底部输出窗口会显示0 Error, 0 Warning。看到这个结果,说明代码编译已经没有问题了。
4.5 配置下载器并烧录
接下来配置烧录方式。点菜单栏的魔术棒(Options for Target),切到Debug选项卡。左侧选择ST-Link Debugger,然后点旁边的Settings,在弹出窗口里如果能看到IDCODE有值,说明ST-Link已经识别到芯片了。把右下角Flash Download里的Reset and Run勾选上,这样程序烧录后会自动复位运行,不用你手动按复位键。
回到主界面,把ST-Link接上开发板,板子供电可以是USB供电或ST-Link供电(部分ST-Link引出3.3V)。然后点“LOAD”按钮(快捷键F8),下载完成后如果看到窗口提示Application running,并且板上的LED开始以一秒两次的频率闪烁,恭喜你,整个环境已经彻底打通了。
5. 常见问题速查与避坑心得
5.1 问题速查表
安装这套环境的过程中,新手几乎必踩以下几个坑,我按症状整理了一张排查表:
| 现象 | 可能原因 | 解决方向 |
|---|---|---|
| CubeMX双击没反应 | 缺少JRE / 版本过旧 / 路径中文 | 换6.x版本,确认安装路径纯英文,尝试管理员身份运行 |
| CubeMX新建工程时提示Download固件包失败 | 网络访问国外服务器超时 | 手机热点重试;官网手动下载zip本地导入 |
| Keil里找不到STM32芯片 | 装成了C51版 / 未安装Device Pack | 换成MDK-ARM版本,Pack Installer里装STM32F1/F4 DFP |
编译报错Target uses ARM-Compiler | 编译器版本与工程设置不符 | 魔术棒 -> Target -> 切换AC5或AC6编译器 |
烧录时报No Target Connected | ST-Link驱动未装 / 接线错误 / 供电不足 | 重装ST-Link驱动;检查SWD的CLK、DIO、GND、3V3四根线;给板子单独供电 |
烧录时报RDDI-DAP Error | 芯片进入低功耗模式或接线问题 | 按住板子复位键再烧录,或者把BOOT0拉高再试 |
| 程序烧了但板子没反应 | 引脚认错 / 时钟没配好 / 没有勾Reset and Run | 核对板子LED引脚;重新配置时钟树;勾选Reset and Run后重新烧录 |
5.2 安装顺序与个人使用心得
我在实际工作中安装这套环境的顺序是:先装Keil MDK-ARM,再装STM32CubeMX。没有严格的先后要求,但先装Keil可以先把它庞大的支持包装好,后面CubeMX生成代码后打开工程会感觉流程更顺。另外Keil的安装时间比较久,可以先让它后台装着,同时去官网下载CubeMX安装包,节约时间。
还有一个小技巧,CubeMX生成代码后,不要手动去改那些/* USER CODE BEGIN */和/* USER CODE END */之外的内容。HAL库把你每次重新生成代码时需要的保护区留好了,如果你改了保护区以外的内容,下次在CubeMX里改动配置并点击Generate Code,你改的东西会被直接覆盖掉。正确做法:把自己的业务代码永远写在USER CODE注释区之间,这是无数人用血泪换来的教训。
最后再分享一个经验:刚装完环境后,建议把CubeMX的工程文件夹和Keil工程文件夹做一个备份归档。万一后面电脑出问题或者自己乱改配置把工程搞崩了,有一个兜底的干净模板,重新开始只需要几分钟。另外,每次烧录前保证板子和ST-Link之间的杜邦线尽量短,接触不良的杜邦线是很多“为什么找不到芯片”问题的罪魁祸首。