Optiboot 부트 로더를 사용하여 Arduino Uno에 새 스케치를 업로드하면 실제로 어떻게됩니까?
- Arduino로 무엇을 보냅니 까?
- 어떻게 반응합니까?
- "동기화되지 않음"이란 무엇입니까?
- 어쨌든 "동기화"란 무엇입니까?
참고 : 이것은 "참조 질문"을위한 것 입니다.
Optiboot 부트 로더를 사용하여 Arduino Uno에 새 스케치를 업로드하면 실제로 어떻게됩니까?
참고 : 이것은 "참조 질문"을위한 것 입니다.
답변:
Optiboot 로더를 실행중인 Uno를 재설정하면 부트 로더가 먼저 핀 13을 세 번 깜박입니다.
상단 라인 (회색)은 Arduino 로 전송 되고 중간 라인 (주황색)은 Arduino 에서 전송 됩니다 .
그 동안 avrdude
컴퓨터에서 실행중인 프로그램 이 장치에 쿼리를 보내고 있습니다.
STK_GET_SYNC / CRC_EOP (0x30/0x20)
Arduino는 번쩍이는 핀 13으로 바쁘기 때문에 첫 번째 "get sync"를 인식하지 못합니다. 완료되면 "get sync"(직렬 하드웨어에 의해 버퍼링 됨)를 확인하고 응답합니다.
STK_INSYNC / STK_OK (0x14/0x10)
"동기화 받기"쿼리로 다시 시도하기 때문에 avrdude가 약간 참을성이 없어서 시간이 초과 된 것 같습니다. 이번에는 Optiboot가 즉시 응답합니다.
나머지 업로드는 다음 이미지에 설명되어 있습니다. 스톡 "Blink"프로그램 업로드 예가 생성되었습니다.
(더 큰 버전을 보려면 위의 이미지를 클릭하십시오)
단계는 다음과 같습니다.
장치 매개 변수를 설정하십시오. 다음과 같은 장치 파라미터가 칩으로 전송됩니다.
0x42 // STK_SET_DEVICE
0x86 // device code
0x00 // revision
0x00 // progtype: “0” – Both Parallel/High-voltage and Serial mode
0x01 // parmode: “1” – Full parallel interface
0x01 // polling: “1” – Polling may be used
0x01 // selftimed: “1” – Self timed
0x01 // lockbytes: Number of Lock bytes.
0x03 // fusebytes: Number of Fuse bytes
0xFF // flashpollval1
0xFF // flashpollval2
0xFF // eeprompollval1
0xFF // eeprompollval2
0x00 // pagesizehigh
0x80 // pagesizelow
0x04 // eepromsizehigh
0x00 // eepromsizelow
0x00 // flashsize4
0x00 // flashsize3
0x80 // flashsize2
0x00 // flashsize1
0x20 // Sync_CRC_EOP
Optiboot 는 모든 것을 무시 하고 In Sync / OK로 응답합니다. :)
확장 장치 매개 변수를 설정하십시오.
0x45 // STK_SET_DEVICE_EXT
0x05 // commandsize: how many bytes follow
0x04 // eeprompagesize: EEPROM page size in bytes.
0xD7 // signalpagel:
0xC2 // signalbs2:
0x00 // ResetDisable: Defines whether a part has RSTDSBL Fuse
0x20 // Sync_CRC_EOP
Optiboot 는 모든 것을 무시 하고 In Sync / OK로 응답합니다.
프로그램 모드로 들어갑니다. 회신 : 동기화 / 확인
서명을 읽으십시오. Optiboot는 0x1E 0x95 0x0F
실제로 서명을 읽지 않고 응답 합니다 .
퓨즈를 작성하십시오 (4 회). Optiboot 는 퓨즈를 쓰지 않고 In Sync / OK에 응답합니다.
로드 주소 (처음에는 0x0000). 주소는 단어 단위입니다 (즉, 단어는 2 바이트입니다). 이것은 다음 페이지의 데이터가 기록 될 주소를 설정합니다.
프로그램 페이지 (최대 128 바이트 전송) Optiboot는 "In Sync"에 즉시 응답합니다. 그런 다음 실제로 페이지를 프로그래밍하는 동안 약 4ms의 일시 중지가 있습니다. 그런 다음 "확인"으로 응답합니다.
로드 주소 (현재 0x0040). 이 주소는 십진수 64입니다. 프로그램 메모리 시작에서 128 바이트
다른 페이지가 작성되었습니다. 이 순서는 모든 페이지가 작성 될 때까지 계속됩니다.
로드 주소 (0x0000으로 돌아 가기) 이것은 쓰기를 확인하기위한 것입니다.
읽기 페이지 (최대 128 바이트를 읽습니다). 확인 용입니다. 확인에 실패하더라도 불량 데이터는 이미 칩에 기록되었습니다.
프로그래밍 모드를 종료하십시오.
위에서 알 수 있듯이 Arduino는 프로그래밍 시퀀스의 모든 단계에서 "In Sync"(0x14)로 응답하고 일부 데이터와 "OK"(0x10)로 응답해야합니다.
"동기화되지 않은"경우 avrdude가 "동기화"응답을 얻지 못했음을 의미합니다. 가능한 이유는 다음과 같습니다.
위에서 언급했듯이 "동기화 중"이라는 응답은 Arduino (부트 로더)가 업로드 프로그램과 동기화되었음을 의미합니다.
이 프로토콜은 Atmel이 문서화 한 STK500 프로토콜입니다. 아래 참조를 참조하십시오.
참고 : STK500 버전 2는 Optiboot에서 사용되지 않지만 Mega2560과 같은 보드를 사용하는 경우 정보를 제공합니다.
/* STK500 constants list, from AVRDUDE */
#define STK_OK 0x10
#define STK_FAILED 0x11 // Not used
#define STK_UNKNOWN 0x12 // Not used
#define STK_NODEVICE 0x13 // Not used
#define STK_INSYNC 0x14 // ' '
#define STK_NOSYNC 0x15 // Not used
#define ADC_CHANNEL_ERROR 0x16 // Not used
#define ADC_MEASURE_OK 0x17 // Not used
#define PWM_CHANNEL_ERROR 0x18 // Not used
#define PWM_ADJUST_OK 0x19 // Not used
#define CRC_EOP 0x20 // 'SPACE'
#define STK_GET_SYNC 0x30 // '0'
#define STK_GET_SIGN_ON 0x31 // '1'
#define STK_SET_PARAMETER 0x40 // '@'
#define STK_GET_PARAMETER 0x41 // 'A'
#define STK_SET_DEVICE 0x42 // 'B'
#define STK_SET_DEVICE_EXT 0x45 // 'E'
#define STK_ENTER_PROGMODE 0x50 // 'P'
#define STK_LEAVE_PROGMODE 0x51 // 'Q'
#define STK_CHIP_ERASE 0x52 // 'R'
#define STK_CHECK_AUTOINC 0x53 // 'S'
#define STK_LOAD_ADDRESS 0x55 // 'U'
#define STK_UNIVERSAL 0x56 // 'V'
#define STK_PROG_FLASH 0x60 // '`'
#define STK_PROG_DATA 0x61 // 'a'
#define STK_PROG_FUSE 0x62 // 'b'
#define STK_PROG_LOCK 0x63 // 'c'
#define STK_PROG_PAGE 0x64 // 'd'
#define STK_PROG_FUSE_EXT 0x65 // 'e'
#define STK_READ_FLASH 0x70 // 'p'
#define STK_READ_DATA 0x71 // 'q'
#define STK_READ_FUSE 0x72 // 'r'
#define STK_READ_LOCK 0x73 // 's'
#define STK_READ_PAGE 0x74 // 't'
#define STK_READ_SIGN 0x75 // 'u'
#define STK_READ_OSCCAL 0x76 // 'v'
#define STK_READ_FUSE_EXT 0x77 // 'w'
#define STK_READ_OSCCAL_EXT 0x78 // 'x'
avrdude
기본 확인 동작을 지원하는 모든 부트 로더 는 플래시 내용 읽기를 지원하는 부트 로더입니다.