2026-01-27 7:23 PM
I'll explain Flash Erase Error to the stm32l475rct6 MCU that I'm currently using. Page : 127, Address : 0x0803F800, Bank : FLASH_BANK_1 is defined, and if you try to modify the value after first saving the value in the Flash area, the values already stored in Flash are not erased properly, so the Flash value cannot be modified. SMT32CubeIDE version is 1.19.0 and I'll attach the code I implement, so please check where the problem is and let me know if there is a solution.
void AO_SaveCalibration(void)
{
HAL_StatusTypeDef status;
printf("Saving calibration to Flash...\r\n");
printf("Data size: %u bytes\r\n", sizeof(AO_Calibration_t));
ao_cal.checksum = Calculate_Checksum1();
status = HAL_FLASH_Unlock();
if (status != HAL_OK)
{
printf("ERROR: Flash unlock failed\r\n");
return;
}
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS);
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))
{
// Flash 작업 완료 대기
}
FLASH_EraseInitTypeDef EraseInitStruct;
uint32_t PageError = 0;
EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
EraseInitStruct.Banks = FLASH_BANK_1;
EraseInitStruct.Page = CAL_FLASH_PAGE;
EraseInitStruct.NbPages = 1;
status = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
if (status != HAL_OK)
{
printf("ERROR: Flash erase failed! Status=0x%02X, PageError=0x%08lX\r\n",
status, PageError);
HAL_FLASH_Lock();
return;
}
while(__HAL_FLASH_GET_FLAG(FLASH_FLAG_BSY))
{
// Erase 작업 완료 대기
}
uint64_t *data_ptr = (uint64_t*)&ao_cal;
uint32_t data_size = sizeof(AO_Calibration_t);
uint32_t num_doublewords = (data_size + 7) / 8;
uint32_t write_addr = CAL_FLASH_ADDR;
printf("Writing %lu doublewords to Flash...\r\n", num_doublewords);
for (uint32_t i = 0; i < num_doublewords; i++)
{
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD,
write_addr,
data_ptr[i]);
if (status != HAL_OK)
{
printf("ERROR: Flash write failed at 0x%08lX (status: 0x%02X)\r\n",
write_addr, status);
printf(" Flash error code: 0x%08lX\r\n", HAL_FLASH_GetError());
HAL_FLASH_Lock();
return;
}
write_addr += 8;
}
HAL_FLASH_Lock();
printf("Calibration saved! (Checksum: 0x%08lX)\r\n", ao_cal.checksum);
// 저장된 내용 확인
printf("\r\n=== Saved Data ===\r\n");
for (int ch = 0; ch < AO_CH_MAX; ch++)
{
printf(" %s: 4mA=%u, 20mA=%u, Sensor=%s, EN=%s\r\n",
AO_GetChannelName(ch),
ao_cal.channels[ch].pwm_4mA,
ao_cal.channels[ch].pwm_20mA,
AO_GetSensorTypeName((Sensor_Type_t)ao_cal.channels[ch].sensor_type),
ao_cal.channels[ch].enabled ? "Yes" : "No");
}
printf("==================\r\n\r\n");
}
2026-01-27 8:25 PM
What does the printf story tell when you try to run this code? What error messages does it present?
2026-01-27 8:46 PM
- Programming Alignment Error (FLASH_SR_PGAERR)
- Programming Sequence Error (FLASH_SR_PGSERR)
- Programming Parallelism Error (FLASH_SR_PROGERR)