Apa yang terjadi ketika kode diunggah menggunakan bootloader?

13

Ketika saya mengunggah sketsa baru ke Arduino Uno saya menggunakan bootloader Optiboot, apa yang sebenarnya terjadi?

  • Apa yang dikirim ke Arduino?
  • Bagaimana tanggapannya?
  • Apa artinya "tidak sinkron"?
  • Apa itu "sinkron"?

Catatan: Ini dimaksudkan sebagai "pertanyaan referensi" .

Nick Gammon
sumber
posting yang sangat menarik! Hanya pertanyaan lagi. Perangkat lunak apa yang Anda gunakan untuk melacak komunikasi serial (gambar)?
julio
Ini adalah output dari Logic Analyzer, seperti Saleae Logic 8. saleae.com Analyzer kecil yang sangat bagus. Dulu laju sampel 24 MHz untuk ~ $ 125, 150. Kecepatan penangkapan saat ini adalah 100 dan 500 MHz. > SPI, I2C & lainnya> Sebagian besar komunikasi digital menggunakan protokol tertentu yang menentukan bagaimana informasi ditransfer. Perangkat lunak Logic memiliki penganalisa protokol yang dapat secara otomatis memecahkan kode SPI, I2C, serial, 1-Wire, CAN, UNI / O, I2S / PCM, Mode MP, Manchester, Modbus, DMX-512, Paralel, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - atau buat milik Anda sendiri
CrossRoads

Jawaban:

21

Saat Anda mengatur ulang Uno yang menjalankan loader Optiboot, bootloader pertama akan mem-flash pin 13 sebanyak tiga kali.

Pin 13 sedang di-flash

Baris atas (abu-abu) dikirim ke Arduino, garis tengah (oranye) dikirim dari Arduino.

Ketika itu terjadi, program yang avrdudeberjalan di komputer Anda mengirimkan kueri ke perangkat:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino tidak melihat "get sync" yang pertama karena sibuk mem-flash pin 13. Setelah selesai, pemberitahuan "get sync" (itu akan disangga oleh perangkat keras serial) dan menjawab:

STK_INSYNC / STK_OK (0x14/0x10)

Sepertinya avrdude menjadi sedikit tidak sabar, dan kehabisan waktu, karena ia mencoba lagi dengan permintaan "get sync". Kali ini Optiboot segera merespons.


Sisa dari pengunggahan dijelaskan pada gambar berikutnya. Contoh yang dihasilkan mengunggah program saham "Blink".

Proses unggah Optiboot

(Klik pada gambar di atas untuk versi yang lebih besar)


Langkah-langkahnya adalah:

  • Pertanyaan: Dapatkan Sinkronisasi? Jawab: Di Sinkronisasi.
  • Pertanyaan: Dapatkan parameter? (versi utama) Jawab: versi 4.
  • Pertanyaan: Dapatkan parameter? (versi minor) Jawab: versi 4.
  • Tetapkan parameter perangkat. Parameter perangkat berikut dikirim ke 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 mengabaikan semua itu dan membalas dengan In Sync / OK. :)

  • Tetapkan parameter perangkat yang diperluas:

    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 mengabaikan semua itu juga dan membalas dengan In Sync / OK.

  • Masuk ke mode program. Jawab: Di Sinkron / OK.

  • Baca tanda tangan. Optiboot membalas dengan 0x1E 0x95 0x0F tanpa benar-benar membaca tanda tangan .

  • Tulis sekering (empat kali). Optiboot tidak menulis sekring tetapi hanya membalas Dalam Sinkronisasi / OK.

  • Muat alamat (awalnya 0x0000). Alamatnya dalam kata-kata (mis. Sebuah kata adalah dua byte). Ini menetapkan alamat di mana halaman data selanjutnya akan ditulis.

  • Halaman program (hingga 128 byte dikirim). Optiboot segera membalas "In Sync". Lalu ada jeda sekitar 4 ms sementara sebenarnya memprogram halaman. Kemudian itu menjawab "OK".

  • Muat alamat (sekarang 0x0040). Ini adalah alamat 64 dalam desimal, yaitu. 128 byte dari awal memori program.

  • Halaman lain ditulis. Urutan ini berlanjut sampai semua halaman ditulis.

  • Muat alamat (kembali ke 0x0000). Ini untuk memverifikasi penulisan.

  • Baca halaman (hingga 128 byte dibaca). Ini untuk memverifikasi. Perhatikan bahwa meskipun verifikasi gagal, data buruk telah ditulis ke chip.

  • Tinggalkan mode pemrograman.


Apa artinya "tidak sinkron"?

Seperti yang Anda lihat dari atas, setiap langkah melalui urutan pemrograman yang diharapkan akan dijawab oleh Arduino dengan "In Sync" (0x14), mungkin diikuti oleh beberapa data, diikuti oleh "OK" (0x10).

Jika "tidak sinkron" itu berarti avrdude tidak mendapatkan respons "sinkron". Kemungkinan alasannya adalah:

  • Tingkat baud salah digunakan
  • Port serial salah dipilih dalam IDE
  • Jenis papan yang salah dipilih dalam IDE
  • Tidak ada bootloader yang diinstal
  • Bootloader salah diinstal
  • Board tidak dikonfigurasikan untuk menggunakan bootloader (di sekering)
  • Beberapa perangkat dicolokkan ke pin D0 dan D1 pada Arduino, mengganggu komunikasi serial
  • Chip antarmuka USB (ATmega16U2) tidak berfungsi dengan benar
  • Jam salah untuk papan tulis
  • Pengaturan sekering yang salah pada Atmega328P (mis. "Bagi jam dengan 8")
  • Board / chip rusak
  • Kabel USB rusak (beberapa kabel USB hanya memberikan daya, dan bukan untuk data, mis. Kabel murah untuk penggemar USB)

Apa itu "dalam sinkronisasi"?

Seperti disebutkan di atas, respons "Dalam sinkronisasi" berarti Arduino (bootloader) disinkronkan dengan program pengunggahan.


Protokol apa yang digunakan?

Protokol adalah protokol STK500 yang didokumentasikan oleh Atmel. Lihat referensi di bawah ini.


Referensi

Catatan : STK500 Versi 2 tidak digunakan dalam Optiboot, tetapi disertakan untuk informasi jika Anda menggunakan papan seperti Mega2560.


Konstanta 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'
Nick Gammon
sumber
2
AVR061: Protokol Komunikasi STK500
Ignacio Vazquez-Abrams
1
Poin bagus! Saya menambahkan beberapa referensi ke jawabannya. Terima kasih.
Nick Gammon
Perhatikan bahwa proses verifikasi yang dijelaskan di sini secara khusus menggunakan pembacaan halaman, yang berarti bahwa setiap bootloader yang mendukung avrdudeperilaku verifikasi default adalah bootloader yang mendukung pembacaan konten flash.
Chris Stratton
1
Instruksi program yang luas dan deskriptif dan analisis Optiboot / STK500 ini luar biasa mengagumkan. Terima kasih, Nick Gammon yang hebat!
David Refoua