本文档主要用来介绍记录在软件升级过程中使用STM32CubeProgrammer中遇到的问题,以STM32H743的板卡为例来说明。
为了在现场容易下载和升级程序,我们在代码的HMI界面中加入了软件升级按钮,点击后,会跳到STM32的系统bootloader,进入代码升级过程,STM32的系统bootloader是芯片出厂内置的,省去了自己做bootloader的麻烦,方便快捷。因为界面的字体和图片等资源文件都是存在外部QSPI flash里的,使用的是华邦的flash,因为STM32CubeProg自带的不支持华邦的,所以需要自己做一个下载算法放入安装目录就可以使用了。
STM32CubeProgrammer下载算法制作
首先我们测试的时候是用ST-LINK通过CubeProg可以正常下载内部和外部falsh,证明下载算法是没有问题的。
但是当换为USB 采用DFU模式升级时候,外部flash升级不成功。内部可以正常下载,
反复多次实验都不成功,开始怀疑是下载算法有问题,后来经过验证下载算法没有问题,是CubeProg 不支持升级外部 flash导致。但为了解决这个问题有两种方案
1, 因为界面简单,资源文件也不大就放入内部flash,可以正常升级和使用
2, 就得自己做个bootloader。将内部程序和外部程序合为一个Hex,这样也可以采用USB DFU升级。
就当前的简单应用选择采用第一种方案,
后期不知道ST 会不会升级这个功能。看到网上遇到这个问题的人还不少。
另外这里要提一点,STM32H743的手册上给的系统bootloader跳转地址是有问题的,正确的应该是
0x1FF09800
3. 跳转实现
进入系统bootloader 一种可以通过boot引脚,另一种就是通过软件跳转,通过软件跳转前需要处理以下工作
关闭全局中断
关闭滴答定时器,恢复到默认值
时钟恢复默认值,使用HIS
清除中断挂起标志
使能中断
跳转前最好将使用的外设去初始化
设置堆栈指针
跳转至系统bootloader。
将这些封装为一个函数,在收到软件升级指令后进行跳转升级就可以了。
现在也有很多开源的不错的bootloader,大家可以参考下。