명령 처리 함수에서 공통으로 참조하는 주소가 있다:

if (*(uint8_t *)0x20000300 != 3) {
    return;
}

0x20000300이 상태 변수다.


상태값

의미
0IDLE
1WAIT_KEY
2CONNECTED
3WAIT_DATA
4PROGRAMMING
5VERIFY
6COMPLETE

상태 전이

IDLE ──0x30──> WAIT_KEY ──0x31──> CONNECTED
                                      │
                                     0x32
                                      ▼
                                 WAIT_DATA
                                      │
                                     0x33 (반복)
                                      ▼
                                PROGRAMMING
                                      │
                                     0x35
                                      ▼
                                   VERIFY
                                      │
                                     0x36
                                      ▼
                                  COMPLETE ──> Jump to App

타임아웃

void CheckTimeout(void) {
    if (g_tick - g_last_rx > 5000) {  // 5초
        g_iap_state = IDLE;
        g_timeout_flag = 1;
    }
}

5초 동안 명령 없으면 IDLE로 복귀.


다음 글에서 데이터 수신/Flash 쓰기 분석.

#16 - 데이터 프레임 처리