【问题标题】:STM32 Flash Erase fails with a "Programming Parallelism error" and "Programming Sequence error"STM32 闪存擦除失败并出现“编程并行错误”和“编程序列错误”
【发布时间】:2022-08-16 12:51:43
【问题描述】:

我有一个在 STM32F4 上运行的应用程序,它使用 STM32 HAL 框架 + FreeRTOS。我偶尔需要在运行时将一些设置存储在闪存中,并编写了以下函数来擦除我的目标地址 0x08060000UL 的数据(我相信这是这个特定 MCU 的 SECTOR_6)。

HAL_StatusTypeDef Flash::erase(uint32_t address)
{
    HAL_StatusTypeDef status;
    HAL_FLASH_Unlock();         // unlock the flash API
    __disable_irq();            // disable all interrupts
    vTaskSuspendAll();          // suspend all FreeRTOS tasks

    FLASH_EraseInitTypeDef eraseConfig = {0};
    uint32_t sectorError;
    uint32_t flashError = 0;

    eraseConfig.TypeErase = FLASH_TYPEERASE_SECTORS;
    eraseConfig.Sector = this->getSector(address);
    eraseConfig.NbSectors = 1;
    eraseConfig.VoltageRange = FLASH_VOLTAGE_RANGE_3;

    status = HAL_FLASHEx_Erase(&eraseConfig, &sectorError); // <---- FAILS HERE
    if (status != HAL_OK)
    {
        flashError = HAL_FLASH_GetError();
    }

    status = HAL_FLASH_Lock();
    xTaskResumeAll();          // resume all FreeRTOS tasks
    __enable_irq();            // re-enable interrupts

    return status;
}

flashError 变量最终被设置为6,这意味着在调用HAL_FLASHEx_Erase() 期间发生了以下两个错误

#define HAL_FLASH_ERROR_PGS          0x00000002U    /*!< Programming Sequence error    */
#define HAL_FLASH_ERROR_PGP          0x00000004U    /*!< Programming Parallelism error */

我不能 100% 确定,但我认为这段代码在实现 FreeRTOS 之前运行良好。无论如何,什么样的行为可能会导致这样的错误?我认为禁用所有 ISR 以及暂停所有任务(即使在此操作期间只有一个正在运行)会覆盖我,但这些尝试的组合都无法缓解错误????‍♂️。

    标签: stm32


    【解决方案1】:

    原来我必须在使用 HAL Flash API 之前重置一些外围标志。为什么?我不知道,但在使用 API 之前清除所有标志解决了我的问题。

        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP);
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPERR);
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_WRPERR);
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR);
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGPERR);
        __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR);
    

    【讨论】:

      【解决方案2】:

      你找到为什么你必须清除这些标志了吗?我现在也有类似的问题。如果我在启动 rtos 之前调用我的读写函数,它们会正常工作。当我使用您的解决方案时,它会工作一段时间,然后在随机点崩溃。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-26
        • 1970-01-01
        • 2021-09-10
        • 1970-01-01
        • 2021-11-09
        • 2022-12-16
        • 1970-01-01
        相关资源
        最近更新 更多