硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3251|回复: 24
收起左侧

[SPI/QSPI] STM32H723 QSPI扩RAM离奇问题分享

  [复制链接]

7

主题

351

回帖

372

积分

高级会员

积分
372
发表于 2025-1-8 15:15:17 | 显示全部楼层 |阅读模式
我一个项目用了STM32H723,用了1年多,挺好

当时板子设计时预留了【ESP-PSRAM64H】这个芯片,主要是非常便宜,2块多一片
当时一直没把这个搞转,手工读/写是正常的,就是内存映射一直不正常,只有映射读,写一直不成功,后来就放在哪儿了
一直报这个错误
企业微信截图_20250108143024.png

最近项目在优化,要采集16位AD约10秒钟,又把这个RAM用上去提上日程
想着这个芯片出来好几年了,资料应该多一些了。
然后一直在网上找资料,能搜到的都是STM32H743的内存映射资料,STM32H723只有在硬汉论坛唯一的一篇
在这里【[SPI/QSPI] 贡献一个H723外扩串行RAM的例子】https://forum.anfulai.cn/forum.php?mod=viewthread&tid=120719
初步对比了一下,基本没区别,唯一的是它开了MPU,我没开,
然后我将我的MPU开启后再测试,错误依旧
来回折腾依旧不行
我不服气,网友不会骗我吧,
再将它的内存映射代码复制到我的项目中,
就这块
[C] 纯文本查看 复制代码
    OSPI_RegularCmdTypeDef sCommand;
    OSPI_MemoryMappedTypeDef sMemMappedCfg;
    sCommand.FlashId = HAL_OSPI_FLASH_ID_1;
    sCommand.InstructionMode = HAL_OSPI_INSTRUCTION_4_LINES;
    sCommand.InstructionSize = HAL_OSPI_INSTRUCTION_8_BITS;
    sCommand.InstructionDtrMode = HAL_OSPI_INSTRUCTION_DTR_DISABLE;
    sCommand.AddressMode = HAL_OSPI_ADDRESS_4_LINES;
    sCommand.AddressSize = HAL_OSPI_ADDRESS_24_BITS;
    sCommand.AddressDtrMode = HAL_OSPI_ADDRESS_DTR_DISABLE;
    sCommand.AlternateBytesMode = HAL_OSPI_ALTERNATE_BYTES_NONE;
    sCommand.DataMode = HAL_OSPI_DATA_4_LINES;
    sCommand.DataDtrMode = HAL_OSPI_DATA_DTR_DISABLE;
    sCommand.SIOOMode = HAL_OSPI_SIOO_INST_EVERY_CMD;
    sCommand.Address = 0;
    sCommand.NbData = 1;
    /* Memory-mapped mode configuration for Quad Read mode 4-4-4*/
    sCommand.OperationType = HAL_OSPI_OPTYPE_READ_CFG;
    sCommand.Instruction = FAST_READ_QUAD;
    sCommand.DummyCycles = FAST_READ_QUAD_DUMMY_CYCLES;
    if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
            != HAL_OK) {
        Error_Handler();
    }
    /* Memory-mapped mode configuration for Quad Write mode 4-4-4*/
    sCommand.OperationType = HAL_OSPI_OPTYPE_WRITE_CFG;
    sCommand.Instruction = QUAD_WRITE;
    sCommand.DummyCycles = WRITE_QUAD_DUMMY_CYCLES;
    sCommand.DQSMode = HAL_OSPI_DQS_ENABLE;
    if (HAL_OSPI_Command(&PS_OSPI, &sCommand, HAL_OSPI_TIMEOUT_DEFAULT_VALUE)
            != HAL_OK) {
        Error_Handler();
    }
    /*Disable timeout counter for memory mapped mode*/
    sMemMappedCfg.TimeOutActivation = HAL_OSPI_TIMEOUT_COUNTER_DISABLE;
    /*Enable memory mapped mode*/
    if (HAL_OSPI_MemoryMapped(&PS_OSPI, &sMemMappedCfg) != HAL_OK) {
        Error_Handler();
    }


然后,就是TMD奇迹生效了,好了,内存映射能写入了
我再一点点对比,还是没有区别
我再把代码还原,对比,找出了唯一一个区别,就是这个
sCommand.DQSMode = HAL_OSPI_DQS_ENABLE;
我的没启用,它的启用了,我百思不得其解,这个DQS是用于HyperBus里的一个信号,普通4线制的用不上啊
4705243fdaeec1bced3002b13666bb06.png
我再反复测试了好几次,发现只要打勾了就正常,不打勾就不正常。
企业微信截图_20250108151324.png
好了,我也不纠结这个问题了,反正好了就行,网友如果有此问题不防试试这个选项。
折腾了一年多的问题,其间隔三差五的我就要试试这个内存映射,今天终于好了。


谢谢 【regsofweb】网友。

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-1-8 15:17:29 | 显示全部楼层
最新,MPU不用开,缓存也不用开,只需配置好后,这个DQSE要开启就好了。
回复

使用道具 举报

1

主题

118

回帖

121

积分

初级会员

积分
121
发表于 2025-1-8 16:23:37 | 显示全部楼层
谢谢楼主的分享,过几天也要用这个芯片
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 2025-1-9 06:43:51 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-1-10 17:17:39 | 显示全部楼层
ST论坛说了,H723不支持QSPI PSRAM。
你这个解法有概率还是会出问题的。
下面是我整理的结果:
according to link below, OSPI SDR PSRAM write doen't work, but not test:
https://community.st.com/t5/stm3 ... ped-mode/m-p/229476

We have studied this case and concluded it's not possible to get full functionnality of STM32H7A (also H72x/3x) with QSPI SDR. But it works well with QSPI DDR (7pins, 128Mb in WLCSP) and OPI (11pins, 64Mb~512Mb BGA24/WLCSP). Other STM32 works well also with all device, including QSPI SDR (6 pins, 16Mb~128Mb, SOP8/USON/WLCSP).

but after enable cache and MPU, this may be fixed:
https://community.st.com/t5/stm3 ... ped-mode/m-p/596127
https://community.st.com/t5/stm3 ... 04l-3sqr/m-p/596182
https://community.st.com/t5/stm3 ... qspi-ram/m-p/710009
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2025-1-10 17:19:31 | 显示全部楼层
ST论坛有讨论过这个问题,H723是不支持QSPI PSRAM的
你这个能解决一部分,但是不能保证一定不出问题,下面是我整理的结果:
according to link below, OSPI SDR PSRAM write doen't work, but not test:
https://community.st.com/t5/stm3 ... ped-mode/m-p/229476

We have studied this case and concluded it's not possible to get full functionnality of STM32H7A (also H72x/3x) with QSPI SDR. But it works well with QSPI DDR (7pins, 128Mb in WLCSP) and OPI (11pins, 64Mb~512Mb BGA24/WLCSP). Other STM32 works well also with all device, including QSPI SDR (6 pins, 16Mb~128Mb, SOP8/USON/WLCSP).

but after enable cache and MPU, this may be fixed:
https://community.st.com/t5/stm3 ... ped-mode/m-p/596127
https://community.st.com/t5/stm3 ... 04l-3sqr/m-p/596182
https://community.st.com/t5/stm3 ... qspi-ram/m-p/710009
回复

使用道具 举报

8

主题

28

回帖

57

积分

初级会员

积分
57
发表于 2025-1-13 10:41:09 | 显示全部楼层
当时这个DQSE也卡了我好久,再加上MPU的配置,基本上是试出来的。ST的bug实在是太多。最近升级到1.17.1,freertos配置被莫名修改,又退回1.15.1.
回复

使用道具 举报

16

主题

73

回帖

121

积分

初级会员

积分
121
发表于 2025-3-26 14:31:10 | 显示全部楼层
h750支持吗?
回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-3-26 17:02:10 | 显示全部楼层
zjq985062714 发表于 2025-1-10 17:17
ST论坛说了,H723不支持QSPI PSRAM。
你这个解法有概率还是会出问题的。
下面是我整理的结果:

谢谢,文中也讲了,是一个BUG

As the PSRAM I'm using does not support DQS signaling I'm applying the hard-fault mitigation technique outlined the errata sheet (Rev. 7, March 2022, 2.7.6 Memory-mapped write error response when DQS output is disabled), i.e. the DQSE bit is set for writes, despite DQS not being physically connected and not being mapped via the GPIO matrix to a pin.
回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-3-26 17:02:47 | 显示全部楼层
regsofweb 发表于 2025-1-13 10:41
当时这个DQSE也卡了我好久,再加上MPU的配置,基本上是试出来的。ST的bug实在是太多。最近升级到1.17.1,fr ...

是啥,这个折腾了半年,差点放弃了。
回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-3-26 17:04:07 | 显示全部楼层

h750比h723早出来,它的IP核好像旧&差一个挡次。
也支持的。
回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-3-26 19:26:07 | 显示全部楼层
企业微信截图_20250326191255.png
刚特意到官网找了一下纠错文档,看了一下QSPI的文档,好多BUG啊,
回复

使用道具 举报

4

主题

79

回帖

91

积分

初级会员

积分
91
发表于 2025-3-26 20:39:31 | 显示全部楼层
这个读写速度可以达到多少?
回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-3-27 08:44:17 | 显示全部楼层
跟着硬汉学 发表于 2025-3-26 20:39
这个读写速度可以达到多少?

群里有其它人做的读取速度比较快,我用的是4线的,PCB布线布的不好,时钟20M以上波形示波器看起来就特别差,有点振荡。
回复

使用道具 举报

11

主题

62

回帖

95

积分

初级会员

积分
95
发表于 2025-3-28 08:43:00 | 显示全部楼层
fxyc87 发表于 2025-3-27 08:44
群里有其它人做的读取速度比较快,我用的是4线的,PCB布线布的不好,时钟20M以上波形示波器看起来就特别 ...

也可以试试 我之前那个 HyperRAM 8线的
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2025-5-11 16:25:27 | 显示全部楼层
如果开启Cache,需要在MPU配置中将PSRAM的内存空间设置为Devices或者Strongly ordered类型.
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-11-9 11:45:26 | 显示全部楼层
想问下有没有试过H723 OSPI接W25Q128的norflash memory mapped使用? 我遇到了比较频繁进hardfault, 出现的概率跟板子还有点关联, 有些板子频繁一点
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-11-9 11:46:23 | 显示全部楼层
想问下有没有试过H723 OSPI接W25Q128的norflash memory mapped使用? 我遇到了比较频繁进hardfault, 出现的概率还跟板子有关系, 一样的硬件, 有些板子出现概率会高一点
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 2025-11-10 15:08:31 | 显示全部楼层
fjr115 发表于 2025-11-9 11:46
想问下有没有试过H723 OSPI接W25Q128的norflash memory mapped使用? 我遇到了比较频繁进hardfault, 出现的 ...

W25Q128支持标准SPI和QSPI,你那边是不是将OSPI作为4线方式的QSPI驱动了
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-11-10 19:16:36 | 显示全部楼层
eric2013 发表于 2025-11-10 15:08
W25Q128支持标准SPI和QSPI,你那边是不是将OSPI作为4线方式的QSPI驱动了

是用4线的, 用间接模式读写没问题, memory mapped之后, 写个死循环用uint32指针循环读取, 就很容易hardfault, 按理读取是跟线路和干扰都没关系的(顶多数据不对), 目前发现一点规律.
1. OCTOSPI时钟分频, 频率越低, 出现概率越低.
2. 用OCTOSPI1或OCTOSPI2, 都用Port2的CS CLK IO[0:3]跑半小时都正常.
3. 用OCTOSPI1或OCTOSPI2, 用Port1的CS CLK IO[0:3]跑不到一分钟就会hardfault.
4. 用OCTOSPI1或OCTOSPI2, 用Port1的CS IO[0:3], Port2的CLK, 能跑几分钟才hardfault.
这就很玄学, 上面条件下, Cache MPU设置都是一样的, 关Cache 关MPU也没啥区别
感觉是AXI Matrix哪里有问题, 每次Hardfault SCB->BFAR都有差异的, 感觉都是乱的.

尝试过换位psram, 同样memory mapped, 在Port2上读写都没问题, 哪怕把psram芯片拆了跑也不会hardfault, 但是接到Port1上就不行, 控制Port1/2的就只有OSPI Manager, 对过寄存器是对的(HAL OSPIM的bug我改了), 就很奇怪
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
119430
QQ
发表于 2025-11-11 11:25:31 | 显示全部楼层
fjr115 发表于 2025-11-10 19:16
是用4线的, 用间接模式读写没问题, memory mapped之后, 写个死循环用uint32指针循环读取, 就很容易hardfa ...

内存映射模式,你看下OCTOSPI的配置选项里面有没有个dummy参数,可以加大下试试。

还要就是GPIO速度等级可以适当调解试试。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2025-11-11 16:08:30 | 显示全部楼层
eric2013 发表于 2025-11-11 11:25
内存映射模式,你看下OCTOSPI的配置选项里面有没有个dummy参数,可以加大下试试。

还要就是GPIO速度等 ...

算是不明原因地解决了,用下图550MHz的时钟, 就出现我上述的问题
550.jpg
如下图, 把三个PLL改为一致, 设为480MHz, 就很稳定, OCTOSPI跑120MHz都没问题, 两路映射都很稳定,
480.jpg

我怀疑PLL之间频率不一致, 还是啥, 导致总线访问有问题, 卡bug了, 具体的我再测试看看.
回复

使用道具 举报

7

主题

351

回帖

372

积分

高级会员

积分
372
 楼主| 发表于 2025-11-12 08:39:05 | 显示全部楼层
fjr115 发表于 2025-11-11 16:08
算是不明原因地解决了,用下图550MHz的时钟, 就出现我上述的问题

如下图, 把三个PLL改为一致, 设为480M ...

逻辑分析仪或示波器看下波形。
回复

使用道具 举报

5

主题

231

回帖

251

积分

高级会员

积分
251
发表于 2025-11-12 08:47:20 | 显示全部楼层
fjr115 发表于 2025-11-11 16:08
算是不明原因地解决了,用下图550MHz的时钟, 就出现我上述的问题

如下图, 把三个PLL改为一致, 设为480M ...

w25q128jv SPI时钟不是最大133MHz么,160MHz可以的吗?
回复

使用道具 举报

1

主题

10

回帖

18

积分

新手上路

积分
18
发表于 4 天前 | 显示全部楼层
chatGTP关于DQS的回答
1.png 3.png

我有点不太明白的是:

Normal[Type]  Write-through cache[attribute] --> 写操作同时更新 Cache 和内存
OCTOSPI1 0x90000000 - 0x9FFFFFFF
OCTOSPI2 0x70000000 - 0x7FFFFFFF


默认OSPI的cache策略是WT,根据帖子 https://forum.anfulai.cn/forum.php?mod=viewthread&tid=120719 的写法,它改成了 Device模式【TEX=0,C=0,B=1,S=0】这意思是:这8MB区域,不启用cache?这样设置是否无法发挥最大性能?
2.png

最后,给出AI对内存映射的理解(个人理解就和外扩sdram一样的,只不过sdram更快,但是对mcu的封装有要求)
4.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-11-22 04:36 , Processed in 0.072829 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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