在STM32F103上,擦除一个闪存页需要20毫秒,期间核心会停顿。从ST PM00042闪存编程手册中并不清楚核心是否总是在擦除闪存页时停顿,或者只是因为指令流本身位于闪存内存(在我的项目中),而FPEC(闪存内存接口)正在忙于获取更多指令。另一个提问的方式是,“如果我将闪存编程代码从RAM中运行,能否避免闪存页擦除的停顿?”谢谢,
我认为在Flash编程期间,任何试图访问Flash的尝试都会使CPU停滞。因此,您需要确保关键代码(可能是中断处理程序、看门狗启动器等)可以在程序操作期间从RAM中运行。我上一次使用STM32(大约2年前)时就是这样做的。所以,为了明确回答您帖子末尾的问题:另一个提出这个问题的方式是“从RAM运行我的Flash编程代码是否可以避免Flash页擦除停顿?”。我认为答案是否定的。Flash编程驱动程序位于何处并不重要,重要的是您的代码在“擦除/编程操作正在进行时”做了什么。如果CPU在操作期间尝试访问Flash,即使是为了读取程序的指令或读取常量表,我认为它也会停滞。我知道NXP ARM微控制器上的Flash是如何工作的,但我也想引用STM32的相关文献。由于某种原因,Flash编程手册目前似乎无法获取,但我在类似文档(我相信是PM0068)中找到了以下语言:正在进行的Flash存储器操作只要CPU不访问Flash存储器就不会阻塞CPU。如果在编程期间启动了读/写操作[到Flash](BSY位设置),则CPU会停顿,直到正在进行的主Flash存储器编程结束。
公交车出故障的是总线,而不是核心。如果需要,核心可能必须在公交车上等待。SRAM和Flash位于不同的总线上,因此代码可以继续从RAM中执行。您必须确保该代码不会调用Flash中的代码,并且还要注意到令人意外的是,SRAM代码执行速度会变慢,因为指令和数据获取都在同一条总线上,所以不再同时发生。类似地,外部SRAM中的代码可以继续运行。如果您安排一个在内部RAM中,另一个在外部RAM中,那么独立的总线可能会解决数据/指令争用问题,但无论如何,外部总线速度较慢,性能仍然会受到影响。问题和妥协使得您可能考虑使用单独的EEPROM进行非易失性存储。