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" .
arduino-uno
bootloader
Nick Gammon
la source
la source
Réponses:
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 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
avrdude
cours d'exécution sur votre ordinateur envoie une requête à l'appareil: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:
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".
(Cliquez sur l'image ci-dessus pour une version plus grande)
Les étapes sont les suivantes:
Définissez les paramètres de l'appareil. Les paramètres d'appareil suivants sont envoyés à la puce:
Optiboot ignore tout cela et répond avec In Sync / OK. :)
Définissez les paramètres étendus de l'appareil:
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:
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
la source
avrdude
le comportement de vérification par défaut est un chargeur de démarrage qui prend en charge la lecture du contenu flash.