硬汉嵌入式论坛

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

[SPI/QSPI] 写外部Flash的问题

[复制链接]

4

主题

18

回帖

30

积分

新手上路

积分
30
发表于 2024-5-27 12:42:55 | 显示全部楼层 |阅读模式
我的项目使用STM32H750+QSPI Flash方案,执行内存重映射后,代码可以在外部Flash运行,固件占用的地址空间为:0x90000000-0x90080000。


出现一个问题:app运行时,需要向外部Flash中写一些数据,地址为0x90090000,该怎么做?
回复

使用道具 举报

22

主题

320

回帖

386

积分

高级会员

积分
386
发表于 2024-5-27 14:18:32 | 显示全部楼层
道理很简单,你可以想象你站在地板上,现在你想擦写你脚下站的这块地板,你就要先站到别的地板上才能操作你现在脚下这款地板。
你的代码在QSPIflash里XIP,你要操作QSPIFlash,你就要让操作的代码不位于QSPIFlash里面。
可以通过分散加载将关于操作QSPIFlash相关的所有代码放到别的地方,比如内部Flash或者SRAM里面。留心一定要处理干净,隔离出所有与你操作QSPIFlash的代码出来。
回复

使用道具 举报

354

主题

2162

回帖

3229

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3229
发表于 2024-5-27 14:21:18 | 显示全部楼层
这种情况下,最好在另一个spi接口上挂另一个flash。或者在I2C上挂一个eeprom。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-5-28 07:43:05 | 显示全部楼层
QSPI Flash在内存映射模式下是不支持写操作的。

只能让你的程序代码先跳转到其他地址空间执行QSPI Flash擦写,然后跳转回来。
回复

使用道具 举报

4

主题

18

回帖

30

积分

新手上路

积分
30
 楼主| 发表于 2024-5-28 08:18:22 | 显示全部楼层
tovinz 发表于 2024-5-27 14:18
道理很简单,你可以想象你站在地板上,现在你想擦写你脚下站的这块地板,你就要先站到别的地板上才能操作你 ...

解释得很形象,谢谢指点!
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-5-30 11:21:21 | 显示全部楼层
所以只需要将某些函数放入内存就可以了吗,具体是哪些呢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-5-31 08:43:33 | 显示全部楼层
宝宝a 发表于 2024-5-30 11:21
所以只需要将某些函数放入内存就可以了吗,具体是哪些呢

外部Flash相关的都要迁到内存里面执行。觉得这个不方便的话,可以弄个APP跳转到RAM执行

制作了一个通过BOOT复制APP程序到AXI SRAM运行的案例,适合H750,H7B0玩
https://www.armbbs.cn/forum.php? ... 2748&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

1

主题

25

回帖

28

积分

新手上路

积分
28
发表于 2024-5-31 16:47:06 | 显示全部楼层
顺遍问个问题,就是开机QSPI已经映射为内部映射模式了,因为可以需要读取一些数据作为参数。这时候如果使用的单片机是H743,代码放在内部FALSH里面。这时候想写入QSPI数据的话,是不是需要退出内存映射模式,进入寄存器访问模式啊,在不断电重启的情况下,如何在内存映射模式和寄存器访问模式2者之间随意切换呢?有使用过的大佬,给点建议把。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-1 08:24:13 | 显示全部楼层
shnd 发表于 2024-5-31 16:47
顺遍问个问题,就是开机QSPI已经映射为内部映射模式了,因为可以需要读取一些数据作为参数。这时候如果使用 ...

动态配置QSPI的内存映射和非内存映射摸索即可
回复

使用道具 举报

1

主题

25

回帖

28

积分

新手上路

积分
28
发表于 2024-6-1 10:54:53 | 显示全部楼层
我试过了,如果开机配置为寄存器模式,是可以再配置为内存映射模式的,但是不能再改回去寄存器映射模式。必须断电重新启动才可以重新配置为寄存器访问模式。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-6-2 01:14:33 | 显示全部楼层
shnd 发表于 2024-6-1 10:54
我试过了,如果开机配置为寄存器模式,是可以再配置为内存映射模式的,但是不能再改回去寄存器映射模式。必 ...

必须且一定可以,应该是你的配置切换有问题,因为我们有个产品就是这么用的。
回复

使用道具 举报

1

主题

25

回帖

28

积分

新手上路

积分
28
发表于 2024-6-18 09:12:10 | 显示全部楼层
好的,我试了好几次都不能成功,不知道具体是哪里没有配置好,您那个成功的例子有代码可以分享一下吗?
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
发表于 2024-8-21 23:48:12 | 显示全部楼层
caicaptain2 发表于 2024-5-27 14:21
这种情况下,最好在另一个spi接口上挂另一个flash。或者在I2C上挂一个eeprom。

请问下,挂另一个spi flash的话,spi的下载算法需要注意什么吗?我的一直下载不进去
回复

使用道具 举报

6

主题

234

回帖

252

积分

高级会员

积分
252
发表于 2024-8-22 08:38:16 | 显示全部楼层
将需要写入的代码在RAM中运行,
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:36 , Processed in 0.287504 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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