搜索
bottom↓
回复: 32

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

[复制链接]

出0入0汤圆

发表于 2019-1-28 09:15:23 | 显示全部楼层 |阅读模式
本帖最后由 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实现片上执行程序(其实是取指令)。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入442汤圆

发表于 2019-1-28 09:24:06 | 显示全部楼层
怎么说呢,用SPI跑OTF就要能够忍受死机问题。我以前在FPGA上跑OTF时也经常遇到不稳定的情况。你对照STM手册查一下QSPI最高支持速度吧。是STM的速度,不是SPI的速度。

SPI的输出时间一般不低,有好几个ns,看看你线是不是太长,是不是为了下载方便在板子很远处做了下载座。

出0入0汤圆

发表于 2019-1-28 09:35:46 | 显示全部楼层
官方的例子跑着有问题没

出0入0汤圆

 楼主| 发表于 2019-1-28 09:41:17 | 显示全部楼层
wye11083 发表于 2019-1-28 09:24
怎么说呢,用SPI跑OTF就要能够忍受死机问题。我以前在FPGA上跑OTF时也经常遇到不稳定的情况。你对照STM手册 ...


从这个型号上的数据手册来看,我所配置的频率是没有超出最大支持频率的。由于后来的测试只是采用内存映射,并没有跳转执行,在这种情况下,clock频率高了,MCU直接死机,这就很奇怪了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-1-28 10:45:50 来自手机 | 显示全部楼层
在f730上试过108M qspi xip正常,频率高了不行感觉是布线问题,可以贴个图,同时也要对着flash手册对比时序配置。

出0入0汤圆

发表于 2019-1-28 11:43:06 来自手机 | 显示全部楼层
我最近也在搞这个一直没成功,楼主能否提供代码让我学习一下,最好也包括下载算法,谢谢了

出0入0汤圆

 楼主| 发表于 2019-1-28 12:50:14 | 显示全部楼层
lyxer 发表于 2019-1-28 09:35
官方的例子跑着有问题没

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

出0入0汤圆

 楼主| 发表于 2019-1-28 12:50:38 | 显示全部楼层
eleqian 发表于 2019-1-28 10:45
在f730上试过108M qspi xip正常,频率高了不行感觉是布线问题,可以贴个图,同时也要对着flash手册对比时序 ...

问题已经解决,是CubeMX默认生成的QSPI配置存在问题。

出0入0汤圆

 楼主| 发表于 2019-1-28 12:51:35 | 显示全部楼层
aming2046 发表于 2019-1-28 11:43
我最近也在搞这个一直没成功,楼主能否提供代码让我学习一下,最好也包括下载算法,谢谢了 ...

我手上暂时处于评估阶段,直接跑CubeMX生成的工程。你用CubeMX生成QSPI的程序就好了。还有CubeMX安装目录下有STM32H743-EVK的例程,可以参考。

出0入0汤圆

发表于 2019-1-28 13:11:03 来自手机 | 显示全部楼层
哦,有下载算法吗

出0入0汤圆

发表于 2019-1-28 13:12:06 来自手机 | 显示全部楼层
我有个下载算法,下进去不能运行,不知道是算法问题,还是程序问题

出0入4汤圆

发表于 2019-1-28 15:27:18 | 显示全部楼层
能否贴出来差异,我们也学习下,平常得模板都是cubemx出得,这下就吓人了。

出0入0汤圆

 楼主| 发表于 2019-1-28 17:32:33 | 显示全部楼层
clesun 发表于 2019-1-28 15:27
能否贴出来差异,我们也学习下,平常得模板都是cubemx出得,这下就吓人了。 ...


区别在于这个函数HAL_QSPI_MspInit

CubeMX原始生成:
  1.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  2.   if(hqspi->Instance==QUADSPI)
  3.   {
  4.   /* USER CODE BEGIN QUADSPI_MspInit 0 */

  5.   /* USER CODE END QUADSPI_MspInit 0 */
  6.     /* Peripheral clock enable */
  7.     __HAL_RCC_QSPI_CLK_ENABLE();
  8.   
  9.     __HAL_RCC_GPIOB_CLK_ENABLE();
  10.     __HAL_RCC_GPIOE_CLK_ENABLE();
  11.     __HAL_RCC_GPIOC_CLK_ENABLE();
  12.     /**QUADSPI GPIO Configuration   
  13.     PB2     ------> QUADSPI_CLK
  14.     PE7     ------> QUADSPI_BK2_IO0
  15.     PE8     ------> QUADSPI_BK2_IO1
  16.     PE9     ------> QUADSPI_BK2_IO2
  17.     PE10     ------> QUADSPI_BK2_IO3
  18.     PC11     ------> QUADSPI_BK2_NCS
  19.     */
  20.     GPIO_InitStruct.Pin = GPIO_PIN_2;
  21.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  22.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  23.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  24.     GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
  25.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  26.     GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  27.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  28.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  29.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  30.     GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI;
  31.     HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  32.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  33.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  34.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  35.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  36.     GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
  37.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  38.   /* USER CODE BEGIN QUADSPI_MspInit 1 */

  39.   /* USER CODE END QUADSPI_MspInit 1 */
  40.   }
复制代码


修改后的:
  1.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  2.   if(hqspi->Instance==QUADSPI)
  3.   {
  4.     /*##-1- Enable peripherals and GPIO Clocks #################################*/
  5.     /* Enable the QuadSPI memory interface clock */
  6.     __HAL_RCC_QSPI_CLK_ENABLE();
  7.     /* Reset the QuadSPI memory interface */
  8.     __HAL_RCC_QSPI_FORCE_RESET();
  9.     __HAL_RCC_QSPI_RELEASE_RESET();   
  10.     /* Enable GPIO clocks */
  11.     __HAL_RCC_QSPI_CLK_ENABLE();
  12.     __HAL_RCC_GPIOB_CLK_ENABLE();
  13.     __HAL_RCC_GPIOC_CLK_ENABLE();
  14.     __HAL_RCC_GPIOE_CLK_ENABLE();
  15.     __HAL_RCC_GPIOF_CLK_ENABLE();
  16.     /* Enable DMA clock */
  17.     __HAL_RCC_MDMA_CLK_ENABLE();  
  18.    
  19.     /*##-2- Configure peripheral GPIO ##########################################*/
  20.     /**QUADSPI GPIO Configuration   
  21.     PB2     ------> QUADSPI_CLK
  22.     PE7     ------> QUADSPI_BK2_IO0
  23.     PE8     ------> QUADSPI_BK2_IO1
  24.     PE9     ------> QUADSPI_BK2_IO2
  25.     PE10     ------> QUADSPI_BK2_IO3
  26.     PC11     ------> QUADSPI_BK2_NCS
  27.     */
  28.     GPIO_InitStruct.Pin = GPIO_PIN_2;
  29.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  30.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  31.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  32.     GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
  33.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  34.     GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10;
  35.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  36.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  37.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  38.     GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI;
  39.     HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  40.     GPIO_InitStruct.Pin = GPIO_PIN_11;
  41.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  42.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  43.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  44.     GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI;
  45.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  46.   /* USER CODE BEGIN QUADSPI_MspInit 1 */

  47.   /* USER CODE END QUADSPI_MspInit 1 */
  48.   }
复制代码

出110入0汤圆

发表于 2019-1-28 23:25:51 | 显示全部楼层
wzd5230 发表于 2019-1-28 17:32
区别在于这个函数HAL_QSPI_MspInit

CubeMX原始生成:

问题原来是出在 GPIO_SPEED_FREQ_VERY_HIGH 这里。

以前我也吃过cubemx这个io速度的亏,配置SDRAM和RGB接口需要兼顾速度和过冲,可能需要手动选择HIGH或者MEDIUM,对EMC测试来说,VERY-HIGH可能比较麻烦。

出0入0汤圆

 楼主| 发表于 2019-1-29 08:30:36 | 显示全部楼层
Flyback 发表于 2019-1-28 23:25
问题原来是出在 GPIO_SPEED_FREQ_VERY_HIGH 这里。

以前我也吃过cubemx这个io速度的亏,配置SDRAM和RGB ...

不只是这个,那个MDMA时钟也要开,另外用的QSPI-BANK2,没有用到GPIOF组,但是时钟也要打开,我都有对比过每一句的作用。

出0入0汤圆

发表于 2019-1-29 15:40:08 | 显示全部楼层
wzd5230 发表于 2019-1-29 08:30
不只是这个,那个MDMA时钟也要开,另外用的QSPI-BANK2,没有用到GPIOF组,但是时钟也要打开,我都有对比 ...

我也准备马上使用STM32H750V。
可以使用QSPI BANK2作为 XIP吗?
因为 BANK1实在太变态了引脚分布。 BANK2的分布才能做到等长的布线。
谢谢!

出0入0汤圆

 楼主| 发表于 2019-1-29 15:47:30 来自手机 | 显示全部楼层
gpfrank 发表于 2019-1-29 15:40
我也准备马上使用STM32H750V。
可以使用QSPI BANK2作为 XIP吗?
因为 BANK1实在太变态了引脚分布。 BANK2 ...

我们用的也是bank2,目前测试可用,时钟100MHz,4线模式,外部flash最高支持133MHz。

出0入0汤圆

发表于 2019-1-29 15:55:19 | 显示全部楼层
wzd5230 发表于 2019-1-29 15:47
我们用的也是bank2,目前测试可用,时钟100MHz,4线模式,外部flash最高支持133MHz。 ...

非常感谢!这样就可以布线了。不然BANK1,我觉得根本没办法布线。100Mhz的阻抗特性。
根本没办法保证。

再次感谢您的回复!谢谢!

出0入0汤圆

发表于 2019-5-7 16:26:02 | 显示全部楼层
求助大神,有Flash的算法(烧写在外部QSPI接口的Flash)分享吗?

出0入0汤圆

发表于 2019-5-7 17:06:50 | 显示全部楼层
QSPI STM32 MARK

出0入0汤圆

 楼主| 发表于 2019-5-8 22:33:28 | 显示全部楼层
wofei3344 发表于 2019-5-7 16:26
求助大神,有Flash的算法(烧写在外部QSPI接口的Flash)分享吗?

直接内部flash烧写BootLoader,可以通过串口或者其他接口,更新外部Flash中的固件。这仅仅适用于烧写。如果需要连上仿真器调试,是行不通的。

出0入0汤圆

发表于 2019-6-28 12:02:17 | 显示全部楼层
我用STM32L4R9-DISCO的板子,没发现代码有什么特别的地方,为什么代码里面包含的几MB的图片数据能烧录的QSPI的FLASH里面去,程序也能直接访问?

出100入113汤圆

发表于 2020-1-15 14:41:06 | 显示全部楼层
gpfrank 发表于 2019-1-29 15:55
非常感谢!这样就可以布线了。不然BANK1,我觉得根本没办法布线。100Mhz的阻抗特性。
根本没办法保证。

确定 BK2 能够单独跑?不是 BK1 + BK2 构成双通道?

我现在正在写驱动,目前设置被硬件工程师设置到 BK2 了,正在阅读资料想解决办法。

出100入113汤圆

发表于 2020-1-15 14:41:43 | 显示全部楼层
wzd5230 发表于 2019-1-29 15:47
我们用的也是bank2,目前测试可用,时钟100MHz,4线模式,外部flash最高支持133MHz。 ...

确定 BK2 能够单独跑?不是 BK1 + BK2 构成双通道?

我现在正在写驱动,目前设置被硬件工程师设置到 BK2 了,正在阅读资料想解决办法。

出0入0汤圆

 楼主| 发表于 2020-2-3 00:18:55 | 显示全部楼层
saccapanna 发表于 2020-1-15 14:41
确定 BK2 能够单独跑?不是 BK1 + BK2 构成双通道?

我现在正在写驱动,目前设置被硬件工程师设置到 BK2 ...

可以,完全没问题。

出100入113汤圆

发表于 2020-2-3 07:56:48 | 显示全部楼层
wzd5230 发表于 2020-2-3 00:18
可以,完全没问题。

是的,谢谢。

ST的文档上没写清楚,只有在寄存器配置一段,有个BK的选择,不看到这里真不敢确定,目前已经调通读写,正在准备搞DMA……

出0入0汤圆

发表于 2020-2-23 03:08:20 | 显示全部楼层
cubemx 的bug真是淡疼

出0入53汤圆

发表于 2020-2-23 07:23:19 来自手机 | 显示全部楼层
lz使用的官网板子还是自己画的

出0入0汤圆

 楼主| 发表于 2020-2-23 09:12:02 来自手机 | 显示全部楼层
zhcj66 发表于 2020-2-23 07:23
lz使用的官网板子还是自己画的

公司硬件设计部门画的。

出0入53汤圆

发表于 2020-2-23 17:13:10 | 显示全部楼层
wzd5230 发表于 2020-2-23 09:12
公司硬件设计部门画的。

从F1 F2 F3 F4都看了,最后还是在用F1  H750做视频处理?

出0入0汤圆

发表于 2020-2-23 18:10:23 来自手机 | 显示全部楼层
恭喜楼主解决了问题

出0入0汤圆

发表于 2020-7-11 20:22:37 | 显示全部楼层
新版的cubeMX已经解决

出0入0汤圆

发表于 2021-10-18 12:45:43 来自手机 | 显示全部楼层
请问h750在qspi运行执行速度怎么样?能达到在内部flash运行的80%吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 15:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表