Installieren eines Bootloaders auf einem ARM-Mikrocontroller

Ich habe diese LPC1788FBD144,551 MCU und diese LPC1313FBD48/01,15 MCU gekauft und möchte einen Bootloader in Assembly darauf installieren, der eine Funktion in C aufrufen kann. Wie kann ich den Bootloader auf der ARM MCU installieren? Würde ich es direkt auf der MCU oder auf einer separaten Komponente installieren (wenn ja, können Sie mir auf der Newark-Website zeigen, welcher Teil)?

Haben Sie überprüft, ob nicht bereits ab Werk eine vorhanden ist? Bootloader für welche externe Schnittstelle?
@ChrisStratton Ich möchte einen benutzerdefinierten Bootloader für das Gerät erstellen.
Das sagen Sie, aber zuerst müssen Sie entscheiden, was Ihr Bootloader tun soll, und die Fähigkeiten der Zielchips untersuchen - was sie bereits tun, ob sie das teilweise Sperren von Seiten unterstützen und ob sie über genügend RAM verfügen die bootgeladene Anwendung dort, anstatt sie zu flashen (wenn Sie es vorziehen) usw.

Antworten (2)

Beide Geräte haben On-Chip-Bootloader, die immer ausgeführt werden. Mit dem LPC17xx können Sie einen sekundären Bootloader schreiben, um benutzerdefinierten Code auszuführen, der direkt danach ausgeführt wird. Sie müssen lediglich Ihre IDE anweisen, den Code an Position 0x00 zu platzieren.

Sehen Sie sich auf der Dokumentationsseite AN11257 und AN11258 an. Diese behandeln das Erstellen sekundärer Bootloader (SBL), um Code von SPI bzw. I2C zu laden. Dies könnte Code von einem PC oder einem externen Speichergerät abrufen.

Von AN11257:

Bei diesen MCUs befindet sich der primäre Bootloader im Bootblock. Der Bootloader wird jedes Mal ausgeführt, wenn das Teil eingeschaltet oder zurückgesetzt wird. Es kann den ISP-Befehlshandler oder den Benutzeranwendungscode ausführen, der in Sektor 0 des internen Flash-Speichers gespeichert ist.

Die SBL in diesem Projekt bezieht sich auf eine benutzerdefinierte Anwendung, die dem Benutzer die Option bietet, die Benutzeranwendungs-Firmware zu aktualisieren oder die zuvor programmierte Benutzeranwendungs-Firmware auszuführen. Es wird von der Adresse 0x00 platziert, sodass es zuerst ausgeführt wird, wenn der primäre Bootloader eine Benutzeranwendung ausführt.

Ich konnte keine ähnliche Dokumentation zum LPC13xx finden. Aber der primäre Bootloader hat etwas mehr Funktionalität eingebaut. Insbesondere die Möglichkeit, neue Programme über UART zu laden. Ihrer Version fehlt die USB-Funktionalität, über die sie im Benutzerhandbuch sprechen :

Der Bootloader-Code wird jedes Mal ausgeführt, wenn das Teil eingeschaltet oder zurückgesetzt wird (siehe Abbildung 63). Der Lader kann entweder den ISP-Befehlshandler oder den Benutzeranwendungscode ausführen oder das Boot-Image als angeschlossenes MSC-Gerät über USB abrufen. Ein LOW-Pegel während des Zurücksetzens am PIO0_1-Pin wird als externe Hardwareanforderung zum Starten des ISP-Befehlshandlers oder der USB-Geräteaufzählung angesehen, ohne zuerst auf einen gültigen Benutzercode zu prüfen. Der Status von PIO0_3 bestimmt, ob die UART- oder USB-Schnittstelle verwendet wird:

• Wenn PIO0_3 HIGH abgetastet wird, verbindet der Bootloader den LPC134x als MSC-USB-Gerät mit einem PC-Host. Der Flash-Speicherbereich des LPC134x wird im Windows-Betriebssystem des Hosts als Laufwerk dargestellt.

• Wenn PIO0_3 als LOW abgetastet wird, konfiguriert der Bootloader den seriellen UART-Port und ruft den ISP-Befehlshandler auf.

Anmerkung: Bei den LPC131x-Teilen (kein USB) spielt der Zustand von Pin PIO0_3 keine Rolle.

Sie können immer noch die ersten Anweisungen ausführen lassen, nachdem der primäre Bootloader als benutzerdefinierter sekundärer Bootloader fungiert. Sie müssen diesen Code nur an der richtigen Adresse finden. Wie dies geschieht, hängt stark von Ihrer IDE ab. Lesen Sie in der Dokumentation Ihrer IDE nach, wie Sie die Codeplatzierung in den gewünschten Sektoren richtig steuern.

Wenn ich dies von meinem Mac aus mache, wie könnte ich meine IDE so einstellen, dass sie die Adresse auf 0x00 setzt? Speziell mit nasm oder gcc?
@Coder404 Sie müssen eine Linker-Datei für gcc erstellen, die die Objektdatei Ihres Bootloader-Codes in einem bestimmten Abschnitt an einer bestimmten Adresse platziert. Schauen Sie sich hier das vorletzte Beispiel an, wo sie die allObjektdatei in den outputaAbschnitt bei Adresse einfügen 0x10000. Ich würde auch vorschlagen, gcc anzuweisen, eine Kartendatei zu drucken, um sicherzustellen, dass Sie es richtig gemacht haben.
Welche Art von physischer Verbindung würde ich verwenden, um den Code auf der MCU zu installieren?
@ Coder404 Die kurze Antwort lautet: serieller Bus. Aber jeder Chip ist etwas anders. Einzelheiten finden Sie in Kapitel 32 des LPC17xx-Benutzerhandbuchs und Kapitel 21 des LPC13xx-Benutzerhandbuchs .
Sie würden den Bootloader nicht installieren, da er bereits ab Werk vorhanden ist. Um mit dem Bootloader zu kommunizieren, müssten Sie eine von ihm unterstützte Schnittstelle verwenden - Sie müssen die Dokumentation für den jeweiligen Chip einsehen, aber normalerweise wird eine Teilmenge von seriellen, SPI- oder USB-Schnittstellen auf Logikebene unterstützt.

Ich würde sagen, alles, was Sie brauchen, wird bereits von NXP bereitgestellt.

Das Prinzip gilt für alle LPC1700-Mikrocontroller. Verwenden Sie also entweder das Flashmagic-Tool oder rufen Sie IAP-Funktionen (In Application Programming) auf, um Ihren eigenen benutzerdefinierten Bootloader bereitzustellen. Normalerweise müssen Sie dies tun, wenn der Bootloader über Ethernet oder USB und nicht über RS232 ausgeführt werden soll. Dennoch macht es Sinn, IAP-Funktionen für die Flash-Programmierung aufzurufen und es nicht selbst zu tun.

Überprüfen Sie diesen Thread , die Antworten von Zero und Rob68 sind immer von hoher Qualität, direkt zum Problem.

Laden Sie das Flashmagic-Tool herunter und studieren Sie das Benutzerhandbuch (als PDF bereitgestellt). Ihre Geräte werden unterstützt.

Überprüfen Sie auch diesen Link , wo einige spezifischere Probleme diskutiert wurden.