Welchen Wert hat die erste Adresse des Flash-Speichers von stm32 für jede Firmware?

Bei jeder Firmware von Stm32-Mikrocontrollern beginnt der erste Wert mit 0x2XXXXXXX, während ich mit benutzerdefinierten Bootloadern arbeite, habe ich festgestellt, dass dies eine Adresse im SRAM ist.

Geben Sie hier die Bildbeschreibung ein

1) Was ist eigentlich an dieser Adresse von SRAM vorhanden?

2) In benutzerdefinierten Bootloadern Welche Bedeutung hat es, den MSP auf diese Adresse im SRAM einzustellen, bevor der Reset-Handler der Benutzeranwendung aufgerufen wird?

uint32_t msp_value = *((volatile uint32_t *)FLASH_SECTOR2_BASE_ADDRESS);
__set_MSP(msp_value);
app_reset_handler();

Antworten (1)

Bei jeder Firmware von Stm32-Mikrocontrollern beginnt der erste Wert mit 0x2XXXXXXX, während ich mit benutzerdefinierten Bootloadern arbeite, habe ich festgestellt, dass dies eine Adresse im SRAM ist

Wie im Technical Reference Manual für jeden der verwendeten ARM Cortex M-whatever-Kerne dokumentiert, ist dies die Anfangsadresse des Stapelzeigers.

Wenn der Chip einen tatsächlichen Reset durchführt, wird diese Adresse von der Reset-Logik in den Stapelzeiger geladen.

Traditionell befindet sich dies ganz oben im RAM oder vielleicht etwas niedriger, wenn Sie dort Adressen für die Übergabe von Flags bei Soft-Neustarts oder ähnlichem reservieren möchten. In einer Toolchain im gcc-Stil wird es im Allgemeinen im Linker-Skript bezeichnet und vom Linker anstelle von Symbolen eingefügt, die von früheren Kompilierungsstufen im Code hinterlassen wurden.

1) Was ist eigentlich an dieser Adresse von SRAM vorhanden?

Hoffentlich nichts, was irgendjemand interessiert. Der Inhalt der Anfangsadresse und ein beträchtlicher (und nicht ganz entscheidender!) Bereich darunter werden bald durch gewöhnliche Operationen des Stapels überschrieben.

2) In benutzerdefinierten Bootloadern Welche Bedeutung hat es, den MSP auf diese Adresse im SRAM einzustellen, bevor der Reset-Handler der Benutzeranwendung aufgerufen wird?

Im Wesentlichen würde der Bootloader simulieren, was die Hardware tun würde, wenn sie direkt mit diesem Vektorblock als eigentlichem Vektorblock booten würde. Während technisch nichts in der Hardware jemals auf den anfänglichen Stapelzeigerwert in einem Vektorblock schauen würde, der beim Zurücksetzen nicht wirksam ist, gibt das Lesen dieses mit Software und das Handeln als Hardware der Zielfirmware viel die Flexibilität, die sie hätte, wenn sie gebootet worden wäre direkt - vorausgesetzt natürlich, dass es nicht mit der Region des Bootloaders verknüpft wurde und kein RAM (oder RTC-Register) überschreibt, das der Bootloader möglicherweise als Flags für einen Soft-Neustart verwendet, um die Ziel-Firmware frisch einzugeben neu gestarteter Fall mit Peripheriezustand, der durch die Verwendung des Bootloaders nicht beschädigt wurde.