擦除STM32闪存扇区挂起程序

擦除STM32闪存扇区挂起程序,stm32,freertos,flash-memory,Stm32,Freertos,Flash Memory,我正在使用FreeRtos,在其中一个任务中,我使用以下代码擦除闪存的一个扇区 HAL_FLASH_Unlock(); // Fill EraseInit structure static FLASH_EraseInitTypeDef EraseInitStruct; EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; EraseInitStruct.VoltageRange = FLASH_VOLT

我正在使用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)

因此@Hs2似乎是正确的。在进一步的研究中,擦除闪存上的扇区将阻止执行,如本文所述

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


现在,这带来了更多的问题,比如为什么stm的工程师会在任何一种调用方式都会被阻塞的情况下,包含扇区擦除的中断版本。这很容易引起误解。似乎没有这方面的用例。

文档很清楚:


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

我认为在闪存控制器擦除/写入(页面)操作期间,对(整个)闪存的读取访问被阻止。使用带有双闪存的MCU可能会有所不同,因为每个闪存组都有一个专用的闪存控制器。应记录在STM32 MCU的TRM中。@HS2使用stm32f411迪斯科。从我所看到的,到目前为止,数据表中没有任何东西解释这一点。然而,在HAL的参考表中,他们解释说有两种版本的erase。有轮询和阻塞HAL_flashx_擦除和非阻塞HAL_flashx_擦除版本。我相信这意味着它不应该像使用HAL_flashx_Erase_它时那样做。@HadiJaber您也可以从RAM运行代码。RAM没有停止,因此您需要以某种方式检测操作的结束。参考手册是重要的,而不是数据表。哈迪-不要阅读互联网,阅读文档。第二,不要用HAL。