안녕하세요.
부트로더에서 펌웨어 업데이트를 하기 위해 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
[STM32 HAL] Flash Management + UART IAP 예제 : 네이버 블로그 (naver.com)
반응형
'MCU > STM32:HAL' 카테고리의 다른 글
[STM32CubeProgrammer]UART Bootloader로 펌웨어 다운로드 하기 (2) | 2023.06.21 |
---|---|
[STM32][DSP] DSP 라이브러리 설정 (2) | 2022.06.17 |
[STM32F][HAL] CAN (0) | 2021.05.20 |
[HAL][STM32F]USART와 Queue (2) | 2021.03.24 |
[STM32F]FSMC와 LCD (0) | 2021.02.28 |
[STM32F]FSMC로 LCD(SSD1963) 제어하기 (2) | 2021.02.07 |
[STM32F][HAL] USART Interrupt (0) | 2020.12.23 |
[STM32F][HAL] DAC (Digital to Analog Converter) (0) | 2020.12.22 |