背景介绍:
STM32 有许多种烧写固件的方法,本文说说 dfu 方法。
有些时候由于某种离普的软件错误,可能导致 JLink、STLink 连不上,这时就可以用 dfu 来救场。
Windows 下使用 DfuSe 网上方法很多,本篇 Sugar 主要说一下在 Ubuntu 上怎么用 dfu。
下面来看一看 dfu 是怎样只用一根 USB 线救场的。
Ubuntu 18.04 安装 dfu-util
sudo apt-get install dfu-util
安装过后查看一下版本
# 注意 V 是大写dfu-util -V
查一下 dfu-util 的说明文档
链接地址:http://manpages.ubuntu.com/manpages/bionic/man1/dfu-util.1.html
根据 2020 年 03 月 20 日的信息,可以列出下表:
Ubuntu 版本 | dfu-util 版本 |
---|---|
14.04 LTS | 0.5 |
16.04 LTS | 0.8 |
18.04 LTS | 0.9 |
19.04 | 0.9 |
19.10 | 0.9 |
使用方法
常用命令解析。
1、查看 dfu 的可用设备 dfu-util -l
或 dfu-util --list
2、通过 idVendor
和 idProduct
指定 dfu 设备并刷入固件。
(1) 通过 lsusb
得到 idVendor 和 idProduct,如下图:
(2) dfu-util -d 0483:df11 -a 0 -D bootloader.dfu
-d, —device 当电脑上只接了一个 dfu 设备的时候这个项是可选的(就是说可以不写)。
-a, —alt 对于单片机,这项带上参数 0 就行了。
-D, —download 要烧录的 dfu 固件。
使用 dfu-util 烧写 bin 文件
*.bin
固件不像*.dfu
固件一样包含地址信息,因此需要指定烧写地址。
通过-s
指定烧写地址,注意 s 是小写,例:
# :leave 是说烧写后单片机退出 dfu 模式开始运行的意思。dfu-util -a 0 -s 0x08000000:leave -D bootloader.bin
使用 dfu-util 读出单片机里的固件
这个功能 Sugar 基本不用,这里只把示例简单写一下。
通过-U
参数实现固件上载。下面示例从 0x08000000 上载 1KB 的 Flash 内容:
# -U, —upload FILEdfu-util -a 0 -s 0x08000000:1024 -U newfile.bin
PS
使用 dfu 硬件上要将 BOOT0 接高电平,这点在这里简单提一下,如有不清可以百度(关键词:STM32 启动模式)资料很多这里不再赘述了。再次提一个要点:dfu 在 Ubuntu 上可以烧写 *.bin
固件。这意味着忘记带 JLink/STLink、手边也找不到 USB 转串口的时候也能烧写固件,非常爽。
Sugar 一度认为 dfu 是万能救场模式,直到遇到 STM32H743VIT6 V 版芯片才发现 dfu 也有局限,但这并不影响 dfu 的救场功能。关于 V 版芯片的 dfu 问题 Sugar 是在玩儿 OpenMV 时遇到的(dfu 刷固件卡在 49% 不动),过坑方法后面会推文。
OpenMV 固件源码 500 多 MB,考虑到部分读者在 github 上 clone 困难,Sugar 将源码打包在天翼网盘,公众号后台回复 code 得到网盘地址。读者还想要什么 github 上的代码可以后台留言,Sugar 网盘有 15GB 全部可以用来共享代码。
关注作者
欢迎扫码关注我的公众号MultiMCU EDU
。