부트 로더를 사용하여 코드를 업로드하면 어떻게됩니까?


13

Optiboot 부트 로더를 사용하여 Arduino Uno에 새 스케치를 업로드하면 실제로 어떻게됩니까?

  • Arduino로 무엇을 보냅니 까?
  • 어떻게 반응합니까?
  • "동기화되지 않음"이란 무엇입니까?
  • 어쨌든 "동기화"란 무엇입니까?

참고 : 이것은 "참조 질문"을위한 것 입니다.


매우 흥미로운 게시물! 더 질문이 있습니다. 직렬 통신 (이미지)을 추적하기 위해 어떤 소프트웨어를 사용하고 있습니까?
julio

Saleae Logic 8과 같은 로직 분석기의 출력입니다. saleae.com 아주 좋은 분석기. ~ $ 125, 150의 경우 24MHz 샘플링 속도였습니다. 현재 캡처 속도는 100 및 500MHz입니다. > SPI, I2C 등> 대부분의 디지털 통신은 정보 전송 방식을 지정하는 특정 프로토콜을 사용합니다. Logic 소프트웨어에는 SPI, I2C, 직렬, 1-Wire, CAN, UNI / O, I2S / PCM, MP 모드, 맨체스터, Modbus, DMX-512, 병렬, JTAG, LIN, Atmel SWI를 자동으로 디코딩 할 수있는 프로토콜 분석기가 있습니다. MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi – 또는 직접 만들기
CrossRoads

답변:


21

Optiboot 로더를 실행중인 Uno를 재설정하면 부트 로더가 먼저 핀 13을 세 번 깜박입니다.

핀 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"프로그램 업로드 예가 생성되었습니다.

Optiboot 업로드 프로세스

(더 큰 버전을 보려면 위의 이미지를 클릭하십시오)


단계는 다음과 같습니다.

  • 쿼리 : 동기화를 원하십니까? 답장 : 동기화 중.
  • 쿼리 : 매개 변수를 가져 오시겠습니까? (주요 버전) 회신 : 버전 4.
  • 쿼리 : 매개 변수를 가져 오시겠습니까? (부 버전) 응답 : 버전 4.
  • 장치 매개 변수를 설정하십시오. 다음과 같은 장치 파라미터가 칩으로 전송됩니다.

    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가 "동기화"응답을 얻지 못했음을 의미합니다. 가능한 이유는 다음과 같습니다.

  • 잘못된 전송 속도
  • IDE에서 잘못된 직렬 포트를 선택했습니다
  • IDE에서 잘못된 보드 유형을 선택했습니다
  • 부트 로더가 설치되지 않았습니다
  • 잘못된 부트 로더가 설치되었습니다
  • 부트 로더를 사용하도록 보드가 구성되지 않았습니다 (퓨즈에서)
  • 일부 장치는 Arduino의 핀 D0 및 D1에 꽂혀 직렬 통신을 방해합니다.
  • USB 인터페이스 칩 (ATmega16U2)이 제대로 작동하지 않습니다
  • 보드에 대한 잘못된 시계
  • Atmega328P의 잘못된 퓨즈 설정 (예 : "8로 시계 나누기")
  • 보드 / 칩 손상
  • USB 케이블 결함 (일부 USB 케이블은 전원 만 제공하며 데이터 용이 아님) (예 : USB 팬용 저렴한 케이블)

"동기화"란 무엇입니까?

위에서 언급했듯이 "동기화 중"이라는 응답은 Arduino (부트 로더)가 업로드 프로그램과 동기화되었음을 의미합니다.


어떤 프로토콜이 사용되고 있습니까?

이 프로토콜은 Atmel이 문서화 한 STK500 프로토콜입니다. 아래 참조를 참조하십시오.


참고 문헌

참고 : STK500 버전 2는 Optiboot에서 사용되지 않지만 Mega2560과 같은 보드를 사용하는 경우 정보를 제공합니다.


STK500 상수

/* 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'


1
좋은 지적! 답변에 몇 가지 참조를 추가했습니다. 감사.
Nick Gammon

여기에 설명 된 확인 프로세스는 특히 페이지 읽기를 사용합니다. 즉, avrdude기본 확인 동작을 지원하는 모든 부트 로더 는 플래시 내용 읽기를 지원하는 부트 로더입니다.
Chris Stratton

1
이 광범위하고 설명적인 프로그램 교육과 Optiboot / STK500의 분석은 놀랍도록 훌륭합니다. 위대한 Nick Gammon에게 감사합니다!
David Refoua
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.