STM32 - 内存映射模式下的 QSPI Flash 只读问题
Posted
技术标签:
【中文标题】STM32 - 内存映射模式下的 QSPI Flash 只读问题【英文标题】:STM32 - QSPI Flash Read Only Problem In Memory Mapped Mode 【发布时间】:2020-12-08 21:00:10 【问题描述】:在STM32F7
中,代码从内部闪存运行(默认),我们可以从内部闪存读取/写入数据。
我的问题是:我想使用外部QSPI
闪存来执行我的代码(内存映射模式)。
同样在这种模式下,当代码在QSPI
闪存中执行时,我想使用相同的QSPI
闪存来存储我的数据(即保存一些设置)。但这是不可能的,因为 ST 在其参考文档 (AN4760) 中声明:
In Memory-mapped mode the QUADSPI allows the access to the external
memory for read operation through the memory mapped address region
(from 0x9000 0000 to 0x9FFF FFFF) and allows the external memory to
be seen just like an internal memory.
在不退出内存映射模式的情况下,我的问题是否有任何解决方案(将数据写入QSPI
flash)?
是否可以将QSPI
闪存分成两部分?一个用于内存映射模式,另一个用于读取/写入数据。
注意:我不想从外部闪存跳转到内部闪存写入数据,然后再次跳转到外部闪存执行代码。
任何帮助将不胜感激。
谢谢。
【问题讨论】:
我曾经有同样的问题。据我所知,这是不可能的。但是,跳转到另一个内存(例如 RAM)以执行编程序列有什么问题?实现起来不是很复杂,效率很高。 @GuillaumePetitjean,你的意思是外部 SDRAM 吗? 不,内部 RAM。将一些函数定位在 RAM 中是一种常见的做法(例如加快计算速度或处理 Flash 编程问题)。 【参考方案1】:您可以通过写入 quadspi 寄存器来写入闪存。见https://github.com/micropython/micropython/blob/master/ports/stm32/qspi.c中的qspi_write_cmd_addr_data()
【讨论】:
【参考方案2】:不,这是不可能的。 FLASH内存,如果之前写过,要擦掉,就需要进入写模式,写内存。 FLASH 内存写入总是很慢。
内存映射模式通常用于从 QSPI 闪存运行代码,或简化读取访问。
【讨论】:
【参考方案3】:我知道这是一篇较旧的帖子,但供将来参考:
您需要停止执行外部闪存才能对其进行写入。也许通过将一个小代码块复制到 RAM 或从内部闪存执行。然后跳转到执行该代码。该代码可以从内存映射模式禁用外部闪存,将数据写入其中,然后将其切换回内存映射模式。显然,在此期间,您需要禁用任何相关中断并确保没有访问内存映射闪存。还要特别注意不要擦除和覆盖外部闪存中的代码,除非您当然愿意!
当您在写入时无法执行内部闪存时,这与写入内部闪存的过程类似。
【讨论】:
感谢您的回复。但是你的最后一句话让我觉得你指的是内部和外部的情况相似。虽然这里的情况完全不同。 我的意思是您可以使用类似的过程来更新您无法同时执行和写入的任何闪存。将您的闪存代码重新定位到另一个可执行内存块中,无论是 ram 还是闪存,然后在从该块执行时写入目标闪存。 我认为你有一个误解或疏忽了一点:当代码在一个块的内部闪存中运行时,比如说 A,你可以修改另一个内部闪存块,比如说 B。这不是外接闪光灯。我的意思是,当代码在外部闪存块中运行时,比如说 X,你不能修改另一个外部闪存块,比如说 Y,而不完全退出外部闪存的内存映射模式。 这种情况并不常见。只有一些微控制器允许在读取另一个闪存块时写入不同的闪存块。并且任何这样做通常会在写入时停止 CPU 闪存访问。双闪存库设备可以同时读取和写入。我的观点一直是,当您写入外部闪存时,您需要停止执行外部闪存。在写入外部闪存时从其他地方执行。以上是关于STM32 - 内存映射模式下的 QSPI Flash 只读问题的主要内容,如果未能解决你的问题,请参考以下文章