STM32 Unerwünschter Bootloader beim ersten Einschalten

Demnach scheint der stm32-Startvorgang wie folgt zu sein:

  1. Überprüfen Sie, ob FLASH leer ist. Wenn ja, gehe in den Bootloader-Modus
  2. Überprüfen Sie, ob der BOOT0-Pin aktiviert ist. Wenn ja, gehe in den Bootloader-Modus
  3. Gehe in den Programmiermodus

Mein Problem ist die erste Bedingung beim ersten Booten.

Wenn ich einige MCUs frisch und leer kaufe und sie an meine Produktplatinen löte, die ich später im System über das SWD-Protokoll programmieren möchte (daher brauche ich sowieso keinen Bootloader), binde ich den BOOT0-Pin in der Platine niedrig. aber es scheint, als würde es beim ersten Booten ignoriert, wenn der Flash leer ist und der Bootloader-Code trotzdem ausgeführt wird.

Nehmen wir an, ich wollte einen GPIO-Pin als Eingang verwenden, der zufällig derselbe Pin ist, den der Bootloader als USART_TX (oder USB oder irgendetwas anderes) verwendet. Wenn der Code also ausgeführt wird, wird er zu einem PUSH_PULL-AUSGANG, während er auch extern angesteuert wird etwas anderes auf der Leiterplatte, weil es als Input für das Produktdesign betrachtet wurde.

das ist ruhig ein kurzer dort.

Muss ich diese berücksichtigen? ist das überhaupt wahr?

Scheint, als gäbe es auch einige unklare Unterschiede zwischen verschiedenen Serien ...

Von welchem ​​genauen STM32-Chip sprichst du? Es gibt Dutzende verschiedener Modelle, und kein einziges von ihnen, das ich kenne, führt den Bootloader automatisch aus, wenn BOOT0 niedrig ist, unabhängig vom leeren Flash. Einige der Modelle funktionieren, wenn der Blitz leer ist.
Es ist eine interessante Frage, die Sie mit einem EVB testen könnten, ob der Bootloader einen UART-Ausgang auf Leerlaufpegel treibt, bevor er ein Signal am entsprechenden Eingang erhält. Es könnte eine Idee sein, einige Vorwiderstände an Pins mit potenziellem Konflikt anzubringen. Natürlich ist UART nicht die einzige Schnittstelle, aber es ist eine derjenigen, die mit größerer Wahrscheinlichkeit einen Pegel behaupten, ohne abgefragt zu werden. Die beste Vorgehensweise könnte wirklich darin bestehen, die Pins zu speichern, die der Bootloader als UART-Ausgang verwenden möchte, um sie als primären Debug-UART zu verwenden ... oder zumindest zu vermeiden, sie für grob widersprüchliche Zwecke wie eine Eingabe zu verwenden.
Die neueren stm32s verwenden standardmäßig kein boot0 extern, Sie müssen ein wenig arbeiten, aber sie booten immer noch in den Bootloader, wenn der Anwendungs-Flash leer ist. Wenn es in den Bootloader bootet, können Sie SWD problemlos verwenden, um den Chip zu programmieren, ja? Ich verstehe das Problem nicht, das Sie haben. für diejenigen mit boot0 ist dokumentiert, dass Sie einen externen Widerstand benötigen. Welchen Teil der st-Dokumente verstehst du nicht?
Bei einigen von ihnen können Sie ein internes nichtflüchtiges Register programmieren, damit der Boot0-Pin nicht funktioniert. auch in der st-dokumentation dokumentiert, welchen teil davon hast du nicht verstanden? Welcher spezifische Teil ist das?

Antworten (1)

Zunächst einmal gibt es viele verschiedene Versionen des Bootloaders und Muster, wie Sie sie eingeben, die in den verschiedenen Familien des STM32 implementiert sind. In der Tat haben neuere Teile ein Muster, um in den Bootloader zu gelangen, das Ihrer Beschreibung entspricht.

Das wichtigste Dokument, das Sie sorgfältig lesen sollten, ist der Anwendungshinweis AN2606 über den Bootloader.

Eine Hauptempfehlung lautet wie folgt:

Es wird empfohlen, die RX-Pins nicht verwendeter Bootloader-Schnittstellen (USART_RX, SPI_MOSI, CAN_RX und USB D+/D-Leitungen, falls vorhanden) beim Start des Bootloaders (Erkennungsphase) auf einem bekannten (niedrigen oder hohen) Pegel zu halten. Wenn Sie diese Pins während der Erkennungsphase floaten lassen, kann dies dazu führen, dass nicht verwendete Schnittstellen aktiviert werden.

Was uns natürlich nicht direkt sagt, was mit Pins passiert, aber das Aktivieren einer Bootloader-Schnittstelle ist in Ihrem Fall nicht das, was Sie wollen.

Achten Sie besonders auf die Pins, die Sie für SWD benötigen. Oft werden diese mit der USART2-Funktionalität geteilt, und wenn Sie diese Schnittstelle versehentlich aktivieren, werden Sie von SWD ausgeschlossen.


Dann gibt es Tabellen für jedes Gerät, die Ihnen sagen, welche Schnittstelle welchem ​​Pin und welcher Funktionalität zugeordnet ist und welche als Eingang und Ausgang verwendet werden.

Ich stimme zu, dass nicht klar ist, in welchem ​​​​Zustand sich die Pins befinden, während der Bootloader diese Schnittstelle nicht aktiv verwendet.

Für den USART TX klingt der Text normalerweise so: "PA9 Pin: USART1 im Übertragungsmodus", also ist es nur ein Ausgang, wenn er im Übertragungsmodus ist?

Für das SPI MISO geht es so: "PA6-Pin: Slave-Datenausgangsleitung, im Pushpull-Pulldown-Modus verwendet", was darauf hinweisen könnte, dass es sich in einem Eingangszustand befindet, wenn es nicht verwendet wird, warum sollte es sonst ein Pull- Abwärtswiderstand aktiv?

Ähnliches bei CAN TX: " PB9 Pin: CAN1 in Transmission Mode": klingt so, als ob es deaktiviert werden könnte, wenn CAN nicht im Transmission Mode ist.


Wie Chris Stratton in den Kommentaren vorgeschlagen hat, habe ich meinen Nucleo mit dem STM32L452RE genommen und den Flash gelöscht, und er verhält sich so, wie Sie es beschrieben haben, und ist im Bootloader gelandet.

Die Platine wird von einer Laborversorgung mit eingeschalteter Strombegrenzung versorgt.

Ich habe dann ein Kabel von GND oder 3V3 angeschlossen und es mit den Ausgangspins der Bootloader-Schnittstellen verbunden und die folgenden - nicht ermutigenden - Ergebnisse erhalten:

  • USART TX: hohe Impedanz
  • SPI MISO: Hoch getrieben
  • CAN TX: hochgefahren

Meine Meinung dazu:

  • Prüfen Sie genau, welches Verhalten auf Ihren Chip zutrifft

Wenn Sie im Bootloader landen:

  • Verwenden Sie keine widersprüchlichen Signalrichtungen (das von mir beobachtete Verhalten kann sich ändern, wenn es ein Update im Bootloader gibt)
  • Stellen Sie sicher, dass es keine Schnittstelle verwendet, die SWD blockiert, indem Sie die Eingangspins für diese Schnittstelle auf einem bekannten konstanten Pegel halten