0%

STM32H743无法烧录Flash问题解决

TL;DR

支持STM32H7芯片的st-link已经修改好,放到我的github 上了(st-link已经禁止外人提交PR了)。这个是在1.6.1的版本基础是进行的修改,供大家参考,欢迎拍砖批评。当然代码中还有些问题,比如只使用了一个Bank,超过1M的bin文件会出问题,但目前至少能使用,其他后续再改。

背景

因为看上STM32H7的高性价比,所以买来一块正点原子的核心板学习一下。ST官方文档中宣称STM32H743的JPEG(640*480)压缩能力能达到16fps,在考虑用H743准备做一个低成本的Camera。

然而调试却不是那么顺利。我平时烧录和调试都用的是st-link,但是st-link不支持STM32H7系列的芯片!

搜到st-link的相关issue:STM32H7xx support,发现这个问题从2018年2月就有人提,到现在2年多还没解决。st-link官方推荐去使用openocd去烧录h7系列??给竞对送用户,我看他们是不想干了吧。

无奈,只好下载openocd去烧录,我对openocd不熟,而且他也很复杂,烧录的程序貌似有问题,而且又烧录几次后,板子不亮了,没有反应了,提示openocd halt Handler HardFault。我以为板子被烧坏了。

Windows环境烧录

板子不亮了,还想再试试救救。平时都在Mac下烧录,我转到Windows上,看看Keil能否救活STM32H743。于是安装了Keil,结果还是不行。选择“Erase full chip”也不行。始终报错Error: Flash Download failed - “Cortex-M7”

google一下,发现还是有不少人遇到同样问题,而且有人解决了[1],他的方式是下载最新的pack包。于是赶紧下载最新Keil.STM32H7xx_DFP.2.5.0.pack包。竟然神奇的烧录成功,板子恢复正常了。

Mac环境烧录

虽然板子可以用了,但是需要去Win下开发,感到十分恶心。还是想再看看怎么能让st-link跑起来。就开始研究st-link的代码,发现几篇关于SWD协议,st-link研究的文章[2][3][4]给我很多启发,于是决定自己动手改st-link。

通过查看st-link代码发现,他是先通过获取芯片的chip-id,然后在进行flash upload。但是第一步chip-id就没有获取成功。仔细看RM0433参考手册,发现其实保存H743 chip-id的DBGMCU的地址是0x5C001000。

其次,需要注意的地方是Flash 的寄存器地址全部都和F7/F4系列不一样。Flash寄存器基地址在RM0433中没有描述,然而在HAL库的代码中能找到寄存器基地址。找到基地址了,按照参考手册的寄存器偏移和各个位的功能,就可以开始操作Flash了。

而且最后没有使用st-link那种先把flash uploader写到sram中,然后再烧录,而是直接写flash,只要做好32Byte对齐就好。

修改这几个地方后,一切又恢复如初,我可以继续在Mac下用Vscode+st-link+cubeMX开发了,比Win下开发顺畅多了。

后记

本来想提交PR,或者把这些发现告诉st-link,结果发现他们既不让外人提comment,也不让外人提交PR。只是冷冰冰的提示一句“An owner of this repository has limited the ability to open a pull request to users that have contributed to this repository in the past.” 现在st-link完全是个封闭的小圈子再搞,无语。所以我把代码放到我的github 了,有需要的小伙伴可以自行下载使用。


  1. 上手Nucleo H743ZI 开发板下载失败问题解决方法 ↩︎

  2. STM32: ST-LINK/V2与STLINK/V2-1 DFU协议分析 ↩︎

  3. ARM调试原理【调试接口框图】【SWD时序】【SWD主机】 ↩︎

  4. SWD协议研究 ↩︎