No se pueden borrar datos de la memoria flash (STM32)

Estoy tratando de guardar algunos datos en la memoria flash de mi placa STM32F407 . Antes de poder guardarlos, necesito borrar un sector de la memoria. Elegí 16 Kbytes Sector1 comenzando con la dirección 0x08004000 y elegí el rango de voltaje 2.1-2.7 V. Estoy usando la biblioteca HAL.

El programa deja de responder después de FLASH->CR |= FLASH_CR_STRT; línea dentro de la función HAL_FLASHEx_Erase() -> FLASH_Erase_Sector().

Estoy bastante seguro de que es mi culpa, pero no puedo averiguar qué está mal.

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
                           FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.Sector = FLASH_SECTOR_1;
EraseInitStruct.TypeErase = TYPEERASE_SECTORS;
EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_2;
EraseInitStruct.NbSectors = 1;
uint32_t SectorError = 0;
if (HAL_FLASHEx_Erase(&EraseInitStruct, &SectorError) != HAL_OK) {     
    HAL_FLASH_Lock();
    return;
}

uint16_t data = 300;
//----------------------------write data
if (HAL_FLASH_Program(TYPEPROGRAM_WORD, start_address, data) != HAL_OK) {
    HAL_FLASH_Lock();
    return;
}
HAL_FLASH_Lock();

¿Elegí el rango de voltaje o el número de sectores incorrecto?

Gracias por tus respuestas.

Defina "deja de responder". ¿Estás tratando de depurar a través de esto? No espere que eso funcione, ya que la programación flash tiene requisitos de hardware estrictos.
Coloqué mi punto de interrupción en línea con la función HAL_FLASH_Program() pero mi programa nunca lo alcanzó. Después de borrar la memoria, deja de responder y puedo esperar el tiempo que quiera.

Respuestas (1)

Encontré la solución. Usé la función HAL_FLASH_Lock() en lugar de la función HAL_FLASHEx_Erase() y funciona bien. También cambié de SECTOR porque accidentalmente estaba borrando mi programa.

unit32_t address = 0x0800C000;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);

FLASH_Erase_Sector(FLASH_SECTOR_3, VOLTAGE_RANGE_3);

//----------------------------write data  
uint8_t data = 'A';
if (HAL_FLASH_Program(TYPEPROGRAM_BYTE, start_address, data) != HAL_OK) {
    HAL_FLASH_Lock();
    return;
}
HAL_FLASH_Lock();

Gracias por tu ayuda.