前言 3 V' j" h- u% N6 R STM32F750和STM32F730在STM32F7系列中具有极高的性价比。因为他们内部的Flash只有64KB,经常需要扩展QSPI Flash,所以在STM32CubeF7库中大部分都是提供使用外部QSPI Flash的例程,导致有些用户不清楚如何在ARM Keil中对其内部Flash进行烧写。 问题 : u# Y+ o! J0 ^$ A0 W1 t 某客户在其产品的设计中,使用了STM32F750Z8T6。客户的代码只需要使用内部Flash,但不知如何对其进行烧写。 , G" n9 V: c6 j V M7 J 调研 1. 了解问题 6 }7 m" q. |* p1 v4 K 客户对STM32的了解就是内部Flash的地址就是从0x08000000开始,对于STM32F750,大小为64KB,也就是内部Flash地址为0x08000000~0x0800FFFF。所以客户在其Keil工程项目配置中,在Target页面配置好IROM如下: 然后,客户在工程项目配置的Utility页面,点击Setting按钮,选择Flash Download页面,选择Add按钮,增加了内部Flash的编程算法,如下: ' t) [9 P# ^* Q6 n. H点击OK后,回到项目中,进行代码编译,编译成功后进行代码下载,遇到如下错误: 5 \2 ~" b' |: ~0 m' r客户说在编程算法的添加项,只有STM32F75x 64 TCM Flash添加,但是其地址是从0x00200000开始的,觉得很奇怪,没有从0x08000000地址开始的编程算法可选。怀疑是这里的问题。 2. 分析问题 打开STM32F7的Cube库,看了一下STM32F750的例程,使用Keil打开,确实发现如客户所说的内部Flash编程算法只有STM32F75x 64 TCM Flash可添加。 P: ] `+ }8 Y1 T# j( p. C/ V7 [ 手头上刚好没有STM32F750的板子,所以使用STM32F746ZG的Nucleo板进行验证。从\STM32Cube_FW_F7_V1.14.0\Projects\STM32F746ZG-Nucleo\Examples\GPIO\GPIO_IOToggle\MDK-ARM打开Keil项目,打开项目配置,如下: ) {0 K$ {* o# @0 ]4 _ x# j" j0 N* R& v% [1 H+ H8 j6 e 可以看出,STM32F746是有提供STM32F7x1MB Flash的编程算法的,此算法的地址范围为0x08000000-0x080FFFFF,这个编程算法刚才在STM32F750是没有看到的。在默认的项目配置中IROM1配置的地址是0x08000000,不修改项目配置,直接进行编译下载,可以下载成功。 至此,修改一下编程算法试试,将STM32F7x 1MB Flash的编程算法移除,只留下STM32F7xx 1MB Flash (TCM)算法,如下: $ j! y! ?, e/ E* Y再进行编译下载,就遇到了客户所遇到的问题,错误如下: ( l' |" ^9 k$ O$ S所以,其实问题就是出现在项目的IROM配置与下载算法不匹配。根据项目的配置,其编译出来的代码地址是从0x08000000开始的,但是编程算法的地址范围并不是这个地址范围。先来看一下STM32F7的总线矩阵: # C/ ?. w2 ~7 h. t/ {6 p7 I内部Flash连接到Cortex-M7内核有两条通道,经过ART加速器从ITCM连接,或者从64位AHB总线经过AXI to multi-AHB桥再经过AXIM总线连接。再来看一下Flash Memory的描述: $ ~! B; h% ]6 G8 Z P) j可以看到,使用不同的接口,其块基地址是不同的。使用AXIM接口,地址从0x08000000开始;使用ITCM接口,地址从0x00200000开始。所以我们在项目配置中需要加以注意,如果不匹配就会导致编程问题。 3.问题解决 既然在Keil中STM32F750没有基于AXIM总线的编程算法可选,那么可以考虑将项目中的IROM地址修改为正确的地址。以STM32F746来进行验证,在刚才的下载失败中,对项目配置再做一次修改,将IROM1的起始地址从0x08000000修改为0x00200000,如下: 点击OK,然后再重新编译下载,就发现可以成功进行下载了。同理,STM32F750也可以通过这样的修改来进行下载及调试,只不过需要注意的是IROM的Size不一样,需要把Size的值修改为0x10000,因为只有64KB。 结论 在Keil中STM32F750无法进行烧写是因为客户的项目配置IROM起始地址为0x08000000,但是Keil没有提供基于AXIM接口的编程算法,只提供了基于ITCM的编程算法,导致不匹配而出错。 / [1 M4 A' V4 [ 处理 在项目配置中将IROM的起始地址修改为基于ITCM接口的地址0x00200000即可。 7 R. o# e) b1 l( S3 Q z b3 }& y, K% ^ |
基于STM32F746G-Discover的扩展电路板
【合集】STM32F7教程、资料大集合
F769 Discovery实现播放U盘音乐的播放器
STM32 VS Code Extension (在Ubuntu上开发STM32,ST官方vscode插件使用指南)
STM32F765@216MHz跑NES模拟器【代码】【视频】
基于STM32F7实现ADC软件触发+轮询采集
基于STM32F7进行ADC采集解决更新问题
基于STM32F7使用定时器经验分享
实现基于STM32F7中周期采集
基于STM32F7中实现采集和中断