Christians Webseite        << zurück        vor >>

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.

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"):
Atmel

Die Funktionen der einzelnen Bits variieren zwischen den Prozessortypen, ebenso die Positionen im Byte.
Atmel

Diese Calculatoren liefern als Ergebnis die passenden Byte-Werte die in die Programmiersequenz übernommen werden.
Atmel

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

Mit den Lock-Bits kann man Speicherbereiche gegen Auslesen oder Überschreiben sichern. Dieser Schutz ist sofort aktiv. Deshalb dürfen die Lock-Bits erst 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 der 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

Atmel

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)
Manche Programmer/Chips zeigen hier einen Pseudo-Fehler. Beim Zurücklesen des geschriebenen Lock-Bytes werden die ungenutzten Bits 6 und 7 nicht korrekt gelesen oder ausgegeben und der Vergleich führt zu einer Abweichung. Ignorieren.


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, die werden gesetzt wie im vorherigen Fall:
  • LB1 = 0
  • LB2 = 0
Die BLB0-Bits bestimmen die Einschränkungen für den Bootloader:
Vorschlag: Mode 1: keine Einschränkungen für den Bootloader. Er darf das Anwendungsprogramm lesen und auch neu programieren.
  • BLB01 = 1
  • BLB02 = 1
Die BLB1-Bits bestimmen die Einschränkungen für das "normale" Anwendungsprogramm:
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
Den LPM Befehl darf man nicht sperren falls das Anwendungsprogramm Daten aus dem Bootloaderbereich lesen können muss.

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.
Atmel