Demnach scheint der stm32-Startvorgang wie folgt zu sein:
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 ...
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:
Meine Meinung dazu:
Wenn Sie im Bootloader landen:
Nur ich
Chris Stratton
Oldtimer
Oldtimer