擦除STM32闪存扇区挂起程序
我正在使用FreeRtos,在其中一个任务中,我使用以下代码擦除闪存的一个扇区擦除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
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。