YMODEM으로 전송되는 데이터를 FLASH에 Write를 해 본다.
프로젝트 파일
Erase 기능은 YMODEM_TYPE_START 시에 파일 크기만큼 진행 한다.
case YMODEM_TYPE_START:
printf("YMODEM_TYPE_START %s %d\\n", ymodem.file_name, (int)ymodem.file_length);
{
FLASH_EraseInitTypeDef EraseInit;
uint32_t SectorError;
HAL_StatusTypeDef status;
uint8_t sector_cnt = 0;
sector_cnt = (ymodem.file_length / (128*1024)) + 1;
EraseInit.Sector = 1;
EraseInit.NbSectors = sector_cnt;
EraseInit.TypeErase = FLASH_TYPEERASE_SECTORS;
EraseInit.VoltageRange = FLASH_VOLTAGE_RANGE_4;
EraseInit.Banks = FLASH_BANK_1;
HAL_FLASH_Unlock();
printf("FLASH Erase 0x%X : %ldB .. ", 0x08020000, ymodem.file_length);
status = HAL_FLASHEx_Erase(&EraseInit, &SectorError);
if (status == HAL_OK)
{
printf("OK\\n");
}
else
{
printf("Fail\\n");
}
HAL_FLASH_Lock();
}
break;
실행 결과
YMODEM_TYPE_DATA 에서 구현한다.
case YMODEM_TYPE_DATA:
{
HAL_StatusTypeDef status;
uint32_t flash_cnt;
uint32_t flash_addr;
if (ymodem.file_buf_length%32 == 0)
flash_cnt = ymodem.file_buf_length / 32;
else
flash_cnt = (ymodem.file_buf_length / 32) + 1;
HAL_FLASH_Unlock();
for (int i=0; i<flash_cnt; i++)
{
flash_addr = 0x08020000 + ymodem.file_addr + i*32;
printf("FLASH Write 0x%lX .. ", flash_addr);
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, flash_addr , (uint32_t)&ymodem.file_buf[i*32]);
if (status == HAL_OK)
{
printf("OK\\n");
}
else
{
printf("Fail\\n");
break;
}
}
HAL_FLASH_Lock();
}
break;
실행 결과
CubeProgrammer에서도 확인 가능