STM32H750使用QSPI-Flash实现片上程序执行出错【已解决】

2020-01-04 19:03发布

本帖最后由 wzd5230 于 2019-1-28 13:23 编辑

        项目中使用的MCU是STM32H750,core最高频率400MHz,内部flash只有128KB,是无法满足目前我们的应用的,遂考虑外部扩展存储,并且片上执行(因为内部RAM也只有1MB),扩展的方案有2个,其一,通过QSPI外扩串行Flash,该MCU支持QSPI外接存储设备的XIP功能;其二,通过FSMC接口,外接并行的norFlash,这种方式耗费MCU的引脚比较多。因此采用QSPI外接Flash的方式。
        目前在测试阶段,在MCU内部Flash中,包含了一个类似于Boot的程序,该程序初始化QSPI工作在内存映射模式,以及进行程序跳转。MCU的QSPI最高频率支持200MHz。外部Flash最高clock支持133MHz,已经包含了一个有效、可用的程序,该程序对某一IO口进行翻转。
        【遇到的问题】:
        1、QSPI的clock如果设置的比较高(>=50MHz),MCU就会进入hardfault_handler(),这可以理解,因为从Flash中读取的数据就是“指令”,指令不正确,肯定会出问题。如果QSPI的clock设置的比较低,如33MHz,那么是可以正常跳转,并且外部flash中的程序也执行了,IO正常翻转。
        2、【测试1】,仅配置QSPI工作在内存映射模式,并不进行跳转,这样可以直接使用指针去读取数据,并且可以在IAR的memory窗口直接看到flash所映射地址的数据。测试结果是QSPI低速时通过JLink可以查看到数据,使用指针也可以正常访问到数据。如果QSPI设置clock高了,直接MCU进入异常状态。
        3、【测试2】,将上述的【测试1】在一个STM32H743的评估板上验证(该板卡没有外接flash),即使QSPI的频率设置到100MHz,MCU也没有死,由于外部没有数据,映射的数据全为0xFF(我将SIO0..3直接接到VCC)。
        4、不使用QSPI的内存映射模式,而是使用最简单的间接模式,对Flash中的数据进行读取,测试发现,当QSPI的clock速度提高了,mcu也还是死机。
        5、还有很多其他的对比测试,我就不具体列出了。
        【咨询的问题】
        1、是否有使用过STMH750这一系列MCU的童鞋,我怀疑这个芯片的QSPI速度有限制,和STM32H743是不同的,当QSPI速度提升了,整个MCU进入异常。
        2、是否有哪位使用STMH750这个MCU,外部通过QSPI扩展Flash实现片上执行程序(其实是取指令)。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
wye11083
1楼-- · 2020-01-04 19:19
怎么说呢,用SPI跑OTF就要能够忍受死机问题。我以前在FPGA上跑OTF时也经常遇到不稳定的情况。你对照STM手册查一下QSPI最高支持速度吧。是STM的速度,不是SPI的速度。

SPI的输出时间一般不低,有好几个ns,看看你线是不是太长,是不是为了下载方便在板子很远处做了下载座。
lyxer
2楼-- · 2020-01-04 23:55
官方的例子跑着有问题没
wzd5230
3楼-- · 2020-01-05 03:37
wye11083 发表于 2019-1-28 09:24
怎么说呢,用SPI跑OTF就要能够忍受死机问题。我以前在FPGA上跑OTF时也经常遇到不稳定的情况。你对照STM手册 ...

TIM截图20190128093926.jpg (126.47 KB, 下载次数: 0)

下载附件

2019-1-28 09:39 上传


从这个型号上的数据手册来看,我所配置的频率是没有超出最大支持频率的。由于后来的测试只是采用内存映射,并没有跳转执行,在这种情况下,clock频率高了,MCU直接死机,这就很奇怪了。
eleqian
4楼-- · 2020-01-05 06:06
 精彩回答 2  元偷偷看……
aming2046
5楼-- · 2020-01-05 07:12
我最近也在搞这个一直没成功,楼主能否提供代码让我学习一下,最好也包括下载算法,谢谢了
wzd5230
6楼-- · 2020-01-05 09:22
lyxer 发表于 2019-1-28 09:35
官方的例子跑着有问题没

感谢你的一句言语,我换了个思路,不使用CubeMX生成的工程,使用STM32H743的demo修改后跑了下,竟然可以了,对比发现是CubeMX默认生成的QSPI初始化函数不够完善,目前问题已经解决。

一周热门 更多>