Forum: Projekte & Code Bootloader control für STM32 und LPC 32-Bit Mikrocontroller


von Ralph S. (jjflash)



Lesenswert?

Um es vorwegzunehmen, die hier vorgestellte Software funktioniert nur 
unter Linux
------------------------------------------------------------------------ 
---

Nachdem ich ein paar (wenige male) darauf angesprochen wurde, wie ich 
Code in die Controller uploade, möchte ich hier eine meiner Methoden 
vorstellen, die ich neben ST-Link, JTAG und dergleichen verwende.

Eine "schöne und einfache" Art versprechen Bootloader (wenn man davon 
absieht, dass über einen Bootloader nicht gedebugt werden kann). Für den 
STM32F103 taucht hier immer wieder der Bootloader auf, der auf ein 
ehemaliges Maple-Leaf Project aufsetzt und federführend von im Netz 
bekannten Roger Clark aus Melbourne aufgesetzt wurde.

Dieser Bootloader funktioniert, aber mir war das ein zu großes 
"gefrickel" und zu dem arbeite ich gerne mit einer nativen seriellen 
Schnittstelle controllerseitig.

Schön ist, dass die STM32 und die LPC Mikrocontroller integrierte 
Bootloader für serielle Datenübertragung schon von Haus aus besitzen und 
somit muß den Controllern zur Benutzung keine Software aufgespielt 
werden.

Alles könnte so schön sein, wenn... ja wenn das Aktivieren des 
Bootloaders der Chips nicht so ungeschickt wäre. Taster und/oder 
Steckreihen an die Anschlüsse für Boot0 und Reset anbringen (wie bspw. 
bei der Bluepill) ist beim Arbeiten irgendwie "unschön", wenn diese für 
jeden Upload verändert werden müssen.

Welche logischen Pegel an die Anschlüsse angelegt werden müssen ist dem 
Impulsdiagramm (hier als hinzugefügtes Bild) zu sehen.

Aus diesen Überlegungen heraus entstand eine Schaltung, die ich

                           Bootloader-Control

getauft habe.

Ein ATtiny13 legt die benötigte Impulsabfolge an die entsprechenden 
Controller an. Wann der Bootloader aktiviert werden soll, wird über die 
RTS Leitung der seriellen Schnittstelle entschieden. 3 Impulse auf 
dieser Leitung veranlassen den ATtiny, den Bootloadermodus an dem STM32 
oder LPC Microcontroller zu aktivieren, 3 weitere Impulse schalten 
diesen Modus wieder aus und reseten den Controller.

Um einen Upload durchführen zu können, habe ich die bekannten Programme 
STM32FLASH und LPC2ISP modifiziert, damit diese den ATtiny steuern 
können.

Die gezeigte Schaltung hier arbeitet mit dem sehr preiswerten CH340G, 
zusammen, aber eine Versuchsschaltung mit einem FTDI hat gezeigt, dass 
dieses auch funktioniert.

Zum CH340 ist zu sagen, dass der bei Linux vorhandene Kerneltreiber 
einen bekannten Parityfehler hat (und deshalb das Programm STM32FLASH 
nicht mit diesem Treiber funktioniert). Im Archiv ist deshalb ein Patch 
enthalten, der diesen Fehler behebt.

Desweiteren hat sich gezeigt, warum auch immer, dass zwei Ryzen 
AMD-Boards den CH340 genau einmal ansteuern kann und danach müsste 
jedesmal der Chip vom USB getrennt werden. Damit man dieses nicht 
händisch durchführen muss, gibt es im Ordner ch340reset ein 
Progrämmchen, das den CH340 reseten kann. Es empfiehlt sich, vor dem 
eigentlichen Upload dieses Programm auszuführen, damit der CH340 auch 
garantiert die Upload-Daten transferiert.

Im Ordner attiny_src ist die Firmware für den ATtiny enthalten.

Das ganze hört sich jetzt aufwändiger an, als es ist. Der Treiberpatch 
ist einmal durchzuführen, und ein ch340reset und ein Upload erfolgt in 
einem Makefile (was auch der Grund ist, warum das alles 
Konsolenprogramme sind).

Das modifierzierte Uploadprogramm für STM32 heißt hier nun:

stm32flash_rts

Das modifizierte Uploadprogramm für den LPC11 heißt hier nun:

lpc-flash

Die Kommndozeilenparameter für die beiden Programme wurden beibehalten, 
wie ein Upload aufgerufen wird ist in dem Einzeilenscript testupload zu 
sehen.

--------------------------

Sollte es von Interesse sein, kann ich auch gerne berichten, wie man 
diese Programme in Arduino implementiert (bei installierter STM32F103 
Unterstützung) um bspw. Arduino mit BluePill und der hier vorgestellten 
Uploadmethode zu nutzen.

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Mist, das letzte Bild wurde nicht hochgeladen, es zeigt allerdings nur 
den Breadboardaufbau mit einem LPC Controller an.

Die auf den Steckbretter zu sehende Schaltung entspricht die des 
Schaltplans, einzig habe ich die auf 2 getrennten PCB's realisiert 
(CH340 und ATtiny Bootcontrol). Somit habe ich bspw. die Möglichkeit, 
den Bootcontrol weg zu lassen und das CH340 PCB als Anschlussbrücke für 
bspw. einen ATmega-Arduino-Bootloader zu verwenden

von W.S. (Gast)


Lesenswert?

Ralph S. schrieb:
> Alles könnte so schön sein, wenn... ja wenn das Aktivieren des
> Bootloaders der Chips nicht so ungeschickt wäre.

Also, ich verstehe hier nur 'Bahnhof'.

Wozu soll der ganze Aufwand denn gut sein? Wozu Impulse mit einem Attiny 
abzählen?

Klar ist, daß man die Leitungen für RxD und TxD benötigt.
Ebenso klar ist, daß man auch Reset und Boot irgendwie bedienen muß. 
Entweder irgendwie von Hand oder eben über die Serielle per RTS und DTR.

Also, liegt das ganze Problem nun darin, daß der Treiber im PC bei Linux 
eine Macke hat? Oder daß er das Einstellen der Parität nicht gestattet? 
Oder daß er das Setzen von RTS und DTR nicht gestattet? Oder daß 
irgendwelche fehlenden Privilegien das verhindern?

Oder liegt es an der Brennsoftware, die du benutzen willst?

Normalerweise zieht je ein Widerstand auf der LP die Reset- und 
Boot-Pins in die für den Normalbetrieb übliche Richtung hi oder lo. Und 
mit dem Programmieranschluß zieht man selbige eben dorthin, wo man sie 
haben will. Zum Start in den Bootlader zieht man zuerst Boot so, daß der 
Chip zum BL hin bootet und erzeugt dann einen Reset für ne Millisekunde 
oder so. Und später kann man dann Boot wieder loslassen (kann, nicht 
muss). Wenn ich mich recht erinnere, macht FlashMagic das so etwa mit 
Boot = 20 ms und Reset = 2 ms. Ist alles völlig unkritisch.

W.S.

von Gerd E. (robberknight)


Lesenswert?

Was mich an dem Konzept irgendwie wundert ist der Attiny. Denn den musst 
Du auch wieder irgendwie programmieren, er nimmt unnötig Platz weg und 
kostet Geld.

Wenn Du schon einen separaten USB-IC wie den CHG430 verwendest und das 
nicht  den STM32 selbst machen lässt, dann kannst Du doch direkt von dem 
USB-IC aus GPIOs für Reset und Boot0 setzen. Ob das der CHG430 kann weiß 
ich nicht, die FTDIs und Silabs CP210X haben zusätzliche GPIOs und 
können es.

von Ralph S. (jjflash)


Lesenswert?

W.S. schrieb:
> Normalerweise zieht je ein Widerstand auf der LP die Reset- und
> Boot-Pins in die für den Normalbetrieb übliche Richtung hi oder lo. Und
> mit dem Programmieranschluß zieht man selbige eben dorthin, wo man sie
> haben will. Zum Start in den Bootlader zieht man zuerst Boot so, daß der
> Chip zum BL hin bootet und erzeugt dann einen Reset für ne Millisekunde
> oder so. Und später kann man dann Boot wieder loslassen (kann, nicht
> muss). Wenn ich mich recht erinnere, macht FlashMagic das so etwa mit
> Boot = 20 ms und Reset = 2 ms. Ist alles völlig unkritisch.

Absolut korrekt.

Aaaaaaber: ich muss den Bootloadermodus händisch aktivieren. Nach dieser 
Methode stellt ein Aufruf der Uploadsoftware diesen Modus automatisch 
ein. So hat mein Makefile bswp. eine Option "all" die das Binary baut, 
und eine Option "flash", die den Upload erledigt.

Ich muss also aus meiner IDE lediglich einen Buildvorgang starten und 
eine andere Option startet mir den Uploadvorgang, ohne dass ich 
irgendwelche Tasten drücken muss, oder Pegel anlegen muss.

Schade, dass das nicht erkannt wird.

Gerd E. schrieb:
> Ob das der CHG430 kann weiß
> ich nicht

Kann er (leider) nicht. Man kann bspw. mit stm32flash auf den RTS und 
DTR Leitungen eine Sequenz stellen, die den Bootloader aktiviert (hatte 
ich so auch schon einmal genacht gehabt). Das hat jedoch leider den 
Nachteil, dass  manche Terminalprogramme den Status von DTR und RTS 
nicht wieder so setzen, wie sie ihn angetroffen haben (allen voran 
PUTTY).

Wie dem auch sei: Dieses Projekt ist wohl nicht von Interesse. Bei mir 
jedoch sind STM32 Platinen entstanden, die den r3 Formfaktors eines 
Arduino UNO haben und die genau wie ein Arduino lediglich einen 
USB-Anschluß zum Betrieb haben. Bei einem Upload muss hier kein einziger 
Taster auf der Platine gedrückt werden.

Vllt. sollte ich mal ein Video machen damit man sehen kann, was ich 
meine.

Gerd E. schrieb:
> Du auch wieder irgendwie programmieren, er nimmt unnötig Platz weg und
> kostet Geld.

Stimmt alles... und er kostet (beim Chinamann) doch glatt 25 Cent. Ein 
FTDI ist deutlich teurer als die Kombination CH340 mit ATtiny13.

von W.S. (Gast)


Lesenswert?

Ralph S. schrieb:
> Aaaaaaber: ich muss den Bootloadermodus händisch aktivieren.

Wie kommst du denn darauf?

Jetzt verstehe ich von deinen Problemen bloß noch mehr 'Bahnhof'.


Also, ich hatte ja vor Zeiten hier mal mein STM32-Brennprogramm 
vorgestellt. Das macht all das glatt von selbst, indem die betreffenden 
Signale der Seriellen programmintern entsprechend bedient werden. Man 
kann im Setup meines Brennprogramms auch diese Signale von Hand testen, 
falls man das mal brauchen sollte.

Fazit: das Applizieren von Reset und Boot direkt von der Seriellen ist 
überhaupt kein Problem. Wozu also willst du das "händisch" tun? Geht 
sowas denn nicht unter Linux?

Und von all den billigen USB-Seriell-TTL-Adaptern, die ich so kenne, 
können eigentlich alle RTS und DTR ausgeben. Es sind bei manchen 
lediglich die betreffenden Pins nicht an irgend einen Anschluß geroutet. 
Bei denen muß man dann eben eine feine Litze oder Draht an den Pin 
löten.

W.S.

von Ralph S. (jjflash)


Lesenswert?

W.S. schrieb:
> Bei denen muß man dann eben eine feine Litze oder Draht an den Pin
> löten.

Auch das ist richtig.

Ich denke, ich habe hier eine "Lösung" für etwas, was nur für mich ein 
(Luxus)_problemchen ist.

W.S. schrieb:
> Also, ich hatte ja vor Zeiten hier mal mein STM32-Brennprogramm
> vorgestellt.

Weiß ich, dass du das hast, aber es ist zum einen ein Windowsprogramm 
und zum Anderen eben aus der eigenen Oberfläche heraus zu bedienen. Ich 
wollte / will ein Kommandozeilentool, welches sich über ein Makefile in 
die Toolchain integrieren läßt.

Ich will eine "Lösung" haben, die boot0 und /reset NICHT direkt mit den 
DTR-RTS Leitungen des seriellen Chips verbindet und ich will eine Plug 
and Play Lösung wie bspw. der Bootloader des Arduino:

Einstecken des USB-Kabels, alle Modalitäten macht das Uploadprogramm.... 
und das bitte/danke für STM32 und NXP.

Wie gesagt, ist das eine Lösung scheinbar für jemanden, der das außer 
mir nicht braucht!

https://www.mikrocontroller.net/attachment/349515/stm32f103cbt6_800x600.jpg

Das hier ist bspw. mein eigenes STM32F103 Board, und außer einem

stm32flash_rts -w meinbinfile.bin -g0 /dev/ttyUSB0

muß ich nichts machen. Den Bootloaderstart erledigt der ATtiny, ganz 
egal was ein Terminalprogramm eventuell mit DTR-RTS macht.

Es funktioniert halt einfach einfach.... ist nachbausicher und stellt 
kein Problem da.

Wie gesagt, scheinbar ist es eben nur eine Lösung die für mich 
Gültigkeit hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.