Điều gì xảy ra khi mã được tải lên bằng bộ tải khởi động?


12

Khi tôi tải một bản phác thảo mới lên Arduino Uno của mình bằng bộ tải khởi động Optiboot, điều gì thực sự xảy ra?

  • Những gì được gửi đến Arduino?
  • Nó phản ứng thế nào?
  • "Không đồng bộ nghĩa là gì"?
  • "Đồng bộ" là gì?

Lưu ý: Đây là một "câu hỏi tham khảo" .


bài viết rất thú vị! Chỉ là một câu hỏi nữa. Phần mềm nào bạn đang sử dụng để theo dõi giao tiếp nối tiếp (hình ảnh)?
julio

Nó là đầu ra của Bộ phân tích logic, chẳng hạn như Saleae Logic 8. saleae.com Máy phân tích nhỏ rất đẹp. Được sử dụng là tốc độ mẫu 24 MHz cho ~ $ 125, 150. Tốc độ chụp hiện tại là 100 và 500 MHz. > SPI, I2C và hơn thế nữa> Hầu hết giao tiếp kỹ thuật số sử dụng một giao thức cụ thể chỉ định cách truyền thông tin. Phần mềm Logic có các bộ phân tích giao thức có thể tự động giải mã SPI, I2C, nối tiếp, 1-Dây, CAN, UNI / O, I2S / PCM, MP Mode, Manchester, Modbus, DMX-512, Parallel, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - hoặc tạo của riêng bạn
CrossRoads

Câu trả lời:


20

Khi bạn đặt lại Uno đang chạy bộ tải Optiboot, bộ tải khởi động trước tiên sẽ nhấp nháy pin 13 lần.

Pin 13 được flash

Dòng trên cùng (màu xám) được gửi đến Arduino, dòng giữa (màu cam) được gửi từ Arduino.

Trong khi điều đó đang xảy ra, chương trình avrdudeđang chạy trên máy tính của bạn đang gửi một truy vấn đến thiết bị:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino không chú ý đến "get sync" đầu tiên bởi vì nó đang bận nhấp nháy pin 13. Sau khi hoàn thành, nó sẽ thông báo "get sync" (nó sẽ được đệm bởi phần cứng nối tiếp) và trả lời:

STK_INSYNC / STK_OK (0x14/0x10)

Có vẻ như avrdude có một chút thiếu kiên nhẫn và hết thời gian, bởi vì nó thử lại với truy vấn "get sync". Lần này Optiboot trả lời ngay lập tức.


Phần còn lại của việc tải lên được mô tả trong hình ảnh tiếp theo. Ví dụ sản xuất tải lên chương trình chứng khoán "Blink".

Quá trình tải lên Optiboot

(Nhấp vào hình trên để xem ảnh lớn hơn)


Các bước là:

  • Truy vấn: Nhận đồng bộ hóa? Trả lời: Trong Đồng bộ hóa.
  • Truy vấn: Nhận tham số? (phiên bản chính) Trả lời: phiên bản 4.
  • Truy vấn: Nhận tham số? (phiên bản nhỏ) Trả lời: phiên bản 4.
  • Đặt tham số thiết bị. Các thông số thiết bị sau đây được gửi đến chip:

    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 bỏ qua tất cả những điều đó và trả lời bằng In Sync / OK. :)

  • Đặt tham số thiết bị mở rộng:

    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 cũng bỏ qua tất cả những thứ đó và trả lời bằng In Sync / OK.

  • Vào chế độ chương trình. Trả lời: Trong Sync / OK.

  • Đọc chữ ký. Optiboot trả lời 0x1E 0x95 0x0F mà không thực sự đọc chữ ký .

  • Viết cầu chì (bốn lần). Optiboot không viết cầu chì mà chỉ trả lời trong Sync / OK.

  • Tải địa chỉ (ban đầu 0x0000). Địa chỉ bằng chữ (nghĩa là một từ có hai byte). Điều này đặt địa chỉ cho nơi trang dữ liệu tiếp theo sẽ được viết.

  • Trang chương trình (tối đa 128 byte được gửi). Optiboot trả lời "Đồng bộ hóa" ngay lập tức. Sau đó, có một khoảng dừng khoảng 4 ms trong khi nó thực sự lập trình trang. Sau đó, nó trả lời "OK".

  • Tải địa chỉ (hiện 0x0040). Đây là địa chỉ 64 trong số thập phân, tức là. 128 byte từ khi bắt đầu bộ nhớ chương trình.

  • Một trang khác được viết. Trình tự này tiếp tục cho đến khi tất cả các trang được viết.

  • Tải địa chỉ (trở về 0x0000). Điều này là để xác minh viết.

  • Trang đọc (tối đa 128 byte được đọc). Đây là để xác minh. Lưu ý rằng ngay cả khi xác minh thất bại, dữ liệu xấu đã được ghi vào chip.

  • Để chế độ lập trình.


"Không đồng bộ" nghĩa là gì?

Như bạn có thể thấy ở trên, mỗi bước trong chuỗi lập trình, Arduino dự kiến ​​sẽ trả lời bằng "In Sync" (0x14), có thể theo sau là một số dữ liệu, theo sau là "OK" (0x10).

Nếu đó là "không đồng bộ", điều đó có nghĩa là avrdude không nhận được phản hồi "đồng bộ hóa". Lý do có thể là:

  • Tốc độ truyền sai được sử dụng
  • Cổng nối tiếp sai được chọn trong IDE
  • Loại bảng sai được chọn trong IDE
  • Không có bộ tải khởi động được cài đặt
  • Cài đặt bộ tải khởi động sai
  • Board không được cấu hình để sử dụng bộ tải khởi động (trong cầu chì)
  • Một số thiết bị cắm vào chân D0 và D1 trên Arduino, gây trở ngại cho các giao tiếp nối tiếp
  • Chip giao diện USB (ATmega16U2) không hoạt động đúng
  • Đồng hồ sai cho bảng
  • Cài đặt cầu chì sai trên Atmega328P (ví dụ: "chia đồng hồ cho 8")
  • Bảng mạch / chip bị hỏng
  • Cáp USB bị lỗi (một số cáp USB chỉ cung cấp năng lượng và không dành cho dữ liệu, ví dụ: cáp giá rẻ cho quạt USB)

"Đồng bộ" là gì?

Như đã đề cập ở trên, phản hồi "Đồng bộ hóa" có nghĩa là Arduino (bộ nạp khởi động) được đồng bộ hóa với chương trình tải lên.


Giao thức nào đang được sử dụng?

Giao thức là giao thức STK500 như tài liệu của Atmel. Xem các tài liệu tham khảo dưới đây.


Người giới thiệu

Lưu ý : STK500 Phiên bản 2 không được sử dụng trong Optiboot, nhưng nó được bao gồm để biết thông tin trong trường hợp bạn đang sử dụng các bảng như Mega2560.


Hằng số 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
Điểm tốt! Tôi đã thêm một vài tài liệu tham khảo cho câu trả lời. Cảm ơn.
Nick Gammon

Lưu ý rằng quy trình xác minh được mô tả ở đây sử dụng cụ thể một trang đọc, điều đó có nghĩa là bất kỳ avrdudehành vi xác minh mặc định nào của bộ tải khởi động hỗ trợ là bộ tải khởi động hỗ trợ đọc nội dung flash.
Chris Stratton

Hướng dẫn chương trình mở rộng và mô tả này và phân tích Optiboot / STK500 là cực kỳ tuyệt vời. Cảm ơn bạn, Nick Gammon tuyệt vời!
David Refoua
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.