Was passiert, wenn Code mit dem Bootloader hochgeladen wird?

12

Was passiert wirklich , wenn ich mit dem Optiboot-Bootloader eine neue Skizze auf meinen Arduino Uno hochlade ?

  • Was wird an den Arduino gesendet?
  • Wie reagiert es?
  • Was bedeutet "nicht synchron"?
  • Was ist eigentlich "synchron"?

Hinweis: Dies ist als "Referenzfrage" gedacht .

Nick Gammon
quelle
sehr interessanter Beitrag! Nur noch eine Frage. Mit welcher Software verfolgen Sie die serielle Kommunikation (Bilder)?
Juli
Es ist die Ausgabe eines Logikanalysators wie Saleae Logic 8. saleae.com Sehr netter kleiner Analysator. Früher war die Abtastrate 24 MHz für 125, 150 US-Dollar. Die aktuellen Aufnahmegeschwindigkeiten liegen bei 100 und 500 MHz. > SPI, I2C & mehr> Die meisten digitalen Kommunikationssysteme verwenden ein bestimmtes Protokoll, das die Art und Weise festlegt, wie Informationen übertragen werden. Die Logic-Software verfügt über Protokollanalysatoren, die SPI-, I2C-, serielle, 1-Draht-, CAN-, UNI / O-, I2S / PCM-, MP-Modus-, Manchester-, Modbus-, DMX-512-, Parallel-, JTAG-, LIN-, Atmel-SWI-, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - oder erstellen Sie Ihre eigenen
CrossRoads

Antworten:

20

Wenn Sie einen Uno zurücksetzen, auf dem der Optiboot Loader ausgeführt wird, blinkt der Bootloader zuerst dreimal auf Pin 13.

Pin 13 blinkt

Die obere Linie (grau) wird an den Arduino gesendet , die mittlere Linie (orange) wird vom Arduino gesendet .

Währenddessen avrdudesendet das auf Ihrem Computer ausgeführte Programm eine Abfrage an das Gerät:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Das Arduino bemerkt das erste "Synchronisieren" nicht, weil es beschäftigt ist, Pin 13 zu blinken. Sobald es fertig ist, bemerkt es das "Synchronisieren" (es würde von der seriellen Hardware gepuffert werden) und antwortet:

STK_INSYNC / STK_OK (0x14/0x10)

Es sieht so aus, als ob avrdude etwas ungeduldig geworden ist und eine Zeitüberschreitung festgestellt hat, weil es es erneut mit der Abfrage "Synchronisierung abrufen" versucht. Diesmal reagiert Optiboot sofort.


Der Rest des Uploads wird im nächsten Bild beschrieben. Beispiel für das Hochladen des "Blink" -Programms.

Optiboot-Upload-Prozess

(Klicken Sie auf das Bild oben für eine größere Version)


Die Schritte sind:

  • Abfrage: Synchronisierung abrufen? Antwort: Synchron.
  • Abfrage: Parameter holen? (Hauptversion) Antwort: Version 4.
  • Abfrage: Parameter holen? (Nebenversion) Antwort: Version 4.
  • Geräteparameter einstellen. Die folgenden Geräteparameter werden an den Chip gesendet:

    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 ignoriert alle diese und antwortet mit In Sync / OK. :)

  • Festlegen erweiterter Geräteparameter:

    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 ignoriert auch alle diese und antwortet mit In Sync / OK.

  • Rufen Sie den Programm-Modus auf. Antwort: Synchron / OK.

  • Unterschrift lesen. Optiboot antwortet mit, 0x1E 0x95 0x0F ohne die Unterschrift tatsächlich zu lesen .

  • Schreiben Sie die Sicherungen (viermal). Optiboot schreibt die Sicherung nicht, sondern antwortet nur In Sync / OK.

  • Adresse laden (anfangs 0x0000). Die Adresse wird in Worten angegeben (dh ein Wort besteht aus zwei Bytes). Hiermit wird die Adresse festgelegt, für die die nächste Datenseite geschrieben wird.

  • Programmseite (bis zu 128 Bytes werden gesendet). Optiboot antwortet sofort mit "In Sync". Dann gibt es eine Pause von ungefähr 4 ms, während die Seite tatsächlich programmiert wird. Dann antwortet es mit "OK".

  • Adresse laden (jetzt 0x0040). Dies ist die dezimale Adresse 64, d. 128 Bytes vom Beginn des Programmspeichers.

  • Eine andere Seite ist geschrieben. Diese Sequenz wird fortgesetzt, bis alle Seiten geschrieben sind.

  • Adresse laden (zurück zu 0x0000). Dies dient zur Überprüfung des Schreibvorgangs.

  • Leseseite (bis zu 128 Bytes werden gelesen). Dies dient zur Überprüfung. Beachten Sie, dass selbst wenn die Überprüfung fehlschlägt, die fehlerhaften Daten bereits auf den Chip geschrieben wurden.

  • Programmiermodus verlassen.


Was bedeutet "nicht synchron"?

Wie Sie oben sehen können, wird erwartet, dass der Arduino bei jedem Schritt durch die Programmiersequenz mit "In Sync" (0x14) antwortet, möglicherweise gefolgt von einigen Daten, gefolgt von "OK" (0x10).

Wenn es "nicht synchronisiert" ist, bedeutet dies, dass avrdude nicht die "synchronisierte" Antwort erhalten hat. Mögliche Gründe könnten sein:

  • Falsche Baudrate verwendet
  • Falscher serieller Port in IDE ausgewählt
  • Falscher Board-Typ in IDE ausgewählt
  • Kein Bootloader installiert
  • Falscher Bootloader installiert
  • Karte nicht für die Verwendung des Bootloaders konfiguriert (in den Sicherungen)
  • Einige Geräte sind an die Pins D0 und D1 des Arduino angeschlossen und stören die serielle Kommunikation
  • Der USB-Schnittstellen-Chip (ATmega16U2) funktioniert nicht richtig
  • Falsche Uhr für die Tafel
  • Falsche Sicherungseinstellungen am Atmega328P (zB "Uhr durch 8 teilen")
  • Platine / Chip beschädigt
  • Fehlerhaftes USB-Kabel (einige USB-Kabel liefern nur Strom und sind nicht für Daten bestimmt, z. B. billige Kabel für USB-Fans)

Was ist "synchron"?

Wie oben erwähnt, bedeutet die Antwort "In Sync", dass der Arduino (Bootloader) mit dem Upload-Programm synchronisiert ist.


Welches Protokoll wird verwendet?

Das Protokoll ist das von Atmel dokumentierte STK500-Protokoll. Siehe die Referenzen unten.


Verweise

Hinweis : STK500 Version 2 wird in Optiboot nicht verwendet, ist jedoch zur Information enthalten, falls Sie Boards wie das Mega2560 verwenden.


STK500-Konstanten

/* 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
quelle
1
AVR061: STK500-Kommunikationsprotokoll
Ignacio Vazquez-Abrams,
1
Guter Punkt! Ich habe ein paar Verweise auf die Antwort hinzugefügt. Vielen Dank.
Nick Gammon
Beachten Sie, dass für den hier beschriebenen Überprüfungsprozess speziell ein Seitenlesevorgang verwendet wird. Dies bedeutet, dass jeder Bootloader, der avrdudedas standardmäßige Überprüfungsverhalten unterstützt , ein Bootloader ist, der das Auslesen des Flash-Inhalts unterstützt.
Chris Stratton
Diese ausführliche und beschreibende Programmanleitung und die Analyse von Optiboot / STK500 sind umwerfend beeindruckend. Vielen Dank, der tolle Nick Gammon!
David Refoua