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