闪存扇区擦除 - 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的主要内容,如果未能解决你的问题,请参考以下文章

STM32F207使用定时器1产生PWM波形

STM32f207ZG NUCLEO 板,ld.exe:.RxDescriptSection VMA [2000e000,2000e09f] 部分与 .bss VMA [20000118,200143

在 STM32f10x 中使用 EEPROM

如何在 STM32F4、Cortex M4 上写入/读取 FLASH

STM32F103 闪存保护部分

带有 AXIM/ITCM 闪存的 STM32F7 VMA 和 LMA