AVR Fuse Bits
Die Fuse-Bits konfigurieren diverse HW-Features im Chip, z.B. welche Quelle für den Takt benutzt wird. Üblicherweise werden
sie direkt zu Beginn des Programmiervorgangs gesetzt. In den meisten AVR-Typen sind es 3 Bytes
mit den Bezeichungen LOW, HIGH und EXTENDED.
(Die Namen sind vermutlich der Chronologie der Weiterentwicklung geschuldet)
Wer in der ARDUINO-Umgebung programmiert, und dabei den eingebauten Bootloader benutzt, muss garnichts machen. Der Chip läuft dann immer mit
den voreingestellten Werten, die im allgemeinen sehr gut passen.
Für einen ATmega168, als Beispiel, gibt es für LOW, HIGH und EXTENDED die folgenden Optionen
(Quelle: "https://www.engbedded.com/fusecalc"):
Die Funktionen der einzelnen Bits variieren zwischen den Prozessortypen, ebenso die Positionen im Byte. Man kann daher nicht einfach
die Fuse-Byte-Werte von einem anderen Prozessor übernehmen.
Diese Calculatoren liefern als Ergebnis die passenden Byte-Werte die in die Programmiersequenz übernommen werden.
Die Beschreibungen in den Datenblättern sind zu Anfang sehr verwirrend. Die sicherste und bequemste Methode ist daher einen
der vielen "Fuse-Calculatoren" zu verwenden, in den Links weiter unten sind diverse Beispiele gelistet.
Und noch eine Eigenart die zu grosser Konfusion führen kann: Ein aktives Fuse-Bit hat den Wert "0", ein inaktives den Wert "1"! Auch deshalb
ist es sehr zu empfehlen einen Fuse-Calculator zu benutzen.
Für alle Fuse-Bits gilt das sie mit einem Chip-Erase auf ihre Default-Werte zurückgesetzt werden. Dabei wird ebenfalls das Flash
komplett gelöscht.
Aufpassen!
Einige Fuse-Bits sind mit grösster Vorsicht zu behandeln. Im Extremfall wird der Chip "gebricked" und kann nicht so einfach wieder
programmiert werden. Auf dieser Seite von Microchip, z.B., sind
die "gefährlichen" Fuses fett unterlegt. Einige Beispiele:
SPIEN
Das ISP-Interface abschalten. Ein entsprechender Programmieradapter wird folglich nicht mehr funktionieren.RSTDISBL
Den Reset-Eingang abschalten. Ziemlich übel weil viele Programmieradapter diesen zwingend benötigen.CKSELn
Diese Fuses definieren die Takt-Quelle. Ohne Takt arbeitet der Prozessor nicht, und auch nicht das Programmieren. Beispiel: ein externer Quarz ist als Takt-Quelle konfiguriert, aber nicht vorhanden.DWEN
Das Debug-Wire-Interface deaktivieren. Nicht ganz so schlimm, nur das Debuggen ist abgeschaltet.Um einen "gebricken" Chip zu retten benötigt man einen JTAG Adapter oder einen High-Voltage fähigen Programmer (z.B. STK600). Zudem müssen die notwendigen Ports/Beinchen aber auch zugänglich sein..
Falls nur eine falsche Takt-Quelle konfiguriert wurde kann man temporär einen externen Takt anlegen (mit einer Prüfspitze).
AVR Lock Bits
Die Lock-Bits sind eine besondere Sorte von Konfigurations-Bits. Mit ihnen kann man Speicherbereiche gegen Auslesen oder Überschreiben sichern. Dieser Schutz ist sofort aktiv. Die Lock-Bits dürfen deshalb erst ganz am Ende des Programmierens gesetzt werde, nachdem Flash und evtl. Eeprom beschrieben wurden.Lock-Bits können immer durch ein Chip-Erase zurückgesetzt werden, der Chip ist also nicht dauerhaft unbrauchbar. Bei einem Chip-Erase geht aber natürlich ebenfalls der komplette, alte Speicherinhalt verloren, was zum Sicherheitskonzept gehört.
Bei den Lock-Bits kann man 2 Settingsbereiche unterscheiden:
- LB-Bits: steuern die Zugriffsrechte für externe Programmer
- BLB-Bits: steuern die Zugriffsrechte für BOOTLOADER
Ohne Bootloader
Beim Arbeiten ohne Bootloader muss man nicht gross nachdenken und kann einfach beide LB-Bits setzen. Flash und Eeprom sind gegen Lesen und Schreiben gesichert. Die BLB-Bits bleiben ungenutzt und ungesetzt ("1").- LB1 = 0
- LB2 = 0
- BLB01 = 1
- BLB02 = 1
- BLB11 = 1
- BLB12 = 1
- resultierendes Lock-Byte = 0xFC (hex) = 0b11111100 (binär)
Mit Bootloader
Beim Arbeiten mit Bootloader wird es komplizierter. Denn der soll üblicherweise in der Lage sein das Flash neu zu beschreiben, aber eventuell gleichzeitig selbst gegen Überschreiben und Auslesen geschützt sein. Die BLB-Bits regeln dieses kreuzweise Verhalten.Zuerst aber zu den LB-Bits (Zugriff externer Programmer), die werden gesetzt wie im vorherigen Fall:
- LB1 = 0
- LB2 = 0
Vorschlag: Mode 1: keine Einschränkungen für den Bootloader. Er darf das Anwendungsprogramm lesen und auch neu programieren.
- BLB01 = 1
- BLB02 = 1
Vorschlag: Mode 3: kein Lesen/Schreiben des Bootloader-Bereichs erlaubt.
- BLB11 = 0
- BLB12 = 0
Alle Bits kombiniert:
- Resultierendes Lock-Byte: 0xCC (hex) = 0b11001100 (binär)
Man könnte die Betrachtungen noch auf die Spitze treiben für einen Bootloader der sich selbst updaten kann. Das ist aber ein Level für Spezialisten die sich besser auskennen als ich..
Noch eine Anmerkung zu den BLB-Bits.
Die Sperrung der Speicherbereiche wird durch Blockieren der SPM und/oder LPM Befehle im Prozessor erreicht.
- SPM = Store Program Memory, kann den gesamten Flash-Bereich beschreiben, aber nur aus dem Bootloader-Bereich heraus.
- LPM = Load Program Memory, kann Daten aus dem Flash lesen, Zugriff auf den Bootloader-Bereich wird aber gesperrt
Links
All you need to know about AVR fuses.
Eine nette und übersichtliche Zusammenfassung der Funktionen der einzelnen Fuse-Bits.
AVR Fuses (Microchip).
Eine weitere Zusammenfassung und Anleitung, direkt von Microchip.
noch eine.. .
noch eine ...
Engbedded Atmel AVR Fuse Calculator.
Ein schöner Fuse-Calculator.
AVR Fuse Calculator - Eleccelerator.
Ein weiterer guter Fuse-Calculator.
AVRDUDE, THE standard AVR programming tool.
AVRDUDE ist das am häufigsten benutzte Tool um AVR-Prozessoren zu programmieren. Leider existiert es nur als Kommandozeilen-Version.
Sehr effizient für Hardcore-Programmierer, aber eine Katastrophe für Anfänger.
AVRDUDESS, GUI for AVRDUDE.
Eine gut brauchbare GUI für AVRDUDE, für alle die Kommandozeilen nicht mögen.