擦除STM32 Flash Sector是挂程序

Posted

技术标签:

【中文标题】擦除STM32 Flash Sector是挂程序【英文标题】:Erasing STM32 Flash Sector is hanging program 【发布时间】:2021-02-11 03:58:00 【问题描述】:

我正在使用 FreeRtos,在其中一项任务中,我使用以下代码擦除闪存的一个扇区

HAL_FLASH_Unlock();
    // Fill EraseInit structure
        static FLASH_EraseInitTypeDef EraseInitStruct;
    EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; 
    EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;
    EraseInitStruct.Sector = sector;
    EraseInitStruct.NbSectors = numOfSectorsToErase;
HAL_FLASHEx_Erase_IT(&EraseInitStruct); 
  
    HAL_FLASH_Lock();

我认为这是擦除扇区的非阻塞调用,但是当调用它时,所有其他线程似乎被抢占 100 毫秒(如示波器上所示),直到擦除完成。我一定做错了什么,因为我正在使用擦除的中断版本。它不应该像这样挂所有东西对吗?

(我确定我正在擦除程序代码不驻留的扇区。扇区6)

【问题讨论】:

我认为在闪存控制器擦除/写入(页面)操作期间,对(整个)闪存的读取访问被阻止。使用具有双组闪存的 MCU 可能会有所不同,因为每个组都有一个专用的闪存控制器。应该记录在您的 STM32 MCU 的 TRM 中。 @HS2 使用 stm32f411 迪斯科。据我所见,到目前为止,数据表中没有任何内容可以解释这一点。然而,在他们的 HAL 参考表中,他们解释说有两个版本的擦除。有轮询和阻塞 HAL_FLashEx_Erase 和非阻塞 HAL_FLashEx_Erase_IT 版本。我相信这意味着它不应该在使用 HAL_FLashEx_Erase_IT 时做它正在做的事情。 @HadiJaber 您也可以从 RAM 运行代码。 RAM 没有停止,因此您需要以某种方式检测操作的结束。参考手册很重要,而不是数据表。 【参考方案1】:

文档清晰:

始终阅读文档,而不是互联网论坛。

【讨论】:

【参考方案2】:

所以看起来@Hs2 是正确的。在进一步的研究中,擦除闪存上的扇区将阻止执行,如此处所述https://community.st.com/s/question/0D50X00009XkXwuSAF/how-to-save-a-variable-in-nonvolatile-memory

说“闪烁阻止代码执行”。

现在这带来了更多的问题,比如为什么 stm 的工程师会在任何一种方式调用都会阻塞的情况下包含扇区擦除的中断版本。它非常具有误导性。这似乎没有用例。

【讨论】:

Hadi - 不要阅读互联网,阅读文档。其次,不要为此使用 HAL。

以上是关于擦除STM32 Flash Sector是挂程序的主要内容,如果未能解决你的问题,请参考以下文章

STM32+ESP8266+AIR202/302远程升级方案-程序优化-如果判断Flash需要擦除再擦除Flash,提高Flash使用寿命

基于STM32的Flash擦除方式

STM32L476 flash 页擦除没有效果

如何写入STM32 Flash

ARM:使用 stm32l0 nucleo 在几秒钟后自动擦除闪存

STM32F4 使用 JFlash 加密后无法再擦除了