Frage:
Ist es möglich, den NXP LPC2100-Mikrocontroller vom Code zurückzusetzen?
Bogi
2010-07-12 15:48:56 UTC
view on stackexchange narkive permalink

Ich bin neugierig? Ein Watchdog-Timer könnte dies tun, aber ich würde es gerne manuell tun.

Drei antworten:
#1
+6
akohlsmith
2010-07-16 10:48:16 UTC
view on stackexchange narkive permalink

reemrevnivek hat die richtige Idee, aber es gibt einen besseren Weg.

  WDTC = 1024; // kurze Zeitüberschreitung; es ist uns egal (wird es nicht benutzen) WDMOD = WDEN | WDRESET; // Watchdog setzt CPUWDFEED = 0xAA zurück; // start ... WDFEED = 0x55; // ... watchdog.WDFEED = 0xAA; // start ... WDFEED = 0x00; // ... eine ungültige WDFEED-Sequenz führt zu einem sofortigen Zurücksetzen.  

Dadurch können Sie sofort zurücksetzen, ohne warten zu müssen.

Beachten Sie, dass Sie einfach zu Position 0 springen ist nicht dasselbe wie ein echter Reset. Wenn Sie auf 0 springen, werden weder Peripheriegeräte noch der Status des ARM-Kerns zurückgesetzt. Es mag so klingen, als würde ich hier nicht picken, aber Sie können auf einige sehr ungewöhnliche und schwer zu debuggende Probleme stoßen, wenn Sie einen Reset erwarten und keinen bekommen.

#2
+5
Toby Jaffey
2010-07-12 17:44:13 UTC
view on stackexchange narkive permalink

Nach einem kurzen Blick auf das Datenblatt glaube ich, dass der Watchdog die einzige Möglichkeit ist, unter Softwaresteuerung zurückgesetzt zu werden.

Das Zurücksetzen hat zwei Quellen auf dem LPC2101 / 02/03: das RST Pin und Watchdog zurückgesetzt. Der RST-Pin ist ein Schmitt-Trigger-Eingangspin mit einem zusätzlichen Störfilter. Die Bestätigung des Chip-Resets durch eine beliebige Quelle startet den Weck-Timer (siehe Beschreibung des Weck-Timers unten), wodurch der interne Chip-Reset aktiviert bleibt, bis der externe Reset deaktiviert wird, der Oszillator läuft, eine feste Anzahl von Takten bestanden haben und der On-Chip-Flash-Controller seine Initialisierung abgeschlossen hat.

Um einen Software-Reset durchzuführen, starten Sie den Watchdog mit einem kleinen Timeout-Wert und gehen Sie dann in eine Endlosschleife.

Genau das habe ich vor ein paar Jahren auf der LPC2148 gemacht, die wie ein Zauber funktioniert hat.
Es könnte möglich sein, eine andere Art von Selbstmord-Reset mit externer Logik zu arrangieren, aber wenn Sie bereits einen WD haben. Stellen Sie nur sicher, dass Sie wissen, wie er sich verhält, wenn er aus dem WDR zurückkommt, damit Sie nicht zurückgesetzt werden Schleife oder so.
Ja, der Watchdog ist so, wie ich es auch mit einer LPC2148-Anwendung gemacht habe.
Der Watchdog-Timer hier ist falsch beschriftet. Die ARM-Dokumentation sowie die Atmel- und TI / Stellaris-Implementierungen des ARM7TDMI (für den Anfang) bezeichnen diesen Interrupt als Zurücksetzen und nicht als 'Watchdog' wie NXP. Verwenden Sie es wie einen Reset-Interrupt.
#3
+3
Kevin Vermeer
2010-07-12 23:28:26 UTC
view on stackexchange narkive permalink

Führen Sie keine Interrupts aus, indem Sie die Timer mit einem kleinen Wert starten - Schreiben Sie direkt in das Interrupt-Flag! Leons Beitrag möchte, dass Sie den Interrupt ausführen, wie im Benutzerhandbuch, Seite 219 definiert:

  WDTC = 1024; // kurze Zeitüberschreitung - WASTEFUL! WDMOD = WDEN | WDRESET; // Watchdog setzt CPUWDFEED = 0xAA zurück; // start ... WDFEED = 0x55; // ... watchdog.  

Führen Sie stattdessen die Aufgabe des Timers aus - Schreiben Sie direkt in das WDINT-Bit (das den Watchdog-Interrupt auslöst) des WDMOD-Registers, anstatt auf das zu warten Timer:

  WDMOD = WDEN; // InterruptWDMOD aktivieren | = WDINT; // Interrupt auslösen  

Das Datenblatt besagt, dass es schreibgeschützt ist, was für mich eine Überraschung ist, aber die von mir verwendeten TI- und Atmel-Prozessoren haben normalerweise beschreibbare Interrupt-Trigger. Probieren Sie es aus und sehen Sie, was passiert.

Die tragbarere Alternative ist ein Software-Interrupt. Ich habe nicht mit NXP-Prozessoren gearbeitet, aber die ARM7TDMI-Familie (zu der der LPC2100 gehört) kann durch Verzweigung auf 0x00000000 zurückgesetzt werden. Interessanterweise bezeichnet NXP diese Adresse als Watchdog-Interrupt. Sie sollten in der Lage sein, mit Code wie folgt auf Null zu verzweigen:

  void (* reset) (void); // Funktion zu callreset deklarieren = 0x00000000; // Adresse im Speicher des zurückgesetzten ISR // (Siehe Tabelle 2-4 von ARM7TDMI TRM oder // Tabelle 2 von NXP UM10161) reset (); // Rufen Sie Ihre neue Funktion  

auf. Alternativ können Sie Folgendes verwenden:

  asm volatile ("mov pc, # 0 \ n");  

, um dasselbe zu erreichen.

Möglicherweise müssen noch einige Haushaltsaufgaben erledigt werden, aber dieser Code funktioniert im Grunde genauso wie der Watchdog-Timer, mit dem Sie Ihr Programm von vorne beginnen. Dieser Code funktioniert auch auf einer Vielzahl von Mikrocontrollern.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 2.0-Lizenz, unter der er vertrieben wird.
Loading...