【发布时间】: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 没有停止,因此您需要以某种方式检测操作的结束。参考手册很重要,而不是数据表。
标签: stm32 freertos flash-memory