Cuando subo un nuevo boceto a mi Arduino Uno con el gestor de arranque Optiboot, ¿qué sucede realmente ?
- ¿Qué se envía al Arduino?
- ¿Cómo responde?
- ¿Qué significa "no sincronizado"?
- ¿Qué es "sincronizado" de todos modos?
Nota: Esto pretende ser una "pregunta de referencia" .
arduino-uno
bootloader
Nick Gammon
fuente
fuente
Respuestas:
Cuando reinicia un Uno que ejecuta el cargador Optiboot, el gestor de arranque primero parpadea el pin 13 tres veces.
La línea superior (gris) se envía al Arduino, la línea media (naranja) se envía desde el Arduino.
Mientras eso sucede, el programa que se
avrdude
ejecuta en su computadora envía una consulta al dispositivo:El Arduino no nota el primer "get sync" porque está ocupado parpadeando el pin 13. Una vez hecho esto, se da cuenta del "get sync" (sería protegido por el hardware en serie) y responde:
Parece que avrdude se impacientó un poco y se agotó el tiempo de espera, porque vuelve a intentarlo con la consulta "get sync". Esta vez Optiboot responde de inmediato.
El resto de la carga se describe en la siguiente imagen. Ejemplo producido cargando el programa "Blink" de stock.
(Haga clic en la imagen de arriba para una versión más grande)
Los pasos son:
Establecer parámetros del dispositivo. Los siguientes parámetros del dispositivo se envían al chip:
Optiboot ignora todo eso y responde con In Sync / OK. :)
Establecer parámetros extendidos del dispositivo:
Optiboot también los ignora y responde con In Sync / OK.
Ingrese al modo de programa. Respuesta: en sincronización / OK.
Leer firma. Optiboot responde
0x1E 0x95 0x0F
sin leer realmente la firma .Escribir fusibles (cuatro veces). Optiboot no escribe el fusible, solo responde In Sync / OK.
Dirección de carga (inicialmente 0x0000). La dirección está en palabras (es decir, una palabra tiene dos bytes). Esto establece la dirección donde se escribirá la siguiente página de datos.
Página del programa (se envían hasta 128 bytes). Optiboot responde "In Sync" de inmediato. Luego hay una pausa de aproximadamente 4 ms mientras se programa la página. Luego responde "OK".
Dirección de carga (ahora 0x0040). Esta es la dirección 64 en decimal, es decir. 128 bytes desde el inicio de la memoria del programa.
Se escribe otra página. Esta secuencia continúa hasta que se escriben todas las páginas.
Dirección de carga (de nuevo a 0x0000). Esto es para verificar la escritura.
Página de lectura (se leen hasta 128 bytes). Esto es para verificar. Tenga en cuenta que incluso si la verificación falla, los datos incorrectos ya se han escrito en el chip.
Salga del modo de programación.
¿Qué significa "no sincronizado"?
Como puede ver en lo anterior, en cada paso de la secuencia de programación se espera que el Arduino responda con "In Sync" (0x14), posiblemente seguido de algunos datos, seguido de "OK" (0x10).
Si está "no sincronizado", eso significa que avrdude no obtuvo la respuesta "sincronizado". Las posibles razones podrían ser:
¿Qué es "sincronizado"?
Como se mencionó anteriormente, la respuesta "En sincronización" significa que el Arduino (gestor de arranque) está sincronizado con el programa de carga.
¿Qué protocolo se está utilizando?
El protocolo es el protocolo STK500 según lo documentado por Atmel. Ver las referencias a continuación.
Referencias
Nota : La versión 2 de STK500 no se usa en Optiboot, pero se incluye para información en caso de que esté usando placas como Mega2560.
Constantes STK500
fuente
avrdude
arranque que admita el comportamiento de verificación predeterminado es un cargador de arranque que admite la lectura de los contenidos flash.