【发布时间】: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, §orError); // <---- 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