STM32 Flash Tool

Hier behandelt wird ein Tool zum Programmieren von 32-Bit ARM Cortex-M Prozessoren der Firma STmicroelectronics.

Motivation

Das Programmieren von Mikrocontrollern ist ein mitunter komplizierter Vorgang, der spezielle Schnittstellen und extra Hardware erfordert. Daher gibt es Bootloader, kleine Programme die im Controller/Prozessor liegen und die Kommunikation sowie das Programmieren übernehmen. Normalerweise muss man selber erst einen Bootloader flashen, ST spendiert aber seinen STM32 Prozessoren schon einen Bootloader, der bei der Produktion geflasht wird. Die Nutzung dieses Bootloaders ist also recht interessant, da man sich so einiges an teuren Tools ersparen kann. Der Bootloader kann über eine der UARTs(Serielle Schnittstellen) oder USB angesteuert werden, hat man also schon so eine Schnittstelle im Projekt macht es die Sache um so interessanter.

Hardware Anforderungen

Wichtige Informationen zum Bootloader entnimmt man den Application Notes AN2606 und AN3155, sowie dem Datenblatt des verwendeten Controllers und dem Reference Manual. Um den Bootloader zu aktivieren muss die Boot-Konfiguration an den BOOTx-Pins stimmen. Da der Bootloader nicht automatisch in den User-Code springt, muss man eine Umschaltung in das Design einplanen. Diese kann aus einer Lötbrücke, Jumper oder einen Wechsel durch ein elektrisches Signal erfolgen. Ganz wichtig ist, vorher genau nach zu lesen, wo sich die Boot-Pins befinden. BOOT0 ist in der Regel als eigenständiger Pin verfügbar, BOOT1 kann per Softstrapping an einen anderen Pin geknüpft und muss während des Startens auf GND gezogen werden!
Zudem wird die zu verwendende Schnittstelle benötigt. Bei den UARTs muss man beachten, dass für eine Serielle-Verbindung entweder ein anderer UART oder ein Pegelwandler auf RS485 oder RS-232 eingesetzt werden muss, den Anforderungen entsprechend. Wichtig zu Beachten ist, dass mitunter nicht alle UARTs oder USB-Schnittstellen verwendet werden können. Daher ganz genau im AN2606 nachlesen, was für den genauen Typ Controller nutzbar ist. Auch sollte man zusehen, dass die ungenutzten USART-RX Pins auf einem definierten Potential liegen.

Software Anforderungen

Das hier vorgestellte Tool wurde auf Python 3.3 portiert und getestet, mit früheren Versionen wird es nicht zusammenarbeiten. Zudem muss im Build-Prozess eine *.bin Datei erstellt werden. Die meisten IDEs erzeugen aber nur elf/hex Files. Es gibt zum einen Tools wie „hex2bin“, die diese Dateien konvertieren können, man kann aber auch nach Möglichkeit nach dem Buildprozess folgendes(oder ähnliches einbauen):

arm-none-eabi-objcopy -O binary $(TARGET_OUTPUT_DIR)/$(TARGET_OUTPUT_BASENAME).elf $(TARGET_OUTPUT_DIR)/$(TARGET_OUTPUT_BASENAME).bin 

Dies wurde von mir(cloidnerux) nur mit Em::Blocks 1.44 und dem ARM GCC Compiler EmBLocks - bare-metal getestet und verifiziert. Andere Compiler und IDEs können abweichen.

Vorstellung: STM32F207 RS-232 Programmieradapter

Ich habe um meinen STM32F207ZTG TQFP-144 zu Programmieren folgende Schaltung implementiert:

STM32 Programmierhardware Widerstand R1 gehört zum regulären Reset-Schaltkreis. Die Diode D1 sorgt dafür, dass Reset nur gegen GND gezogen wird, nicht jedoch über 3,3V.
R5 und R4 sorgen dafür, dass BOOT0 immer einen festen Pegel hat. Der Transistor Q1 sorgt dafür, dass man BOOT0 auf High schalten kann, sobald man RTS auf High setzt. Dabei wird keine Pegelwandlung vorgenommen, sondern nur über einen abgewandelten Spannungsteiler die Spannung zwischen 0 und 5V hin und her geschaltet. Der Transistor sorgt zudem für Schutz vor den negativen Spannung auf den RS-232 Leitungen. Der Rest ist quasi standard Beschaltung. Beachten sollte man noch, ob die verwendeten Pins 5V tolerant sind, da der MAX232 nur mit 5V Versorgungsspannung funktioniert. Wenn man einen Prozessor hat, der keine 5V Toleranten Pins hat, muss man extra Hardware(Stichwort Pegelwandlung) mit einplanen.
Die hier gezeigte Schaltung erlaubt es, dass man direkt Programmieren kann ohne irgendwelche Jumper zu setzten oder sonstige Eingriffe in die Hardware.

Programmiertool

Das Programmiertool ist in Python geschrieben und stammt ursprünglich von Ivan A-R und wurde von mir auf Python 3.3 portiert und getestet.
Es kann passieren, dass dieses Tool für den gerade verwendeten Controller nicht funktioniert.
Das kann daran liegen, dass die Speicher Erase-Funktion anders ist. Die An3155 nennt zwei mögliche Funktionen(0x53 und 0x44), die Exklusiv sind, entweder hat ein Controller die eine, oder die andere. Das Tool wird zuerst die ID und die möglichen Funktionen abrufen, sollte in der Auflistung 0x43 statt 0x44 stehen, so muss man in Zeile 197 in der Funktion

 cmdEraseMemory

den Code von 0x44 auf 0x43 ändern, sowie die Bytes die unterhalb von

 # Global erase 

stehen. Näheres dazu in der AN3155.
Hier der Code: STM32 FLash Tool
Ein typischer Aufruf sieht folgendermaßen aus:

 stm32loader-py -p COM8 -b 115200 -e -w -v firmware.bin



Fragen, Wünsche und Anmerkungen bitte im Forum-Thread hierzu stellen.