Leonardo (32u4): Möglichkeiten, es programmatisch zu mauern

8

Ich glaube, als der Leonardo vorgestellt wurde, habe ich einige Artikel darüber gelesen, wie man vorsichtig ist, wenn man einige Dinge tut, die dazu führen könnten, dass keine neuen Skizzen mehr geladen werden. Daher muss man den Bootloader neu schreiben. Da ich Energiesparoptionen verwenden möchte, z. B. um nicht verwendete Hardwarekomponenten wie den USB-Anschluss zu deaktivieren, befürchte ich, etwas falsch zu machen.

Eine Leonardo-Delikatesse, die ich bisher gefunden habe:

  • Wenn Interrupts deaktiviert sind, schlägt das Hochladen neuer Skizzen fehl, es sei denn, man drückt die Reset-Taste, sobald die Arduino IDE "Uploading ..." anzeigt.

Welche Dinge (mit Ausnahme der üblichen hardwarebezogenen Überlegungen, wie das Anschließen von am Ausgang konfigurierten Pins an feste Potentiale) könnten den Controller beschädigen oder erfordern, den Leonardo mit einem neuen Bootloader neu zu flashen?

Thomas S.
quelle
Im Allgemeinen können Arduinos nur per Software gemauert werden, wenn sie nicht mit den Sicherungen auf dem Chip herumspielen (oder einen Roboter entwerfen, der das Board zerstört: D).
Anonymer Pinguin
1
Der Bootloader wird immer vor Ihrem eigenen Programm ausgeführt. Wenn Sie also die Reset-Taste drücken, wird der Bootloader gestartet und Sie können Ihr neues Programm hochladen, auch wenn Ihr altes Programm fehlerhaft war. Das Deaktivieren bestimmter Komponenten erfolgt nur vorübergehend und sollte beim Zurücksetzen des Geräts wiederhergestellt werden. Durch Ändern der Sicherungen können Sie bestimmte Optionen dauerhaft festlegen. Vermeiden Sie daher, diese zu ändern.
Gerben
2
Gerben, könnten Sie bitte Ihren Kommentar als Antwort hinzufügen?
Thomas S.

Antworten:

1

Wenn Sie ein Programm hochladen, das die Geschwindigkeit des USB-Kerns ändert, ist es fast blockiert. Was passieren würde ist folgendes:

  1. Einschalten, Bootloader startet, USB-Gerät auf dem PC aufgelistet.
  2. Ein paar Sekunden später Programmstart, USB-Kerngeschwindigkeit geändert, USB-Gerät verschwindet vom PC

Das Problem hierbei ist, dass Sie nicht nur auf Zurücksetzen auf Programm klicken müssen, sondern nach dem Zurücksetzen schnell den richtigen COM-Port auswählen und dann hochladen müssen, bevor das Programm gestartet wird.

Für das Redbearlab Blend Micro muss im Anwenderprogramm eine USB-Kerngeschwindigkeit eingestellt werden. In ihren Setup-Anweisungen gibt es einen Schritt, um die Arduino main.cpp zu bearbeiten und einen Abschnitt hinzuzufügen, um dies zu tun. Wenn dieser Schritt übersehen wird, tritt das obige Problem auf.

geometrisch
quelle
1

Ich habe es geschafft, einen ATMega128RFA1 zu mauern. Der Bootloader und die Software, die ich darin hochgeladen habe, funktionierten einwandfrei. Es war jedoch unmöglich, das ROM zu löschen / zu schreiben.

Nachdem ich überprüft hatte, was passiert ist, stellte ich im Datenblatt fest, dass einige Sicherungen im AVR-Kern das versehentliche Schreiben auf dem ROM schützen sollen. Eine Art Sicherheitssicherung.

Ich habe den Fehler, der in diesen Bytes geschrieben wurde, nie gefunden (da es ein wirklich großes Programm war und wir 3 Leute an der Codierung beteiligt waren), aber ja, wir haben nur eine Sicherung durchgebrannt und eine MCU wegen eines Fehlers verloren.

Was den Leonardo betrifft, könnten verschiedene Dinge passieren, aber keine davon kann Ihr Board ziegeln, es sei denn, Sie blasen eine dieser Schutzsicherungen durch.

CopperMaze
quelle
1

Mit wirklich cleverem Code ist es möglich, den Bootloader auszunutzen, um sich selbst zu überschreiben.

Auszug:

Die Lösung ist eigentlich konzeptionell ziemlich einfach. Ein Bootloader ist von Natur aus so konzipiert, dass er neue Firmware auf das Gerät herunterlädt. Daher enthält es mindestens einen SPM-Befehl. Da das SPM-Konfigurationsregister nicht mehr als 4 Zyklen vor dem SPM-Befehl geschrieben werden darf, bedeutet dies, dass praktisch nur sehr wenige Sequenzen auftreten: nur sts, spm oder out, spm-Sequenzen. Sie müssen also nur die Reihenfolge im Bootloader-Bereich finden. Richten Sie die richtigen Register ein und rufen Sie sie auf.

Es stellte sich jedoch heraus, dass auch damit ein großes Problem bestand. Die SPM-Anweisungen des selbstprogrammierenden V-USB-Bootloaders sind keine nette kleine Routine, sondern im Hauptcode enthalten. Ein Aufruf würde also nur zum Absturz des AVR führen, wenn versucht wird, den Rest des V-USB-Bootloaders auszuführen.

Böse, aber es gibt wieder eine Lösung. Mithilfe eines Timers, der mit der CPU-Frequenz getaktet ist (was für einen AVR einfach ist), können Sie im Assembler eine Routine erstellen, die die Register für die SPM-Sequenz out des Bootloaders einrichtet. ruft es auf und genau in dem Moment, in dem der erste Zyklus des SPM selbst ausgeführt wird, wird der Timer-Interrupt ausgelöst und der AVR sollte zu Ihrer Interrupt-Routine (im Anwendungsbereich) springen. Die Interrupt-Routine öffnet die Bootloader-Adresse und kehrt dann zum vorherigen Code zurück. Dies ist die Routine, die die out, spm-Sequenz einrichtet. Dies sollte funktionieren, da beim Anwenden von SPM-Anweisungen auf den Bootloader-Abschnitt die CPU angehalten wird, bis sie abgeschlossen ist.

Im Grunde genommen können Sie ausgefallene Programmierungen vornehmen und den Bootloader dazu bringen, sich selbst abzuspritzen, wodurch die MCU ohne einen speziellen Programmierer unbrauchbar wird.

Connor Wolf
quelle
0

Ich weiß, dass der Leonard wie eine USB-Maus wirkt, die überall klappt und zufällige Tasten eingibt, sodass Sie ihn nicht neu programmieren können, ohne einen Trick zu machen, um ihn zu umgehen. Aber sie erwähnen dies in den API-Dokumenten.

EternityForest
quelle