STM32 的 DMA 到闪存
DMA to Flash for STM32
我正在使用 stm32f40x 微控制器 (UC),我必须使用它的内部闪存来存储一些数据。如您所知,写操作非常慢并且占用 UC 的时间非常长。所以我想到了 DMA,问题是:
是否可以使用DMA将数据从SRAM传输到FLASH?
感谢您的宝贵时间。
简而言之:不。至少不是有用的方式。
更长:写入闪存的速度慢不是因为CPU太慢,而是因为写入闪存的页面写入周期耗时。 (因此,DMA 并没有更快)。理论上您可以使用 DMA 写入闪存(即使这有点棘手并且有很多陷阱),但您不会获得任何速度。原因是,CPU 在写入时尝试访问闪存时将被暂停。因此,当 DMA 写入代码时,CPU 将无法从那里执行代码 - 没有时间获得。
手册说:
Any attempt to read the Flash memory on STM32F4xx while it is being written or erased, causes the bus to stall. Read operations are processed correctly once the program operation has completed. This means that code or data fetches cannot be performed while a write/erase operation is ongoing.
这意味着在 DMA 运行时从任何闪存区域执行代码是不可能的 - CPU 将暂停该时间段。但是,您 可以 使事情变得更加复杂,并将部分代码复制到 RAM 以在那里执行它以解决此问题。
部分 F4 系列具有 4k 电池供电 RAM。使用它,处理起来更快更简单。
另一种可能性是使用具有边写边读功能的双组设备。
在这些设备中有两组闪存。可以在将数据写入第二个 bank 的同时从一个 bank 执行代码。
我正在使用 stm32f40x 微控制器 (UC),我必须使用它的内部闪存来存储一些数据。如您所知,写操作非常慢并且占用 UC 的时间非常长。所以我想到了 DMA,问题是:
是否可以使用DMA将数据从SRAM传输到FLASH?
感谢您的宝贵时间。
简而言之:不。至少不是有用的方式。
更长:写入闪存的速度慢不是因为CPU太慢,而是因为写入闪存的页面写入周期耗时。 (因此,DMA 并没有更快)。理论上您可以使用 DMA 写入闪存(即使这有点棘手并且有很多陷阱),但您不会获得任何速度。原因是,CPU 在写入时尝试访问闪存时将被暂停。因此,当 DMA 写入代码时,CPU 将无法从那里执行代码 - 没有时间获得。
手册说:
Any attempt to read the Flash memory on STM32F4xx while it is being written or erased, causes the bus to stall. Read operations are processed correctly once the program operation has completed. This means that code or data fetches cannot be performed while a write/erase operation is ongoing.
这意味着在 DMA 运行时从任何闪存区域执行代码是不可能的 - CPU 将暂停该时间段。但是,您 可以 使事情变得更加复杂,并将部分代码复制到 RAM 以在那里执行它以解决此问题。
部分 F4 系列具有 4k 电池供电 RAM。使用它,处理起来更快更简单。
另一种可能性是使用具有边写边读功能的双组设备。 在这些设备中有两组闪存。可以在将数据写入第二个 bank 的同时从一个 bank 执行代码。