Cortex-M4, wie kann man sich von einem Vektortabellen-Lesefehler in einem leeren Gerät erholen?

Ich muss Firmware in den RAM eines leeren Cortex-M4-Chips laden und ausführen (in einer Produktionsumgebung). Der Chip erwartet normalerweise eine Vektortabelle an der Adresse 0x0 im Flash. Wenn ich meine Firmware in den RAM lade, ist der Geräte-Flash leer. Meine Firmware läuft gut, aber Interrupt-Handler werden nie aufgerufen. Ich setze VTOR auf meine Tabelle im RAM (und sie ist natürlich richtig ausgerichtet).

Ich habe herausgefunden, dass, wenn das Gerät aus dem leeren Zustand startet:

  • das VECTTBL-Bit in HFSR ist gesetzt (offensichtlich konnte es die Vektoren nicht von 0xFFFFFFFF abrufen)
  • VECTPENDING in ICSR ist 3 (wahrscheinlich Busfehler oder harter Fehler)

Wenn bereits Firmware im Flash vorhanden ist, läuft meine Hersteller-Firmware einwandfrei und unterbricht die Arbeit. Das Löschen des Bits in HFSR hilft nicht. Das Setzen von VECTCLRACTIVE oder VECTRESET in AIRCR hilft nicht.

Frage: Gibt es eine Firmware-gesteuerte Möglichkeit, das NVIC zurückzusetzen oder den Lesefehler der Vektortabelle zu löschen?

Welche M4? Es könnte einen Unterschied machen.
Welche genaue MCU ist es, um sie von all den Tausenden verschiedener MCUs von Dutzenden von Herstellern zu unterscheiden, die einen Cortex-M4-Kern enthalten?
Die CPU ist Teil eines ASIC. Nicht von der Stange erhältlich, aber der CPU- und Speicherteil sieht genauso aus wie jeder andere M4 (EFM32, Kinetis usw.). Es gibt keine Schalter für „Bootmodus“ oder „Speicherneuzuordnung“. Das Problem ist vollständig im M4-Subsystem enthalten.
Was genau tun Sie, um das VECTTBL-Bit zu löschen? Versuchen Sie, dort eine 0 zu schreiben? Diese Art von Fehlerstatusbits erfordert oft, dass Sie eine 1 schreiben, um das Bit wieder auf 0 zu löschen.

Antworten (1)

Dies hängt ganz von der Implementierung des Cortex M4 ab.
Der M4 selbst kann nur durch einen System-Reset wiederhergestellt werden, der VTOR zurücksetzt, also ist das ein No-Go.

Ihr Chip kann jedoch ein Register wie SYSCFG_MEMRMPim STM32F407 haben. Dadurch wird die Standard-Boot-Region woanders neu zugeordnet.

Geben Sie hier die Bildbeschreibung ein

Ich weiß, dass der LPC43xx von NXP auch ein solches Register hat.

Wenn dies nicht verfügbar ist, muss Ihr Debugger die richtige Bedingung festlegen, bevor er ausgeführt wird.