STM32 MCU Bootloader Zur Anwendung springen

Heutzutage unterstützen immer mehr eingebettete Geräte automatische Fern-Upgrades ohne Downloader, was die Wartung der Geräte sehr komfortabel macht. Um Fern-Upgrades für ein Gerät zu ermöglichen, müssen wir einen Programmcode schreiben, der den Upgrade-Prozess unterstützt. Dieses Programm wird gemeinhin als BootLoader bezeichnet.

Im Wesentlichen ist der Programmcode des Geräts in zwei Teile unterteilt: den BootLoader und die APP. Der BootLoader ist für das Upgrade der APP und die Initiierung ihrer Ausführung verantwortlich. Die APP hingegen ist für die Implementierung der Betriebsfunktionen des Geräts verantwortlich und beherbergt im Wesentlichen die Kernfunktionalität des Geräts.

Bei Mikrocontrollern der Cortex-M-Serie sind bestimmte Konfigurationen erforderlich, um einen sicheren Übergang vom BootLoader zur APP zu erreichen. In diesem Artikel werden anhand des Beispiels der STM32-Mikrocontroller die wichtigsten Konfigurationsschritte beschrieben, die für einen erfolgreichen Übergang vom BootLoader zur APP erforderlich sind.

BootLoader Springen zu APP

Schritt 1: Partition flashen

Während der Programmier- und Entwurfsphase ist es wichtig, den Flash-Speicher entsprechend den spezifischen Anwendungsanforderungen zu partitionieren. Dazu muss festgelegt werden, wo der BootLoader und die APP gespeichert werden sollen und wie viel Speicherplatz jeweils zugewiesen wird. Diese Speicherplatzzuweisung wirkt sich direkt auf die Ausführung und die Übergänge des Programms aus.

Eine der einfachsten Upgrade-Strategien umfasst einen BootLoader und eine APP. Der BootLoader übernimmt die Übergänge und erleichtert APP-Upgrades. In diesem Artikel wird diese Upgrade-Strategie als Beispiel zur Erläuterung herangezogen.

Bei STM32-Mikrocontrollern lautet die zugeordnete Adresse für den Programmstart 0x8000000.

Der BootLoader kann unter der Adresse 0x8000000 gespeichert werden, und der zugewiesene Speicherplatz kann je nach der spezifischen Flash-Größe des Chips angepasst werden, beispielsweise 0x10000 oder 64 KB.

Die Speicheradresse der APP befindet sich hinter dem BootLoader, genauer gesagt an der Adresse 0x8010000. Der verbleibende Speicherplatz im Flash kann der APP zugewiesen werden.

Schritt 2: BootLoader-Projektkonfiguration

Die Konfiguration des BootLoader-Projekts umfasst mehrere Schritte. Am Beispiel von MDK wird das BootLoader-Programm im FLASH-Speicher unter der Adresse 0x8000000 mit einer Größe von 0x10000 gespeichert.

BootLoader Flash Configuration of STM32 MCU
BootLoader Flash Configuration of STM32 MCU

Beachten Sie beim Übergang zur APP mithilfe von Programmcode die folgenden Punkte:

  • Überprüfen Sie die Gültigkeit der Stack-Top-Adresse, d. h. ob die Startadresse der APP gültig ist.
				
					if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)

				
			
  • Deaktivieren Sie alle Interrupts, um Störungen während des Übergangs zu vermeiden, die zu Ausnahmen führen könnten.
  • Ermitteln Sie die Startadresse des APP-Programms, die als zweites Wort gespeichert ist (Startadresse + 4, Daten im Flash gespeichert).
  • Initialisieren Sie den Stack-Zeiger (das erste Wort im Benutzercode-Bereich enthält die Adresse des Stack-Top).
  • Konvertieren Sie die Startadresse der APP in einen Funktionszeigertyp und führen Sie den Übergang durch.

Der spezifische Code für den Übergang lautet wie folgt:

				
					/* Define type */
typedef void (*pFunction)(void);

/* APP flash address */
#define APP_FLASH_ADDR             (0x8010000)

void jump_to_app(void)
{
  uint32_t JumpAddress;
  pFunction Jump_To_Application;

  /* Check if the stack top address is valid */
  if(((*(__IO uint32_t *)APP_FLASH_ADDR) & 0x2FFE0000) == 0x20000000)
  {
    /* Disable all interrupts to prevent disturbances during transition */
    __disable_irq();

    /* The second word in the user code area is the program's start address (reset address) */
    JumpAddress = *(__IO uint32_t *) (APP_FLASH_ADDR + 4);

    /* Initialize the user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t *) APP_FLASH_ADDR);

    /* Type conversion */
    Jump_To_Application = (pFunction) JumpAddress;

    /* Transition to the APP */
    Jump_To_Application();
  }
}

				
			

Schritt 3: APP-Projektkonfiguration

Ebenso erfordert das APP-Projekt bestimmte Konfigurationen. Am Beispiel von MDK wird das APP-Programm im FLASH-Speicher unter der Adresse 0x8010000 mit einer Größe von 0x30000 gespeichert.

APP Flash Configuration of STM32 MCU
APP Flash Configuration of STM32 MCU

Die Konfiguration für das APP-Programm umfasst die folgenden Schritte:

  • Verschieben Sie die interne Flash-Vektortabelle in der APP, indem Sie SCB->VTOR ändern.
  • Nachdem die APP gestartet wurde, müssen in der Initialisierungsfunktion unbedingt Interrupts aktiviert werden, um eine reibungslose Programmausführung zu gewährleisten. Andernfalls kann es zu Programmfehlern kommen.

Normalerweise wird in der Startdatei die Funktion SystemInit() aufgerufen. Diese Funktion konfiguriert die Schnittstelleninformationen des Flash-Speichers.

				
					SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET
				
			
APP Program Code of STM32 MCU
APP Program Code of STM32 MCU

Ändern Sie den Wert der Makrodefinition VECT_TAB_OFFSET auf 0x10000.

Define VECT_TAB_OFFSET of STM32 MCU
Define VECT_TAB_OFFSET of STM32 MCU

Nach dem Start des APP-Programms ist es wichtig, globale Interrupts zu aktivieren. Sie können den folgenden Code in den Initialisierungsabschnitt einfügen:

				
					/* Enable interrupts */
__enable_irq();

				
			

APP Zum BootLoader springen

Während des Betriebs des Geräts läuft die APP und verarbeitet Geschäftsfunktionen. Wenn Sie die APP aktualisieren möchten, müssen Sie von der APP zum BootLoader wechseln. Wie kann man also den Sprung von der APP zum BootLoader realisieren? Es gibt zwei Methoden:

  1. Hardware-Modus, Gerät ausschalten und neu starten oder Reset-Taste drücken
  2. Software-Modus, MCU über Software-Steuerung zurücksetzen

Im Softwaremodus können Steuerbefehle zum APP-Code hinzugefügt werden, und wenn die APP den Sprungbefehl (oder Upgrade-Befehl) empfängt, wird die MCU zurückgesetzt. Der folgende Code kann die MCU zurücksetzen:

				
					/* reset chip */
HAL_NVIC_SystemReset();
				
			

Teilen auf:

Nach oben scrollen

Instant Quote