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.