안녕하세요.

 

부트로더에서 펌웨어 업데이트를 하기 위해 YMODEM 프로토콜을 사용하였습니다.

저는 STM에서 제공하는 IAP가 아니고 바람님이 작성하신 YMODEM 모듈을 사용하였습니다.

 

프로그램 작성 후 테라텀에서 YMODEM으로 파일 전송을 했는데 

첫번째 다운로드는 잘 되다가 두번째 다운로드(다른 파일)는 간혹 멈추는 현상이 있었습니다.

 

구글링을 해보니 이지훈님 블로그에서 원인을 알 수 있었습니다.

 

원인

테라텀 4.86버전 이상부터 최초 SOH 패킷을 전송한 이후에 SOH 패킷을 한번 더 전송하면서 발생되는 문제

 

해결법

1. 첫번째 수신한 데이터가 SOH이고 새로운 데이터가 SOH이면 데이터를 버리도록 코딩

2. 테라텀 버전을 4.85이하 버전 사용

 

아래는 바람님이 사용하시는 ymodem.c의 한 부분입니다.

 


bool ymodemReceivePacket(ymodem_packet_t *p_packet, uint8_t data_in)
{
  bool ret = false;

  switch(p_packet->state)
  {
    case YMODEM_PACKET_WAIT_FIRST:
      // 새로 추가된 부분 시작
      if (data_in == YMODEM_SOH && p_packet->stx == YMODEM_SOH) {
        break;
      }
      else if (data_in == YMODEM_SOH)
      // 새로 추가된 부분 끝 if (data_in == YMODEM_SOH)
      {
        p_packet->length = 128;
        p_packet->stx = data_in;
        p_packet->state = YMODEM_PACKET_WAIT_SEQ1;
      }
      if (data_in == YMODEM_STX)
      {
        p_packet->length = 1024;
        p_packet->stx = data_in;
        p_packet->state = YMODEM_PACKET_WAIT_SEQ1;
      }
      if (data_in == YMODEM_EOT)
      {
        p_packet->stx = data_in;
        ret = true;
      }
      if (data_in == YMODEM_CAN)
      {
        p_packet->stx = data_in;
        ret = true;
      }
      break;

    case YMODEM_PACKET_WAIT_SEQ1:
    
    ...
    
    
    ...
    
    ..
    
  }
}

 

 

기존 코드는 아래와 같은데 처음 데이터가 들어오면 stx에 YMODEM_SOH를 넣게 됩니다.

 

변경점을 보면 이미 위 코드에 의해 p_packet->stx가 YMODEM_SOH가 들어있기 때문에

새로 들어온 데이터도 YMODEM_SOH이면 아무 동작 안하도록 작성하였습니다.

 

이렇게 변경하니 멈추는 현상이 사라지고 다운로드가 잘 되었습니다.

 

 

 

 

감사합니다.

 

출처

stm32f103/ymodem.c at main · chcbaram/stm32f103 · GitHub

 

GitHub - chcbaram/stm32f103

Contribute to chcbaram/stm32f103 development by creating an account on GitHub.

github.com

[STM32 HAL] Flash Management + UART IAP 예제 : 네이버 블로그 (naver.com)

 

[STM32 HAL] Flash Management + UART IAP 예제

Reference: Mastering STM32 by Carmine Noviello ** 자료 해석에 오류가 있을 수 있습니다 ** [ 배...

blog.naver.com

 

반응형

+ Recent posts