Question
STM32G0 and FLASH_TYPEPROGRAM_FAST fail
Hello,
I use a Nucleo-STM32G0B1 (512KB Flash).
I would like to flash same data in fast mode, but the HAL_FLASH_Program() function ending with error. The HAL_FLASH_GetError() = 0x2A0 (PGSERR and PGAERR).
Before writing I erase some flash pages.
If I clean only ONE page the HAL_FLASH_Program() works but if I clear more, it doesn't works.
This is my test code :
void write_test(void)
{
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError = 0;
uint8_t data[256];
uint32_t addrFlash = 0x8040100;
uintptr_t addrData = (uintptr_t) data;
// Init data
for (int i = 0; i < 256; i++)
data[i] = i;
//====== ERASE
if (HAL_FLASH_Unlock() != HAL_OK)
{
ERR("Flash unlock fail");
return;
}
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = FLASH_BANK_2;
EraseInitStruct.Page = 0;
EraseInitStruct.NbPages = 3; // If I set it to 1, HAL_FLASH_Program() works.
if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)
{
ERR("Fail to erase data, error=%X", PageError);
HAL_FLASH_Lock();
return;
}
HAL_FLASH_Lock();
//===== FLASH
if (HAL_FLASH_Unlock() != HAL_OK)
{
ERR("Flash unlock fail");
return;
}
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_FAST, addrFlash, addrData) != HAL_OK)
{
ERR("FLash write fail 0x%X, error=%X", addrFlash, HAL_FLASH_GetError());
HAL_FLASH_Lock();
return;
}
HAL_FLASH_Lock();
}