在 STM32F103 上,闪存页面的擦除需要 20 毫秒,在此期间内核停止。从 ST PM00042 Flash 编程手册中并不清楚内核在擦除闪存页时是否总是会停止,或者它是否只是因为指令流本身在闪存中(在我的项目中)而停止,而 FPEC(闪存接口)是忙,无法获取更多指令。
问这个问题的另一种方法是“从 RAM 运行我的闪存编程代码会避免闪存页面擦除停滞吗?”。
谢谢,
我相信在闪存编程期间,任何尝试访问闪存都会使 CPU 停止。
因此,您要做的是确保关键代码(可能是中断处理程序、看门狗启动器等)可以在程序操作期间用完 RAM。我最后一次使用 STM32(可能是大约 2 年前)正是我所做的。
因此,为了清楚起见,回答您帖子末尾的问题:
问这个问题的另一种方法是“从 RAM 运行我的闪存编程代码会避免闪存页面擦除停滞吗?”。
我相信答案是“不”。闪存编程驱动程序的位置并不重要,重要的是您的代码在擦除/编程操作正在进行时所做的事情。如果 CPU 在操作期间尝试访问闪存,甚至是读取程序指令或读取常量表,我相信它会停止。
我知道这就是 NXP 闪存在其 ARM uC 上的工作方式,但我也想引用 STM32 的章节和诗句。由于某种原因,flash 编程手册现在似乎不可用,但我在类似的文档中找到了以下语言(我相信是 PM0068):
只要 CPU 不访问 Flash 存储器,正在进行的 Flash 存储器操作就不会阻塞 CPU。
和
如果在编程期间启动 [对闪存] 的读/写操作,(BSY 位设置),CPU 将停止,直到正在进行的主闪存编程结束。