Un error mio, pense que tenia EEPROM.
Ahora que me fijo en la seleccion de productos, los ST ninguno sale con EEPROM, todos tiene un "-"
Asi es, pensé q te referias a la emulacion de EEPROM, pero he leido q es lenta, y complicada.
Planeta, mira, estas son las instrucciones q uso:
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase(&erase_pages, errores);
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, 0x08007C00,0x0002);
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, 0x08007C04,0x0003);
HAL_FLASH_Lock();
Por probar un valor cualquiera, y lo q hace
HAL_FLASH_Unlock();
Es
HAL_StatusTypeDef HAL_FLASH_Unlock(void)
{
if((READ_BIT(FLASH->CR, FLASH_CR_LOCK)) != RESET)
{
/* Authorize the FLASH Registers access */
WRITE_REG(FLASH->KEYR, FLASH_FKEY1);
WRITE_REG(FLASH->KEYR, FLASH_FKEY2);
}
else
{
return HAL_ERROR;
}
return HAL_OK;
}
Hace el chequeo del bit en FLASH_CR q me comentas, voy a ver el rm q me recomiendas, saludos.
UPDATE:
Esto hace HAL_FLASHEx_Erase:
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *PageError)
{
HAL_StatusTypeDef status = HAL_ERROR;
uint32_t address = 0;
/* Process Locked */
__HAL_LOCK(&pFlash);
/* Check the parameters */
assert_param(IS_TYPEERASE(pEraseInit->TypeErase));
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
if (status == HAL_OK)
{
if (pEraseInit->TypeErase == TYPEERASE_MASSERASE)
{
/*Mass erase to be done*/
FLASH_MassErase();
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
/* If the erase operation is completed, disable the MER Bit */
CLEAR_BIT(FLASH->CR, FLASH_CR_MER);
}
else
{
/* Check the parameters */
assert_param(IS_FLASH_PROGRAM_ADDRESS(pEraseInit->PageAddress));
assert_param(IS_FLASH_NB_PAGES(pEraseInit->PageAddress, pEraseInit->NbPages));
/*Initialization of PageError variable*/
*PageError = 0xFFFFFFFF;
/* Erase by page by page to be done*/
for(address = pEraseInit->PageAddress;
address < (pEraseInit->PageAddress + (pEraseInit->NbPages)*FLASH_PAGE_SIZE);
address += FLASH_PAGE_SIZE)
{
FLASH_PageErase(address);
/* Wait for last operation to be completed */
status = FLASH_WaitForLastOperation((uint32_t)HAL_FLASH_TIMEOUT_VALUE);
/* If the erase operation is completed, disable the PER Bit */
CLEAR_BIT(FLASH->CR, FLASH_CR_PER);
if (status != HAL_OK)
{
/* In case of error, stop erase procedure and return the faulty address */
*PageError = address;
break;
}
}
}
}
/* Process Unlocked */
__HAL_UNLOCK(&pFlash);
return status;
}