STM32 的 DMA 到闪存

gio*_*r91 4 c embedded flash-memory dma stm32f4

我使用的是 stm32f40x 微控制器 (UC),我必须使用其内部闪存来存储一些数据。写操作,如你所知,非常慢,占用UC很长时间。所以我想到了 DMA,这里是问题:

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

感谢您的时间。

tof*_*fro 8

简而言之:不。至少不是一种有用的方式。

更长:写flash的慢不是CPU太慢造成的,而是写flash内存的页写周期太慢造成的。(因此,DMA 并没有更快)。理论上您可以使用 DMA 写入闪存(即使这有点棘手并且有很多陷阱),但您不会获得任何速度。原因是,当 CPU 在写入时尝试访问闪存时,它会被暂停。因此,当 DMA 写入代码时,CPU 将无法从那里执行代码 - 没有时间。

手册上说:

在写入或擦除 STM32F4xx 上的 Flash 存储器时,任何尝试读取它都会导致总线停顿。编程操作完成后,将正确处理读取操作。这意味着在写/擦除操作正在进行时无法执行代码或数据提取。

这意味着在 DMA 运行时从任何闪存区域执行代码是不可能的 - CPU 将在该时间段内暂停。但是,您可以使事情变得更加复杂,并将部分代码复制到 RAM 以在那里执行以解决此问题。

某些 F4 系列具有 4k 的电池供电 RAM。使用它,它会更快,更容易处理。

  • 虽然在这种情况下 DMA 确实无济于事,但 CPU 无法执行代码并不完全正确(如后续评论中所述);而是它无法执行驻留在正在写入的闪存中的代码 - 对于 STM32 通常是这种情况。例如,如果在闪存写入期间中断服务很重要,则可以将 ISR 放置在 RAM 中(如果可用,CCM 是一个不错的选择)。 (2认同)

小智 5

另一种可能性是使用具有边读边写功能的双存储体设备。在这些设备中有两组闪存。可以在将数据写入第二个 bank 的同时执行一个 bank 中的代码。