STM32的DMA到Flash

5

我正在使用stm32f40x微控制器(UC),并且必须使用其内部闪存来存储一些数据。如您所知,写操作非常缓慢,需要很长时间占用UC。因此,我考虑使用DMA,这里有一个问题:

是否可以使用DMA将数据从SRAM传输到FLASH?

谢谢您的时间。


2
一些专用的微控制器具有RAM区域,它是闪存的映像。您的程序将数据写入RAM,然后硬件负责将其烧录到闪存中,可能与ECC结合使用。对于这样的部件,您应该能够DMA数据。我不确定ST是否有类似的东西。您应该只寻找带有数据闪存(“模拟EEPROM”)的部件-这种闪存具有较小的段,不需要在编程之前花费很长时间进行擦除。我知道有几个STM32带有数据闪存。 - Lundin
2个回答

10
简而言之:不行,至少不能提高速度。
具体来说,写入flash的缓慢不是由于CPU太慢造成的,而是由于耗时的页面写入周期导致的。(因此,DMA并没有更快)。理论上,你可以使用DMA写入flash(即使这有点棘手且存在一些陷阱),但你不会获得任何速度。原因是,当CPU尝试访问被写入时的flash存储器时,它将被暂停。因此,在DMA写入时,CPU将无法从其中执行代码——不会省时间。
说明书上写着:
“在STM32F4xx正在被写入或擦除时,任何对Flash存储器的读取尝试都会导致总线停顿。一旦程序操作完成,读取操作就会被正确处理。这意味着在写入/擦除操作正在进行时,无法执行代码或数据获取。”
这意味着在DMA运行到任何flash区域时,无法从任何flash的区域执行代码——CPU将在此期间暂停。然而,你可以进一步增加复杂性,将代码的部分复制到RAM中以在那里执行,以解决这个问题。
F4系列中的一些型号有4k的可备份RAM。使用它,它要简单得多,并且速度更快。

1
谢谢!我没有考虑到你强调的这个方面!但是我还有一个问题要问你:如果代码存储在与数据存储不同的闪存扇区中,这是否也适用?谢谢。 - gior91
我手头的手册说:“在 STM32F4xx 写入或擦除 Flash 存储器时,任何尝试读取其内容的操作都会导致总线停顿。只有当编程操作完成后,才能正确地处理读取操作。这意味着在写入/擦除操作正在进行时无法执行代码或数据提取。”我认为这回答了这个问题,向 Flash 的任何部分写入都会停止 CPU 的运行。你可能可以通过将要在 DMA 传输期间执行的代码的一部分复制到 RAM 中来解决此问题,但这会带来更多问题,最好还是不要这样做。 - tofro
3
虽然DMA在这种情况下无法提供帮助,但是后续评论中提到的CPU无法执行代码并不完全正确。实际上,它无法执行写入Flash存储器中的代码 - 对于STM32而言,通常都是如此。例如,如果在Flash写入期间中断服务很重要,可以将ISR放置在RAM中(如有可能,CCM是一个好选择)。 - Clifford

7

另一个可能性是使用具有读写并行功能的双重存储器设备。

这些设备拥有两个闪存存储区。可以在从一个存储区执行代码的同时,将数据写入第二个存储区。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接