Ich bin kein Elektronikexperte, verzeihen Sie mir also, wenn ich die Begriffe in meiner Frage falsch verwende oder wenn meine Frage Ungenauigkeiten und/oder Fehlinterpretationen darüber enthält, wie ein Leonardo-Board funktioniert. Korrekturen sind natürlich willkommen.
Ich versuche, einen sehr einfachen Chip-Flasher zu schreiben, der es bei einer HEX-Datei über seinen Bootloader auf einem Leonardo-Board flashen kann. Ich verstehe, dass der Arduino Leonardo einen ATmega32u4 verwendet und dass der Bootlaoder das AVR109-Protokoll verwendet .
Basierend auf diesen Informationen war ich in der Lage, einen Code zu schreiben, der Bytes auf dem Board flasht, aber einmal geflasht, funktioniert der Code nicht.
Mein Code sieht ungefähr so aus:
set memory address
Anweisung aus, gefolgt von einem write low byte
, gefolgt von einem write high byte
.write page
Anweisung.Es fällt mir schwer, herauszufinden, was ich falsch mache, weil ich mir bei keinem dieser Schritte sicher bin. Schritt 1 erzeugt Daten, die OK aussehen (da man hier und da einige bekannte Zeichenfolgen sehen kann):
... aber wenn ich meine Daten mit der gleichen HEX-Datei vergleiche, die von AVRdude geflasht und wieder vom Chip geladen wurde, sind die beiden sehr unterschiedlich .
Schritt #2 funktioniert (der Bootloader antwortet bei jedem Befehl mit einem 0xD-Byte, aber ich weiß nicht, ob ich das Richtige tue, indem ich das niedrige Byte vor dem hohen flashe .
Schritt Nr. 3 scheint auch gut zu funktionieren, aber ich bin mir nicht sicher, ob Speicherseiten effektiv 256 Byte groß sind (ich habe diese Zahl aus dem Datenblatt des Chips abgeleitet, Tabelle 28-11).
Ich bin jedem sehr dankbar, der meinen "Algorithmus" überprüfen und Feedback dazu geben könnte, was ich richtig oder falsch mache und wo häufige Fehlerquellen bei dieser Art von Anwendung liegen.
Ich habe dfu-programmer erfolgreich unter Linux (unter Verwendung eines "Bare-Bone" atmega32u2/atmega32u4) von der Befehlszeile aus verwendet. Es ist also sehr einfach, es in eine Makefile
.
Ein Zitat von dieser Website:
dfu-programmer-0.6.2.tar.gz enthält den Quellbaum für dieses Projekt. Laden Sie diese herunter, um sie auf einem Linux/Unix/Mac-System zu erstellen und zu installieren.
Sie sollten es also auf einem Mac erstellen können. Oder Sie schauen in den Quellcode.
Die AVR109-Dokumentation ist nicht sehr klar, aber zwischen der AVR109-Dokumentation und dem avrdude-Quellcode habe ich einen einfachen Java-Code geschrieben (mit jssc für seriell), um auf AVR-Geräten in den Flash zu schreiben. Der spezifische Code für die Kommunikation mit dem Gerät und das Lesen der .hex-Datei (nicht alle Funktionen von .hex-Dateien werden unterstützt) finden Sie hier . Ich habe es nicht gründlich getestet, aber es hat auf dem Gerät (BrainLink), mit dem ich es verwendet habe, korrekt geschrieben und gelesen.
ps In Bezug auf Ihre spezifischen Punkte benötigt AVR109 immer zuerst das High-Byte (sowohl für Adressen als auch für Blockgrößen). Außerdem ist die Adresse in Worten, nicht in Bytes, also muss die Byte-Adresse durch zwei geteilt werden. Und bevor Sie Flash schreiben, müssen Sie den Flash löschen.
Wenn Sie einen Chip-Flasher nur zum Programmieren herstellen, sollten Sie sofort damit aufhören. Atmel stellt ein Dienstprogramm namens FLIP bereit. Es flasht Hex-Dateien für Sie von direktem USB auf die Chips, sofern der Chip On-Chip-USB unterstützt, wie z. B. die ATmega##U#-Familie.
Sie können das gewünschte Programm in Atmel Studio schreiben, das Hex speichern, Atmel FlIP öffnen und das Hex flashen.
eingebettet.kyle
Mac
Chris Stratton
TMa