1
votes

I have an application running on an STM32F4 which uses the STM32 HAL framework + FreeRTOS. I occasionally need to store some settings in flash during runtime and have written the following function to erase the data at my target address of 0x08060000UL (I believe this is SECTOR_6 of this particular MCU).

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;
}

The flashError variable ends up getting set to 6, which means the following two errors occurred during the call to HAL_FLASHEx_Erase()

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

I can't be 100% sure, but I think this code worked fine prior to implementing FreeRTOS. Regardless, what kind of behavior might cause such an error? I thought disabling all ISRs as well as suspending all tasks (even though there is only one running during this operation) would cover me, but no combination of these attempts alleviates the error ????‍♂️.