AVR-Bootloader
Alle neueren AVR Mikrocontroller der ATmega-Serie besitzen die Möglichkeit, einen so genannten Bootloader zu installieren. Dies ist ein Programm, welches in einem separaten Bereich des Flash-Speichers abgelegt ist
und als erstes nach einem Reset gestartet wird. Es ermöglicht die benutzerfreundliche Installation einer neuen Software ohne spezielle Programmierkabel und ohne Öffnen des Gerätes. Hier wird ein fertiger
Bootloader vorgestellt und am Beispiel des Anzeigemodul2 die Installation beschrieben.
Letzte Bearbeitung: 12.03.2006
Allgemeines
Ein Hinweis vorweg: Dies ist kein eigenständiges Projekt und die hier vorgestellte Software ist keine Entwicklung von mir. Dieser Bootloader wurde von
Pascal Stang geschrieben und stellt eine gute Ergänzung für andere Projekte dar.
Eine allgemein bekannte Tatsache ist, dass es keine fehlerfreie Software gibt und so ist es oft erforderlich, die Software eines Gerätes durch eine neue Version zu ersetzen. Dies trifft mehr oder weniger auch
für alle Geräte zu, die ich auf dieser Seite vorstelle. Leider ist so ein Software-Update nicht immer ganz einfach: Man muss das Gerät öffnen, um an die Programmierschnittstelle zu kommen und man
muss ein passendes Programmiergerät oder Kabel bereithalten.
Nun besitzen einige meiner Geräte, wie z.B. das Anzeigemodul2 oder das EPROM-Programmiergerät bereits eine Schnittstelle zum PC. Wäre es nicht praktisch, diese Schnittstelle auch zum Updaten der Software
zu benutzen? Diese Frage hat sich der Hersteller der Controller auch gestellt und bei allen aktuellen ATmegas ist eine Möglichkeit eingebaut, die allgemein als Bootloader bezeichnet wird.
Wie funktioniert das? Verwendet man den Controller im Auslieferungszustand, dann kann der gesamte Flash-Speicher für die Anwendungssoftware verwendet werden. Bei Verwendung eines Bootloaders wird der Anwendung ein
Teil des Flashspeichers (je nach Controllertyp und Einstellung zwischen 256 und 8192 Byte) entzogen und für den Bootloader reserviert. Weiterhin wird der Controller durch Setzen eines Fuse-Bits veranlasst, nach
einem Reset nicht mehr die normale Anwendung, sondern den Bootloader zu starten.
Bei einem Controller-Reset passiert nun folgendes: Das Programm im Bootloaderbereich wird gestartet. Dieses initialisiert die serielle Schnittstelle und wartet auf eine bestimmte Bedingung, z.B. eine festgelegte
Zeichenfolge an der Schnittstelle. Tritt diese Bedingung während einer angemessenen Wartezeit nicht ein, dann beendet sich der Bootloader und startet das normale Anwenderprogramm. Die normale Funktionalität
des Gerätes wird also nicht beeinträchtigt - es tritt allerdings eine kleine Startverzögerung im Bereich einiger Sekunden auf.
Wird die erwähnte Bedingung erfüllt, dann aktiviert der Bootloader die Updatefunktion. Dabei wird im Allgemeinen der Applikationsbereich gelöscht und alle über die serielle Schnittstelle empfangenen
Daten werden in den Applikationsbereich geschrieben.
Natürlich sind die Vorgänge beim Update viel komplizierter und weil es schon fertige und ausgereifte Software gibt, habe ich auf eine solche zurück gegriffen. Ich habe mich hier für den
Bootloader von Pascal Stang entschieden. Dieser ist ziemlich genial, weil er für die Kommunikation das Protokoll des Atmel
STK500 Entwicklungskits verwendet. Das STK500 benutzt eine normale serielle Schnittstelle mit 2 Leitungen (TXD/RXD), wobei auch eine virtuelle Schnittstelle über USB verwendet werden kann. Als Software kommt hier
das AVR-Studio von Atmel zum Einsatz, welches ein Modul für die Kommunikation mit dem STK500 enthält. Die Programmierung mit dem STK500 Protokoll geht übrigens wesentlich schneller als über die
ISP-Schnittstelle mittels PonyProg und es sind noch andere Dinge möglich, z.B. das Lesen und Schreiben von Fuse-Bits.
Installation des Bootloaders
Im Folgenden möchte ich die Installation des Bootloaders beim Anzeigemodul2 beschreiben. Falls das Anzeigemodul bereits in Betrieb ist, dann sollte zuerst die Konfiguration gesichert werden (Menü:
Konfiguration - Backup - Sichern), da bei der Installationsprozedur alle Speicher des Controllers gelöscht werden (die Daten in den externen Speichern bleiben natürlich erhalten).
Weiterhin wird das AVR-Studio 4 benötigt, welches von Atmel kostenlos bereitgestellt wird. Ich benutze dieses Programm zum
Entwickeln und Testen der Software meiner Projekte, an dieser Stelle werde ich jedoch nur auf das STK500 Modul eingehen, welches für die Kommunikation mit dem Bootloader verwendet wird.
Zunächst wird der Bootloader auf bewährte Art, z.B. mittels PonyProg und Programmieradapter (parallel oder seriell) in den Controller programmiert. Obwohl auf der Seite von
Pascal Stang eine große Auswahl fertiger Bootloader für verschiedene Controller und Taktfrequenzen angeboten wird,
ist leider keine passende Version für das Anzeigemodul2 dabei. Ich habe deshalb eine Version so modifiziert, dass sie mit der im Anzeigemodul2 verwendeten Taktfrequenz von 11,0592 MHz läuft:
bootloader-m128-11mhz.zip.
War die Programmierung erfolgreich, dann kommt nun der nächste Schritt. Es müssen einige Fuse-Bits geändert werden:
- BOOTSZ1=1 (unprogrammiert), BOOTSZ0=0 (programmiert) - Diese beiden Fuse-Bits setzen die Größe des Bootloaderbereiches auf 2kB
fest.
- BOOTRST=0 (programmiert) - Das Programmieren dieses Fuse-Bits setzt den Reset-Vektor auf den Bootloader. Ein Reset startet somit nicht mehr die Anwendersoftware, sondern den
Bootloader.
- BOOTLOCK12=1 (unprogrammiert), BOOTLOCK11=0 (programmiert) - Diese Einstellung bewirkt den Schutz des Bootloaderbereiches, d.h. der
Bootloader kann sich nicht selbst überschreiben.
So sieht die richtige Einstellung in PonyProg aus.
Damit sind alle Vorbereitungen am Anzeigemodul abgeschlossen. Das Programmierkabel wird wieder entfernt und PonyProg beendet.
Das Anzeigemodul macht jetzt einen toten Eindruck, aber das täuscht: Im Moment befindet sich nämlich nur der Bootloader im Flash-Speicher und dieser beginnt nun mit seiner Arbeit. Er versucht 3 Sekunden lang
eine Kommunikation mit dem STK500 Modul des AVR-Studios aufzunehmen. Da aber noch keine Verbindung besteht, gelingt dies nicht und es wird die Anwendungssoftware gestartet. In diesem Bereich befinden sich allerdings nur
leere Speicherzellen und so arbeitet der Controller diese beginnend ab Adresse 0x0000 nacheinander ab und erreicht schließlich wieder das Bootloader-Programm am Ende des Flash-Speichers - der Vorgang beginnt von
vorn.
Nun wollen wir den Bootloader aus dieser Endlosschleife befreien und ihm etwas zu tun geben. Dazu stellen wir eine normale Kabelverbindung zwischen Anzeigemodul und PC her, so als wollten wir Log-Daten auslesen. Diese
Verbindung kann sowohl über RS-232 als auch über USB erfolgen, wobei ich davon ausgehe, dass der FT232-Treiber bereits installiert ist und funktioniert (siehe dazu die Beschreibung des
Anzeigemoduls). Jetzt wird das AVR-Studio gestartet und in der Toolbar sind die folgenden 6 Symbole zu finden:
Hier wird auf das mit "Con" bezeichnete linke Symbol geklickt. Falls diese Symbole nicht vorhanden sind, dann kann man sie aktivieren, indem man mit der rechten Maustaste auf die Toolbar klickt und
"STK500" auswählt. Alternativ lässt sich die gewünschte Option auch über das Menü Tools - Program AVR - Connect... aufrufen. Danach sollte folgendes
Fenster erscheinen:
Hier wird auf der linken Seite STK500 or AVRISP und auf der rechten Seite die Schnittstelle ausgewählt, wo das Anzeigemodul angeschlossen ist. Bei meinem Anzeigemodul verwende ich eine
USB-Verbindung über die virtuelle COM4. Nun wird auf Connect geklickt und die Verbindung sollte hergestellt werden. Wenn man eine aktuelle Version des AVR-Studios verwendet, dann
erscheint zunächst folgendes Fenster:
Auch wenn das eine Warnmeldung darstellt, so ist es doch ein gutes Zeichen dafür, dass eine Verbindung hergestellt werden konnte. Dieses Fenster bemängelt, dass sich unser Bootloader als alte STK500 Version
meldet und empfiehlt ein Upgrade. Hier muss jedoch auf Abbrechen geklickt werden, denn ein Upgrade ist nicht möglich und würde eine falsche Software installieren. Es funktioniert
aber trotz der alten Versionsnummer fehlerfrei und als nächstes erscheint das STK500 Fenster:
Auf dem Bild sind bereits alle nötigen Einstellungen getätigt worden, nur Pfad und Dateiname der Hex-Datei im Bereich Flash muss natürlich noch angepasst werden. Im Bereich
EEPROM braucht nichts eingetragen zu werden, wir wollen hier nur den Flashspeicher neu programmieren.
Interessant ist das Feld ganz unten, hier kann man die Kommunikation zwischen dem AVR-Studio und dem STK500 (bzw. dem Bootloader) verfolgen. Sind alle Einstellungen in Ordnung, dann wird im Bereich
Flash auf Program geklickt und der Programmiervorgang wird gestartet. Leider sieht man keine Fortschrittsanzeige oder Erfolgsmeldungen, so dass man das
Kommunikationsfeld beobachten muss. Wenn alles geklappt hat, dann sieht das so aus wie im folgenden Bild und die Meldungen sind eigentlich selbsterklärend:
Damit ist die Programmierung abgeschlossen und das Anzeigemodul kann wieder in Betrieb genommen werden. Dazu schließen wir das STK500 Fenster und drücken die Reset-Taste am Anzeigemodul2. Auch jetzt versucht
der Bootloader wieder 3 Sekunden lang eine Verbindung aufzubauen und startet dann die Software des Anzeigemoduls. Hier muss jetzt nur noch über das Menü Konfiguration - Backup -
Laden/Neustart die gesicherte Konfiguration geladen werden und dann kann das Modul wieder seine normale Arbeit aufnehmen.
Update mittels Bootloader
Dieser Abschnitt beschreibt den Ablauf eines Software-Updates beim Anzeigemodul2, wenn der Bootloader bereits installiert ist. Diese Prozedur ist wesentlich einfacher als die im vorherigen Abschnitt beschriebene und es
wird jetzt kein Programmierkabel und auch kein PonyProg mehr benötigt.
Und noch eine gute Nachricht ist: das EEPROM des Controllers wird beim Update mittels Bootloader nicht gelöscht. Trotzdem sollte man zuerst die Konfiguration sichern (Menü: Konfiguration
- Backup - Sichern), falls doch mal etwas schief geht.
Die Update-Prozedur beginnt mit dem Herstellen einer Kabelverbindung über RS-232 oder USB zwischen PC und Anzeigemodul. Danach wird das AVR-Studio gestartet und die bereits bekannte Toolbar für das STK500
kommt wieder zum Einsatz:
Das STK500 Modul speichert die letzte Einstellung und falls keine Veränderungen vorgenommen worden sind, dann kann man das Verbindungsmenü überspringen und das STK500 Modul direkt starten. Dies erfolgt
über das mit "AVR" bezeichnete Symbol. Allerdings ist jetzt etwas Schnelligkeit gefragt, denn es muss jetzt ziemlich kurz nacheinander folgendes getan werden:
- Die Reset-Taste am Anzeigemodul drücken
- Innerhalb von 3 Sekunden auf das "AVR" Symbol des STK500 Moduls klicken
War die Aktion erfolgreich, dann erscheint wieder das folgende Fenster. Falls nicht, dann wird sich vermutlich wieder das Verbindungsfenster des STK500 öffnen. Hier sollte man die Einstellungen kontrollieren und
nochmals einen Verbindungsaufbau versuchen, wobei man nach dem Reset am Anzeigemodul innerhalb von 3 Sekunden auf Connect klicken muss.
Hier wird wieder auf Abbrechen geklickt und es erscheint das STK500 Fenster:
Auch hier sollten alle Einstellungen vom letzten Start erhalten geblieben sein. In diesem Fall braucht man nur die neue Hex-Datei im Bereich Flash auszuwählen, im
EEPROM Bereich kann das Feld wieder leer bleiben. Sind alle Einstellungen korrekt, dann wird im Bereich Flash auf Program geklickt
und der Programmiervorgang wird gestartet.
Das Kommunikationsfeld sollte wieder so aussehen wie hier:
Damit ist die Programmierung abgeschlossen. Wir schließen das STK500 Fenster und drücken auf die Reset-Taste des Anzeigemoduls. Nach etwa 3 Sekunden startet das Anzeigemodul mit der neuen Software und da der
Inhalt des EEPROM erhalten geblieben ist, beginnt das Modul sofort wieder mit der Arbeit. Die Update-Prozedur ist damit abgeschlossen.
Weitere Projekte mit Bootloader
Prinzipiell kann auch das EPROM Programmiergerät mit einem Bootloader ausgestattet werden. Hier besteht aber das Problem, dass das das Anwendungsprogramm bereits so groß ist, dass der Platz nicht mehr
für den Bootloader reicht.
Alle anderen Projekte eignen sich nicht für die Installation eines Bootloaders, weil entweder keine serielle Schnittstelle vorhanden ist, z.B. bei allen Uhren, dem Gong und dem Fahrtregler oder aber die
Schnittstelle unvollständig ist, wie z.B. beim Sensormodul und Anzeigemodul1. Bei zukünftigen Projekten werde ich aber versuchen, die Möglichkeit eines Bootloaders einzuplanen.
Allgemeines -
Projekt-Überblick -
Links, Software -
Neuigkeiten -
"Klassiker" -
Galerie -
Impressum
AVR-Programmierung -
AVR-Bootloader -
Multifunktionsuhr -
Tischuhr -
Wohnraumuhr -
Wecker -
Zahnputzuhr -
BigBen-Türgong -
Fahrtregler -
EPROM-Programmiergerät -
Temperaturmesssystem -
USB-RS232 Interface -
Kleine Projekte