Frage

Ich verwende ein LPC 1768-Board von mbed (mit Cortex M3-CPU) und versuche hier etwas zu erreichen, hauptsächlich die Benutzeranwendung von der SD-Karte zu aktualisieren, ich schreibe zwei Programme, zuerst einen Bootloader / Nano-Kernel und eine Benutzer-App (helloworld reicht für den Anfang):

  • Bootloader / Nano-Kernel bei 0x00 Adresse läuft, es werden einige Überprüfungen durchgeführt und schließlich die Binärdatei auf der SD-Karte abgerufen
  • Bootloader / Nano-Kernel kopiert diese Binärdatei an die Adresse 0x9000 (das muss sich möglicherweise später ändern, aber dieser Speicherplatz wird vom Bootloader / Nano-Kernel nicht verwendet, sollte also in Ordnung sein)
  • Bootloader springt bei 0x9000 + 4 zur Benutzeranwendung

Die SD-Karte ist ziemlich einfach zu trainieren, ich habe Probleme mit dem Sprungteil.Hier ist der Code der Sprungfunktion.

void run(void) {

  void (*user_code_entry)(void);

  unsigned *p;   
  SCB->VTOR = (USER_FLASH_START & 0x1FFFFF80);

  // Load contents of second word of user flash - the reset handler address
  // in the applications vector table
  p = (unsigned *)(USER_FLASH_START +4); // USER_FLASH_START is 0x9000

  user_code_entry = (void (*)(void))p;

  // Jump to user application
  user_code_entry();

}

Also habe ich die Benutzeranwendung kompiliert (ich verwende Keil uvision4) und die Startadresse in 0x9000 geändert.Wenn ich mein Board programmiere (mit flashmagictool) und dann manuell (immer noch mit flashmagictool) auf 0x9004 (0x9000 + 4) springe, wird die Benutzeranwendung ausgeführt, sodass die Kompilierung meiner Meinung nach in Ordnung funktioniert hat, sodass die Benutzer-App mit 0x9000 ausgeführt werden kann.

Aber wenn ich den Bootloader / Nano-Kernel starte, springt dieser nicht zur Benutzeranwendung und da ich leider nicht debuggen kann, bin ich mir nicht sicher, was los ist...Ich habe auch versucht, den SD-Kopierteil nicht zu verwenden, also programmiere ich den Bootloader zuerst mit im Grunde nur dem Sprung auf 0x9004.Ich programmiere dann die Benutzeranwendung, die bei 0x9000 sitzen wird.Wenn ich das Board neu starte, wird der Bootloader ausgeführt, springt aber nicht zur Benutzer-App.Ich habe den Speicher überprüft und es scheint, dass beide Programme (Bootloader + Benutzer-App) korrekt und am richtigen Ort sind.

Ich bin mir sicher, dass mir hier etwas fehlt. Gibt es einen Code auf niedriger Ebene, den ich mir ansehen sollte?Ich habe Töne von Dokumenten online gelesen und anhand der Beispiele, die ich gefunden habe, springen sie genauso wie ich zum Benutzercode...Vielen Dank für jede Hilfe.

War es hilfreich?

Lösung

Cortex M3 kann nur im Daumenmodus ausgeführt werden.Sie müssen also immer zu springen address +1, Andernfalls wird ein Fehler generiert.

Probieren:

user_code_entry = (void (*)(void))(USER_FLASH_START +4 +1);

Andere Tipps

Lesen Sie einfach das AN10866-Dokument auf der NXP-Site.Sie haben den PC und den Stapelzeiger und springen dann zum Reset-Interrupt auf:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top