Kiedy przesyłam nowy szkic do mojego Arduino Uno przy użyciu programu ładującego Optiboot, co tak naprawdę się dzieje?
- Co jest wysyłane do Arduino?
- Jak to reaguje?
- Co oznacza „niesynchronizowane”?
- Co to w ogóle jest „synchronizacja”?
Uwaga: To jest przeznaczone jako „pytanie referencyjne” .
arduino-uno
bootloader
Nick Gammon
źródło
źródło
Odpowiedzi:
Po zresetowaniu Uno z uruchomionym modułem ładującym Optiboot, moduł ładujący najpierw trzykrotnie mruga pin 13.
Górna linia (szara) jest wysyłana do Arduino, środkowa linia (pomarańczowa) jest wysyłana z Arduino.
Podczas gdy tak się dzieje, program
avrdude
działający na twoim komputerze wysyła zapytanie do urządzenia:Arduino nie zauważa pierwszego „zsynchronizuj”, ponieważ jest zajęty flashowaniem pinu 13. Po zakończeniu zauważa „zsynchronizuj” (będzie buforowany przez sprzęt szeregowy) i odpowiada:
Wygląda na to, że avrdude jest trochę niecierpliwy i przekroczył limit czasu, ponieważ próbuje ponownie z zapytaniem „get sync”. Tym razem Optiboot odpowiada natychmiast.
Reszta przesyłania jest opisana na następnym obrazie. Przykład wyprodukowano przesyłając program akcji „Blink”.
(Kliknij na obrazek powyżej, aby uzyskać większą wersję)
Kroki są następujące:
Ustaw parametry urządzenia. Do układu wysyłane są następujące parametry urządzenia:
Optiboot ignoruje to wszystko i odpowiada przy pomocy In Sync / OK. :)
Ustaw rozszerzone parametry urządzenia:
Optiboot również je ignoruje i odpowiada przy pomocy In Sync / OK.
Wejdź w tryb programu. Odpowiedz: w synchronizacji / OK.
Przeczytaj podpis. Optiboot odpowiada
0x1E 0x95 0x0F
bez faktycznego czytania podpisu .Napisz bezpieczniki (cztery razy). Optiboot nie zapisuje bezpiecznika, a jedynie odpowiada w synchronizacji / OK.
Załaduj adres (początkowo 0x0000). Adres jest słowny (tzn. Słowo ma dwa bajty). Ustawia adres, pod którym będzie zapisywana następna strona danych.
Strona programu (wysyłanych jest do 128 bajtów). Optiboot natychmiast odpowiada „w synchronizacji”. Następnie następuje przerwa około 4 ms, podczas której programuje stronę. Następnie odpowiada „OK”.
Załaduj adres (teraz 0x0040). Jest to adres 64 w systemie dziesiętnym, tj. 128 bajtów od początku pamięci programu.
Napisano kolejną stronę. Ta sekwencja trwa, dopóki wszystkie strony nie zostaną zapisane.
Załaduj adres (z powrotem do 0x0000). Służy to do weryfikacji zapisu.
Strona odczytu (odczytywanych jest do 128 bajtów). To jest do weryfikacji. Pamiętaj, że nawet jeśli weryfikacja się nie powiedzie, złe dane zostały już zapisane w układzie scalonym.
Wyjdź z trybu programowania.
Co oznacza „niezsynchronizowane”?
Jak widać z powyższego, na każdym etapie sekwencji programowania Arduino ma odpowiedzieć „In Sync” (0x14), ewentualnie po nim niektóre dane, a następnie „OK” (0x10).
Jeśli nie jest zsynchronizowany, oznacza to, że avrdude nie otrzymał odpowiedzi „zsynchronizowany”. Możliwe przyczyny to:
Co to jest „zsynchronizowany”?
Jak wspomniano powyżej, odpowiedź „W synchronizacji” oznacza, że Arduino (bootloader) jest zsynchronizowany z programem ładującym.
Jaki protokół jest używany?
Protokół jest protokołem STK500 udokumentowanym przez Atmel. Zobacz odnośniki poniżej.
Bibliografia
Uwaga : STK500 wersja 2 nie jest używany w Optiboot, ale jest dołączony do informacji w przypadku korzystania z płyt takich jak Mega2560.
Stałe STK500
źródło
avrdude
domyślne zachowanie weryfikujące to bootloader, który obsługuje odczyt zawartości flash.