Cosa succede quando il codice viene caricato utilizzando il bootloader?


13

Quando carico un nuovo schizzo sul mio Arduino Uno usando il bootloader Optiboot, cosa succede davvero ?

  • Cosa viene inviato ad Arduino?
  • Come risponde?
  • Che cosa significa "non sincronizzato"?
  • Che cos'è "sincronizzato" comunque?

Nota: questa è intesa come una "domanda di riferimento" .


post molto interessante! Solo un'altra domanda. Quale software stai usando per tracciare la comunicazione seriale (immagini)?
luglio

È l'output di un analizzatore logico, come Saleae Logic 8. saleae.com Piccolo analizzatore molto carino. Utilizzato per una frequenza di campionamento di 24 MHz per ~ $ 125, 150. Le velocità di acquisizione correnti sono 100 e 500 MHz. > SPI, I2C e altro> La maggior parte delle comunicazioni digitali utilizza un protocollo particolare che specifica come vengono trasferite le informazioni. Il software Logic ha analizzatori di protocollo in grado di decodificare automaticamente SPI, I2C, seriale, 1-Wire, CAN, UNI / O, I2S / PCM, modalità MP, Manchester, Modbus, DMX-512, Parallel, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - o crea il tuo
CrossRoads

Risposte:


21

Quando si reimposta uno Uno che esegue il caricatore Optiboot, il bootloader prima fa lampeggiare il pin 13 tre volte.

Pin 13 lampeggiato

La linea superiore (grigia) viene inviata ad Arduino, la linea centrale (arancione) viene inviata da Arduino.

Mentre ciò accade, il programma in avrdudeesecuzione sul tuo computer sta inviando una query al dispositivo:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino non nota il primo "get sync" perché è occupato a lampeggiare il pin 13. Una volta fatto, nota "get sync" (sarebbe bufferizzato dall'hardware seriale) e risponde:

STK_INSYNC / STK_OK (0x14/0x10)

Sembra che avrdude sia diventato un po 'impaziente e sia scaduto, perché riprova con la query "get sync". Questa volta Optiboot risponde immediatamente.


Il resto del caricamento è descritto nell'immagine successiva. Esempio prodotto caricando il programma "Blink" di serie.

Processo di caricamento di Optiboot

(Clicca sull'immagine qui sopra per una versione più grande)


I passaggi sono:

  • Query: ottenere la sincronizzazione? Rispondi: In sincronizzazione.
  • Query: ottieni il parametro? (versione principale) Risposta: versione 4.
  • Query: ottieni il parametro? (versione secondaria) Risposta: versione 4.
  • Imposta i parametri del dispositivo. I seguenti parametri del dispositivo vengono inviati al 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 ignora tutti questi e risponde con In Sync / OK. :)

  • Imposta parametri estesi del dispositivo:

    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 ignora anche tutti quelli e risponde con In Sync / OK.

  • Entra nella modalità programma. Rispondi: In sincronizzazione / OK.

  • Leggi la firma. Optiboot risponde con 0x1E 0x95 0x0F senza effettivamente leggere la firma .

  • Scrivi i fusibili (quattro volte). Optiboot non scrive il fusibile ma risponde solo in Sincronizzazione / OK.

  • Indirizzo di caricamento (inizialmente 0x0000). L'indirizzo è in parole (cioè una parola è di due byte). Questo imposta l'indirizzo per il quale verrà scritta la pagina successiva di dati.

  • Pagina del programma (vengono inviati fino a 128 byte). Optiboot risponde immediatamente "In Sync". Quindi c'è una pausa di circa 4 ms mentre in realtà programma la pagina. Quindi risponde "OK".

  • Carica indirizzo (ora 0x0040). Questo è l'indirizzo 64 in decimale, cioè. 128 byte dall'inizio della memoria del programma.

  • Un'altra pagina è scritta. Questa sequenza continua fino a quando tutte le pagine sono state scritte.

  • Carica indirizzo (torna a 0x0000). Questo serve per verificare la scrittura.

  • Pagina di lettura (vengono letti fino a 128 byte). Questo è per la verifica. Si noti che anche se la verifica fallisce, i dati errati sono già stati scritti nel chip.

  • Lascia la modalità di programmazione.


Che cosa significa "non sincronizzato"?

Come puoi vedere da quanto sopra, ad ogni passaggio della sequenza di programmazione Arduino dovrebbe rispondere con "In Sync" (0x14), eventualmente seguito da alcuni dati, seguito da "OK" (0x10).

Se è "non sincronizzato" significa che avrdude non ha ottenuto la risposta "sincronizzata". Le possibili ragioni potrebbero essere:

  • Baud rate utilizzato errato
  • Porta seriale errata selezionata in IDE
  • Tipo di scheda errato selezionato in IDE
  • Nessun bootloader installato
  • Bootloader errato installato
  • Scheda non configurata per l'utilizzo del bootloader (nei fusibili)
  • Alcuni dispositivi sono stati collegati ai pin D0 e D1 sull'Arduino, interferendo con le comunicazioni seriali
  • Il chip di interfaccia USB (ATmega16U2) non funziona correttamente
  • Orologio sbagliato per la scheda
  • Impostazioni dei fusibili errate su Atmega328P (ad es. "Divide clock per 8")
  • Scheda / chip danneggiato
  • Cavo USB difettoso (alcuni cavi USB forniscono solo alimentazione e non sono per dati, ad es. Cavi economici per ventole USB)

Che cos'è "sincronizzato"?

Come accennato in precedenza, la risposta "In sync" significa che Arduino (bootloader) è sincronizzato con il programma di caricamento.


Quale protocollo viene utilizzato?

Il protocollo è il protocollo STK500 come documentato da Atmel. Vedi i riferimenti sotto.


Riferimenti

Nota : STK500 versione 2 non viene utilizzata in Optiboot, ma è inclusa per informazioni nel caso in cui si utilizzino schede come Mega2560.


Costanti 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'


1
Buon punto! Ho aggiunto alcuni riferimenti alla risposta. Grazie.
Nick Gammon

Si noti che il processo di verifica descritto qui utilizza specificamente una lettura di pagina, il che significa che qualsiasi bootloader che supporta avrdudeil comportamento di verifica predefinito è un bootloader che supporta la lettura dei contenuti flash.
Chris Stratton,

1
Questa istruzione di programma estesa e descrittiva e l'analisi di Optiboot / STK500 sono incredibilmente impressionanti. Grazie, il grande Nick Gammon!
David Refoua,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.