Reputation: 15
I currently have this code setup to erase a specific sector of the STM32F207 internal flash (in a freeRTOS environment):
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");
}
}
When this code executes, the application resets/crashes whenever the FLASH_CR Start bit is set in FLASH_Erase_Sector() (called from the HAL_FLASHEx_Erase_IT() function). I've attempted this with multiple unused flash sectors and they all crash.
I've also attempted directly calling FLASH_Erase_Sector() and the same persists.
Upvotes: 1
Views: 1272
Reputation: 15
Turns out my crashes were caused by my Watchdog dying (terrible oversight on my part). I temporarily disable the watchdog during the flash erase & write operations and it works fine.
The better option, though, would be to place the functionality in RAM (as suggested by @old_timer & @kkrambo) to prevent the CPU from being blocked for too long.
Upvotes: 0