闪存扇区擦除 - STM32F207
Posted
技术标签:
【中文标题】闪存扇区擦除 - STM32F207【英文标题】:Flash Sector Erase - STM32F207 【发布时间】:2021-02-12 16:05:25 【问题描述】:我目前有此代码设置来擦除 STM32F207 内部闪存的特定扇区(在 freeRTOS 环境中):
static void eraseSector(uint32_t sector)
FLASH_EraseInitTypeDef eraseInitStruct = 0 ;
HAL_StatusTypeDef status = HAL_OK;
if( HAL_FLASH_Unlock() != HAL_OK )
printDebug("Error unlocking Flash\r\n");
eraseInitStruct.TypeErase = TYPEERASE_SECTORS;
eraseInitStruct.VoltageRange = VOLTAGE_RANGE_3;
eraseInitStruct.Sector = sector;
eraseInitStruct.NbSectors = 1;
status = HAL_FLASHEx_Erase_IT(&eraseInitStruct);
if (status != HAL_OK)
print("Unable to erase Sector: %d\n", status);
else
print("Flash sector %d erased. Status: %d\n", sector, status);
/* Wait for the erase operation to complete */
osSemaphoreWait(FlashOperation_sem, osWaitForever);
if( HAL_FLASH_Lock() != HAL_OK )
print("Error locking Flash\n");
执行此代码时,只要在 FLASH_Erase_Sector() 中设置了 FLASH_CR 启动位(从 HAL_FLASHEx_Erase_IT() 函数调用),应用程序就会重置/崩溃。我已经尝试过使用多个未使用的闪存扇区,但它们都崩溃了。
我也尝试过直接调用 FLASH_Erase_Sector() 并且仍然存在。
【问题讨论】:
您正在从 ram 运行此代码,是吗?检查零件是否可以在闪烁时从闪存运行。如果可能的话,通常设计将有两个或更多银行,您可以擦除其中的一部分,同时耗尽另一个。常见的解决方案是从 ram 中运行,复制 flash 所需的代码然后跳转。 STM32F2xx Flash Programming Manual 说,“在写入/擦除操作正在进行时无法执行代码或数据获取。”我相信这意味着您必须将闪存编程例程复制到 RAM 并从 RAM 中执行它们。 按照这里的说明:keil.com/support/docs/3228.htm 我把上面代码的文件,以及带有 FLASH_Erase_Sector() 函数的 HAL 文件放在 RAM 中,擦除仍然无法执行。 【参考方案1】:原来我的崩溃是由我的 Watchdog 死机引起的(我的疏忽太严重了)。我在闪存擦除和写入操作期间暂时禁用了看门狗,它工作正常。
不过,更好的选择是将功能放在 RAM 中(如 @old_timer 和 @kkrambo 所建议的那样),以防止 CPU 被阻塞太久。
【讨论】:
我没有看到这部分已经存储了闪存,所以如果它碰巧工作,那么很可能是基于 ST 的缓存/预取的东西。一般来说,尝试同时从闪存运行和擦除闪存是一个坏主意,除非文档明确说明如何安全地执行此操作。 @old_timer,是的,情况似乎如此。它没有 100% 的时间工作。这部分的解决方案似乎按照您的建议从 RAM 执行。以上是关于闪存扇区擦除 - STM32F207的主要内容,如果未能解决你的问题,请参考以下文章
STM32f207ZG NUCLEO 板,ld.exe:.RxDescriptSection VMA [2000e000,2000e09f] 部分与 .bss VMA [20000118,200143