Firmware_Memory/STM32
STM32 IAP 이슈
페타바이트
2022. 3. 15. 08:52
STM32 IAP 이슈
1. Y modem으로 전송을 하면 전송 되다가 Verification failed 가 뜨는 경우
-> flash_if.c 파일에
FLASH_IF_Write 함수에서
처음에 HAL_FLASH_Unlock(); 을 추가해야함.
uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data ,uint32_t DataLength)
{
uint32_t i = 0;
HAL_FLASH_Unlock(); // 바로 이부분!
for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS-4)); i++)
{
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
be done by word */
if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, *FlashAddress, *(uint32_t*)(Data+i)) == HAL_OK)
{
/* Check the written value */
if (*(uint32_t*)*FlashAddress != *(uint32_t*)(Data+i))
{
HAL_FLASH_Lock();
/* Flash content doesn't match SRAM content */
return(2);
}
/* Increment FLASH destination address */
*FlashAddress += 4;
}
else
{
HAL_FLASH_Lock();
/* Error occurred while writing data in Flash memory */
return (1);
}
}
return (0);
}
2. 처음에만 전송이 되고 그 이후로 전송이 안되는 경우
-> 재 전송하려면 해당 Flash 부분을 지워야 함.
-> Erase 하는 부분이 섹터마다 지우지 않고 띄엄띄엄 지우게 되어 있어서 수정함.
uint32_t FLASH_If_Erase(uint32_t Start_Address)
{
uint32_t UserStartSector = FLASH_SECTOR_1, i = 0;
uint32_t err;
/* Get the sector where start the user flash area */
UserStartSector = GetSector((uint32_t)Start_Address);
HAL_FLASH_Unlock();
for(i = UserStartSector; i <= FLASH_LAST_SECTOR; i ++) // 이 부분을 수정함.
{
/* Device voltage range supposed to be [2.7V to 3.6V], the operation will
be done by word */
FLASH_Erase_Sector(i, FLASH_VOLTAGE_RANGE_3);
err = HAL_FLASH_GetError();
if(err !=0)
{
HAL_FLASH_Lock();
return err;
}
}
HAL_FLASH_Lock();
return (0);
}
3. Putty 에서는 전송이 잘 되는데 Tera-Term에서는 전송하면 제대로 되지 않는 경우
-> 혹시 이것? https://blog.naver.com/eziya76/221552811740