1. STM32CubeProgrammer工具简介
STM32CubeProgrammer是ST官方推出的一款多合一编程工具,它整合了ST Visual Programmer、DFUse Device Firmware Update、Flash Loader和ST-Link等工具的功能。这个工具最大的特点就是支持多种连接方式(SWD/JTAG/UART/USB/I2C/CAN)和多种文件格式(bin/hex/elf等),能够满足不同场景下的开发需求。
我第一次接触这个工具是在2018年,当时还在用ST-Link Utility给开发板烧录程序。后来发现ST官方推荐使用STM32CubeProgrammer,就果断切换过来了。用下来发现确实方便很多,特别是它的跨平台特性,在Linux和Mac上也能用,这对我们这些用不同操作系统开发的工程师来说太友好了。
2. ST-LINK固件升级实战
2.1 为什么需要升级ST-LINK固件
ST-LINK是ST官方提供的调试器,很多开发板都自带这个调试器。但是随着时间推移,ST会不断更新ST-LINK的固件版本。如果你遇到类似"Old ST-LINK firmware version"这样的错误提示,那就说明需要升级固件了。
我遇到过最典型的情况是:新买的开发板连接电脑后,STM32CubeProgrammer提示无法连接,日志窗口显示"DEV_OLD_FIRMWARE_WARNING"。这就是典型的固件版本过旧的问题。
2.2 升级步骤详解
升级ST-LINK固件其实很简单,跟着我做:
- 首先确保你的ST-LINK已经通过USB连接到电脑
- 打开STM32CubeProgrammer,在右侧工具栏找到"Firmware Upgrade"按钮并点击
- 这时会弹出ST-LinkUpgrade工具窗口
- 点击"Open in update mode"进入升级模式
- 工具会自动检测当前固件版本和最新版本
- 点击"Upgrade"按钮开始升级
这里有个小技巧:如果工具显示固件版本为"Unknown",可以尝试重新插拔ST-LINK,或者换个USB接口。我在实际使用中发现,有些USB3.0接口兼容性不太好,换成USB2.0接口就正常了。
2.3 常见问题解决
问题1:升级过程中提示"USB communication error"
- 解决方法:检查USB线是否接触良好,建议使用原装线缆。如果还不行,可以尝试重启电脑。
问题2:升级完成后还是提示版本过旧
- 解决方法:有时候需要升级两次才能完全更新。我第一次遇到这种情况也很困惑,后来发现是升级流程需要重复执行一次。
问题3:升级工具无法识别ST-LINK
- 解决方法:检查设备管理器中是否有未知设备,可能需要手动安装驱动。驱动可以在ST官网下载,搜索"STSW-LINK009"就能找到。
3. 开发板程序烧录指南
3.1 准备工作
在开始烧录前,我们需要准备:
- 安装好的STM32CubeProgrammer
- 开发板(我用的是STM32F769I-DISCO)
- 编译好的程序文件(bin/hex格式)
这里有个建议:如果你是新手,可以先从ST官方例程开始。比如在STM32CubeF7软件包中就有很多现成的例程,可以直接编译生成hex文件。
3.2 烧录步骤
- 连接开发板:通过ST-LINK将开发板与电脑连接
- 打开STM32CubeProgrammer,选择连接方式为ST-LINK
- 点击"Connect"按钮建立连接
- 在"Erasing & Programming"页面,点击"Browse"选择要烧录的文件
- 建议勾选"Verify programming"和"Run after programming"选项
- 点击"Start Programming"开始烧录
烧录过程中,底部的日志窗口会显示进度。我通常用hex文件,因为这种格式包含了地址信息,不容易出错。如果是bin文件,需要手动指定烧录地址。
3.3 文件格式选择
STM32CubeProgrammer支持多种文件格式,最常用的是bin和hex:
- hex文件:包含地址信息,直接烧录即可,适合初学者
- bin文件:纯二进制,需要指定烧录地址,适合高级用户
- elf文件:包含调试信息,适合开发阶段使用
我个人的经验是:产品发布用bin文件,开发调试用elf文件,快速测试用hex文件。
4. 高级功能与技巧
4.1 外部存储器编程
STM32CubeProgrammer支持对外部存储器的编程,这个功能很实用。比如你的板子上接了SPI Flash或者QSPI Flash,可以通过以下步骤操作:
- 在"External Loader"页面选择对应的loader
- 在"Erasing & Programming"页面选择外部存储器地址范围
- 正常烧录即可
需要注意的是,不同型号的外部存储器需要不同的loader。ST官方提供了一些常见存储器的loader,如果需要支持新的存储器,可能需要自己开发loader。
4.2 命令行模式
对于批量生产环境,图形界面可能不太方便。这时可以使用命令行模式:
STM32_Programmer_CLI -c port=SWD -e all -w my_firmware.hex -v这条命令的意思是:
- -c port=SWD:使用SWD接口
- -e all:擦除所有Flash
- -w my_firmware.hex:烧录hex文件
- -v:烧录后校验
我在自动化测试中就经常用命令行模式,可以集成到CI/CD流程中。
4.3 选项字节配置
选项字节(Option Bytes)是STM32的一个重要功能,可以配置读保护、写保护等安全设置。在STM32CubeProgrammer中操作很简单:
- 切换到"Option Bytes"标签页
- 修改需要的配置
- 点击"Apply"按钮
比如要设置读保护为Level 1,只需要将RDP值改为0xBB即可。这个功能在产品量产时特别有用,可以防止代码被读取。
5. 常见错误排查
5.1 连接问题
错误提示:"Cannot connect to target"
- 可能原因:
- 开发板没供电
- 接线错误
- 芯片处于低功耗模式
- 解决方法:
- 检查开发板供电
- 检查SWD接线(SWDIO、SWCLK、GND)
- 尝试复位芯片
5.2 烧录问题
错误提示:"Error: Flash download failed"
- 可能原因:
- Flash被写保护
- 电压不稳定
- 时钟配置错误
- 解决方法:
- 检查选项字节中的写保护设置
- 确保供电稳定
- 检查芯片时钟配置
5.3 固件兼容性问题
错误提示:"Incompatible firmware version"
- 可能原因:ST-LINK固件版本与工具版本不匹配
- 解决方法:升级ST-LINK固件到最新版本
6. 实际项目经验分享
在最近的一个物联网项目中,我们需要对100多块STM32板子进行批量烧录。刚开始用图形界面一个个烧录,效率太低。后来改用命令行模式配合脚本,效率提升了10倍不止。
具体做法是:
- 编写一个批处理脚本,调用STM32_Programmer_CLI
- 使用USB Hub同时连接多个ST-LINK
- 通过脚本自动识别并烧录每个设备
这个方案不仅速度快,而且不容易出错。特别是在生产线上,工人只需要按一个按钮就能完成整个烧录过程。
另一个经验是关于固件加密的。STM32CubeProgrammer支持对固件进行加密烧录,这个功能在产品量产时非常有用。我们是这样做的:
- 使用STM32TrustedPackageCreator工具生成加密密钥
- 对固件进行加密
- 使用STM32CubeProgrammer的安全烧录功能进行烧录
这样即使有人拿到芯片,也无法读取里面的程序,有效保护了知识产权。