Cortex-M3 STM32F103核心在执行闪存页擦除时是否会停顿,是因为FPEC忙于处理其他任务而无法从闪存中获取更多指令?

7
在STM32F103上,擦除一个闪存页需要20毫秒,期间核心会停顿。从ST PM00042闪存编程手册中并不清楚核心是否总是在擦除闪存页时停顿,或者只是因为指令流本身位于闪存内存(在我的项目中),而FPEC(闪存内存接口)正在忙于获取更多指令。
另一个提问的方式是,“如果我将闪存编程代码从RAM中运行,能否避免闪存页擦除的停顿?”
谢谢,
2个回答

7
我认为在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存储器编程结束。

太棒了,谢谢。我现在正在尝试将有问题的代码加载到RAM中来尝试这个方法。我会告诉你我的进展如何的。我只希望PM00042像你引用的那个PM一样清晰明了... - Captain NedD
PM00042已经消失 - 尝试查找PM0056或PM0063。您也可以访问ST网站,找到STM32部分并查找“编程手册”文档。 - peter_mcc
这是公交车出故障,而不是内核。内核只是在总线上插入等待状态(打滑轮胎),等待中。 - Clifford

0
公交车出故障的是总线,而不是核心。如果需要,核心可能必须在公交车上等待。
SRAM和Flash位于不同的总线上,因此代码可以继续从RAM中执行。
您必须确保该代码不会调用Flash中的代码,并且还要注意到令人意外的是,SRAM代码执行速度会变慢,因为指令和数据获取都在同一条总线上,所以不再同时发生。
类似地,外部SRAM中的代码可以继续运行。如果您安排一个在内部RAM中,另一个在外部RAM中,那么独立的总线可能会解决数据/指令争用问题,但无论如何,外部总线速度较慢,性能仍然会受到影响。
问题和妥协使得您可能考虑使用单独的EEPROM进行非易失性存储。

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