Que se passe-t-il lorsque le code est téléchargé à l'aide du chargeur de démarrage?

13

Lorsque je télécharge un nouveau croquis sur mon Arduino Uno à l'aide du chargeur de démarrage Optiboot, que se passe-t-il vraiment ?

  • Qu'est-ce qui est envoyé à l'Arduino?
  • Comment réagit-elle?
  • Que signifie «pas synchronisé»?
  • Qu'est-ce qui est "synchronisé" de toute façon?

Remarque: Il s'agit d'une "question de référence" .

Nick Gammon
la source
poste très intéressant! Encore une question. Quel logiciel utilisez-vous pour tracer la communication série (images)?
julio
C'est la sortie d'un analyseur logique, tel que Saleae Logic 8. saleae.com Très joli petit analyseur. Fréquence d'échantillonnage de 24 MHz pour ~ 125, 150 $. Les vitesses de capture actuelles sont de 100 et 500 MHz. > SPI, I2C et plus> La plupart des communications numériques utilisent un protocole particulier qui spécifie comment les informations sont transférées. Le logiciel Logic possède des analyseurs de protocole qui peuvent décoder automatiquement SPI, I2C, série, 1 fil, CAN, UNI / O, I2S / PCM, mode MP, Manchester, Modbus, DMX-512, parallèle, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - ou créez le vôtre
CrossRoads

Réponses:

21

Lorsque vous réinitialisez un Uno exécutant le chargeur Optiboot, le chargeur de démarrage clignote d'abord la broche 13 trois fois.

La broche 13 clignote

La ligne supérieure (grise) est envoyée à l'Arduino, la ligne médiane (orange) est envoyée par l'Arduino.

Pendant ce temps, le programme en avrdudecours d'exécution sur votre ordinateur envoie une requête à l'appareil:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

L'Arduino ne remarque pas le premier "get sync" car il est occupé à clignoter la broche 13. Une fois cela fait, il remarque le "get sync" (il serait tamponné par le matériel série) et répond:

STK_INSYNC / STK_OK (0x14/0x10)

Il semble que avrdude soit devenu un peu impatient et ait expiré, car il essaie à nouveau avec la requête "get sync". Cette fois, Optiboot répond immédiatement.


Le reste du téléchargement est décrit dans l'image suivante. Exemple produit lors du téléchargement du programme "Blink".

Processus de téléchargement d'Optiboot

(Cliquez sur l'image ci-dessus pour une version plus grande)


Les étapes sont les suivantes:

  • Requête: obtenir la synchronisation? Répondre: en synchronisation.
  • Requête: obtenir le paramètre? (version majeure) Réponse: version 4.
  • Requête: obtenir le paramètre? (version mineure) Réponse: version 4.
  • Définissez les paramètres de l'appareil. Les paramètres d'appareil suivants sont envoyés à la puce:

    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 ignore tout cela et répond avec In Sync / OK. :)

  • Définissez les paramètres étendus de l'appareil:

    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 ignore également tous ceux-ci et répond avec In Sync / OK.

  • Entrez en mode programme. Répondre: dans Sync / OK.

  • Lisez la signature. Optiboot répond 0x1E 0x95 0x0F sans lire réellement la signature .

  • Écrire des fusibles (quatre fois). Optiboot n'écrit pas le fusible mais répond simplement en synchronisation / OK.

  • Adresse de chargement (initialement 0x0000). L'adresse est en mots (c'est-à-dire qu'un mot fait deux octets). Cela définit l'adresse où la prochaine page de données sera écrite.

  • Page du programme (jusqu'à 128 octets sont envoyés). Optiboot répond immédiatement "In Sync". Ensuite, il y a une pause d'environ 4 ms pendant la programmation de la page. Il répond ensuite "OK".

  • Adresse de chargement (maintenant 0x0040). Il s'agit de l'adresse 64 en décimal, c'est-à-dire. 128 octets à partir du début de la mémoire du programme.

  • Une autre page est écrite. Cette séquence se poursuit jusqu'à ce que toutes les pages soient écrites.

  • Adresse de chargement (retour à 0x0000). C'est pour vérifier l'écriture.

  • Page de lecture (jusqu'à 128 octets sont lus). C'est pour vérifier. Notez que même si la vérification échoue, les mauvaises données ont déjà été écrites sur la puce.

  • Quittez le mode de programmation.


Que signifie «pas synchronisé»?

Comme vous pouvez le voir ci-dessus, à chaque étape de la séquence de programmation, l'Arduino devrait répondre avec "In Sync" (0x14), éventuellement suivi de quelques données, suivi de "OK" (0x10).

S'il est "non synchronisé", cela signifie que avrdude n'a pas obtenu la réponse "synchronisé". Les raisons possibles pourraient être:

  • Mauvais débit en bauds utilisé
  • Mauvais port série sélectionné dans IDE
  • Type de carte incorrect sélectionné dans IDE
  • Aucun chargeur de démarrage installé
  • Mauvais chargeur de démarrage installé
  • Carte non configurée pour utiliser le chargeur de démarrage (dans les fusibles)
  • Certains appareils branchés sur les broches D0 et D1 de l'Arduino, interférant avec les communications série
  • La puce d'interface USB (ATmega16U2) ne fonctionne pas correctement
  • Horloge incorrecte pour le tableau
  • Mauvais réglages de fusible sur l'Atmega328P (par exemple, "diviser l'horloge par 8")
  • Carte / puce endommagée
  • Câble USB défectueux (certains câbles USB fournissent uniquement de l'énergie et ne sont pas destinés aux données, par exemple des câbles bon marché pour les ventilateurs USB)

Qu'est-ce que "en synchronisation"?

Comme mentionné ci-dessus, la réponse "In sync" signifie que l'Arduino (bootloader) est synchronisé avec le programme de téléchargement.


Quel protocole est utilisé?

Le protocole est le protocole STK500 tel que documenté par Atmel. Voir les références ci-dessous.


Les références

Remarque : STK500 Version 2 n'est pas utilisé dans Optiboot, mais il est inclus pour information au cas où vous utilisez des cartes comme la Mega2560.


Constantes 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
la source
1
Bon point! J'ai ajouté quelques références à la réponse. Merci.
Nick Gammon
Notez que le processus de vérification décrit ici utilise spécifiquement une page lue, ce qui signifie que tout chargeur de démarrage prenant en charge avrdudele comportement de vérification par défaut est un chargeur de démarrage qui prend en charge la lecture du contenu flash.
Chris Stratton
1
Cette instruction de programme complète et descriptive et l'analyse d'Optiboot / STK500 sont incroyablement impressionnantes. Merci, le grand Nick Gammon!
David Refoua