一、前言
STM32有不少可视化烧写工具,例如STVP和ST-LINK Utility等等。现在ST主推的是STM32Cube软件系列的STM32CubeProgrammer,功能更多。虽然这些工具挺好用,但是有时需要自己制作上位机来实现一键下载、测试、加密等功能时,这些软件就无法满足,要自己调用st-link读写stm32,可以借助命令行工具:
安装STVP后有 STVP_CmdLine.exe
安装ST-LINK Utility后有 ST-LINK_CLI.exe
安装STM32CubeProgrammer后有 STM32_Programmer_CLI.exe
下面就介绍如何调用STM32_Programmer_CLI.exe来实现st-link连接stm32,解除读保护,擦除、写入程序、校验,再添加读保护,读取ID,写入加密。
目录
三、 STM32_Programmer_CLI.exe 常用指令
3.4 -w, --write, -d, --download 下载命令
3.7 -r, --read, -u, --upload 读命令
3.9 -g, --go, -s, --start 运行指令
3.10 -rdu, --readunprotect 解除读保护
3.11 -ob, --optionbytes 选项字节命令
二、安装STM32CubeProgrammer
2.1 官网搜索STM32CubeProg,点击获取软件,下载STM32CubeProgrammer
2.2 STM32CubeProgrammer用户手册UM2237下载下来,里面有详细的命令行指令介绍。
2.3 选择安装路径,一路Next就行,有个STM32TrustedPackageCreator,博主也没用过,看介绍是ST推出的安全烧写工具,可以先对固件加密,再给产线或客户防止固件泄露,不过好像要买个STM32HSM的卡才能用吧。
三、 STM32_Programmer_CLI.exe 常用指令
3.0 批处理文件
装好后,在安装目录下可以找到STM32_Programmer_CLI.exe工具,如果忘了装哪了,右键快捷方式打开文件夹所在位置。
直接打开STM32_Programmer_CLI.exe会一下闪退,可以在同一目录下新建个批处理文件,来测试命令。右键新建文本文档,重命名把txt格式改成.bat文件。
bat用法简单说明,例如有如下命令:
第一行 “::”是注释本行内容
第二行 STM32_Programmer_CLI.exe 是要运行的程序, -h是命令
第三行 pause是暂停,防止闪退。
3.1 -h --help 帮助命令
说明:运行帮助命令后会显示所有的命令介绍。
示例:
::帮助
STM32_Programmer_CLI.exe -h
pause
运行结果:
3.2 -c, --connect 连接命令
说明:建立到设备的连接。该命令允许主机打开所选设备的端口(UART/USB/JTAG/SWD),基本上所有操作前都要先建立连接
语法: -c port=<Portname> [freq=<frequency>] [index=<index>] [sn=<serialNumber>] [ap=<accessPort>] [mode=<mode>]
[reset=<mode>] [shared]
参数<port>指定哪种接口,是必需的参数,值可以是UART/USB/JTAG/SWD,这里只用到SWD
参数<freq>指定频率,如下几种频率可选,未指定频率则使用默认的频率。
• ST-LINK v2/v2.1
– SWD(4000、1800、950、480、240、125、100、50、25、15、5)kHz
– JTAG(9000、4500、2250、1125、562、281、140)kHz
• ST-LINK v3
– SWD(24000、8000、3300、1000、200、50、5)
– JTAG(21333、16000、12000、8000、1777、750)
如果输入的值不符合这些值中的任何一个,则会考虑次高值。
默认频率值为:
– SWD:STLinkV2:4000 kHz,STLinkV3:24000 kHz。
– JTAG:STLinkV2:9000 kHz,STLinkV3:21333 kHz.
其他的参数<index>,<mode>,<ap>等等一般用不到,不用输入默认即可。
示例:
STM32_Programmer_CLI.exe -c port=SWD freq=4000
pause
使用st-link 连接 STM32F103,先插上st-link ,再运行以上命令,显示如下:
3.3 -e, --erase 擦除命令
说明:擦除命令有三种用法,可以擦除全部扇区也可以擦除指定扇区。
语法:-e [all] [sectorsCodes]
[all] :擦除全部闪存。
[sectorsCodes] :仅擦除指定扇区。
[<[start end]>] 擦除从“start”到“end”代码的所有扇区。
示例:
::擦除全部闪存
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -e all
::擦除指定扇区1和扇区2
::STM32_Programmer_CLI.exe -c port=SWD freq=4000 -e 1 2
::擦除从1 到 5 所有扇区
::STM32_Programmer_CLI.exe -c port=SWD freq=4000 -e [1 5]
pause
擦除全部扇区,运行后显示:
3.4 -w, --write, -d, --download 下载命令
说明:下载源程序到STM32中,支持bin, hex, srec, axf, elf, stm32 or tsv file格式。其中要注意bin文件是纯粹的二进制文件,需要指定起始地址,而hex、elf等带地址信息的不用指定。下载会判断地址范围,自动擦除扇区,所以不用写 -e 擦除指令了。
语法: -w <file_path> [start_address]
[file_path] :要下载的文件路径。
[start_address] :下载的起始地址
下载bin文件示例:
::下载bin文件到0x08000000
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -w D:\prog\Template.bin 0x08000000
pause
运行后如下:
记得要指定地址,不然会报错:Error: You must enter the write address to download binary file for STM32 MCU devices.
下载hex文件示例:
::下载hex文件
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -w D:\prog\Template.hex
下载hex文件即使指定地址也会被忽略:Warning: Write address is ignored for hex, Srec and elf files
3.5 -w32 写32位数据命令
说明: 将指定的32位数据从指定地址开始下载到闪存中,注意不像下载指令-w会自动擦除扇区,-w32写指令要手动调用擦除扇区指令-e后才能写。
语法: -w32 <start_address> <32_data_bits>
<start_address> :下载的起始地址。
<32_data_Bits> :要下载的32位数据。数据应使用空格进行分割
示例:
::先擦除扇区0,再从地址 0x08000000 开始写入0x12345678 0xAABBCCFF 0x12AB34CD
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -e 0 -w32 0x08000000 0x12345678 0xAABBCCFF 0x12AB34CD
pause
运行结果:
记得要调用擦除指令-e,不然会报错:Error: Failed to download data!If it's a Flash memory, it may be not erased or protected
3.6 -v, --verify 校验命令
使用-w和-w32写指令后,可以跟个-v校验命令,校验写入的数据是否正确
示例:
::下载hex文件并校验
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -w D:\prog\Template.hex -v
运行结果:
3.7 -r, --read, -u, --upload 读命令
说明:从指定地址开始读取设备存储器内容并将其上传到指定的二进制文件中,支持文件格式 .bin/.hex/.srec
语法: --upload <start_address> <size> <file_path>
<start_address> :读取的起始地址。
<size> :要读取的存储器内容大小。
<file_path> 上载存储器内容的二进制文件路径。
示例:
::从0x08000000开始读取32k数据到D:\prog\read.bin
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -r 0x08000000 0x8000 D:\prog\read.bin
运行结果:
3.8 -r32 读32位数据命令
说明:读取32位数据存储器,-r32 命令最大支持 32KB
语法: -r32 <start_address> <size>
<start_address> :读取的起始地址。
<size> :要读取的存储器内容大小(字节个数)
示例:
::从0x08000000开始读取100个字节
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -r32 0x08000000 100
运行结果:
3.9 -g, --go, -s, --start 运行指令
说明:该命令允许从指定地址开始执行设备存储器中的程序。
语法: --start [start_address]
[start_address]:要执行的应用程序起始地址。
示例:
::从0x08000000开始运行程序
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -s 0x08000000
运行结果:
3.10 -rdu, --readunprotect 解除读保护
说明:此命令通过将RDP级别从级别1更改为级别0来删除存储器读保护。
语法: --readunprotect
示例:
::解除写保护
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -rdu
结果:
3.11 -ob, --optionbytes 选项字节命令
说明:该命令允许用户通过显示或修改设备的选项字节来控制它们。注意不同系列的STM32选项字节不同,具体看参考手册
语法: -ob [displ] / -ob [OptByte=<value>]
[displ] : 该选项允许用户显示整套选项
字节。
[OptByte=<value>]: 该选项允许用户编程给定的选项字节。
示例:
::选项rdp修改为0xBB,开启读保护,并显示所有选项字节
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -ob rdp=0xBB displ
结果:
四、实际应用
4.1 读取ID
网上找了一张图,STM32的ID地址:
可以利用-r32命令读取ID,以stm32f429为例,读取ID所在地址0x1FFF7A10总共12字节
示例:
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -rdu -r32 0x1FFF7A10 12
结果:
4.2 实现烧写程序添加读保护
以stm32f429为例,-c使用st-link连接,-rdu先解除读保护, -w下载lcd.hex ,-v校验,-ob修改rdp=0xbb添加读保护,这里没应用-s运行命令,因为添加读保护后-s无效了,无法直接运行了。
示例:
STM32_Programmer_CLI.exe -c port=SWD freq=4000 -rdu -w D:\prog\LCD.hex -v -ob rdp=0xBB
pause
4.3 利用ID加密
由于bat文件不好计算和判断结果,下一篇介绍使用C#或QT调编写上位机,用 STM32_Programmer_CLI.exe实现烧写和加密。