STM32F103C8T6 STM32 Billig Board
Übersicht
Bei Aliexpress, Ebay & Co gibt es bereits ab 2 EUR (1.84€ [19.07.2017], 2.73€ [12.10.2024]) ein minimalistisches STM32-Board. Auf Ebay im Suchfeld Suchfeld einfach "STM32F103C8T6" eingeben.
Eckdaten:
- STM32F103C8T6
- 64k Flash (viele C8 besitzen in wirklichkeit 128k Flash), 20k RAM
- Micro-USB, ISP Header (SWDIO)
- 8MHz System-Quarz, 32.768kHz RTC Quarz
- BOOT0/BOOT1 Jumper
- RESET Button
- Power LED, LED an GPIO
Dieses Board ist unter anderem auch unter dem Namen Blue Pill bekannt. Zwei ähnliche Boards nennen sich "Black Pill" und "Red Pill". Mit den Stiftleisten eignet es sich wie ein Arduino Nano für das Steckbrett und mit der USB-Buchse kann man es sicher wie einen Arduino Nano direkt vom PC aus programmieren. Doch halt:
Der STM32F103C8T6 kostet bei ST schon in 1000er Stückzahlen 3.40€. Auf den Boards ist also kein STM32F103C8T6 drauf sondern irgendeiner seiner chinesischen Clone oder gleich gar kein Chip im Gehäuse.
Ausserdem fehlt den Boards der Bootloader, um über USB programmiert werden zu können, man braucht also zumindest um den STM32duino genannten Bootloader aufzuspielen (ähnlich wie bei nicht als Arduino verkauften AVR) erst mal einen Programmieradapter namens ST-Link zumindest Version V2. Auch die gibt es billigst über eBay, 4.75€ 12.10.2024 aber auch da sind viele Fakes unterwegs. Die IDE von ST möchte meist eine neue Firmware hochladen und das klappt dann nicht und der Programmieradapter ist unbrauchbar.
Man ist also gut beraten, für den Einstieg entweder ein Original Nucleo Board von ST zu erwerben, bei dem man den ST-Link genannten Programmieradapter gleich als abbrechbaren Platinenrand dazu bekommt, oder ein "BlackPill" Board von RobotDyn, liegt 12.10.2024 bei 8.90€.
Schaltplan
Es scheint verschiedene Versionen dieses Boards zu geben und das sorgt für Verwirrung. Bei der geringen Anzahl an Bauteilen sollte man genau mit Fotos und Schaltplan vergleichen. Am besten jeden Bauteilwert verifizieren.
Der Hersteller scheint eine Website unter der Domain vcc-gnd.com gehabt zu haben, dort gab es einen Schaltplan, der noch im Netz umgeht (Datei:Vcc-gnd.com-blue-pill-schematic-stm32f103c8t6.pdf).
Der User Eddy Current (chrisi) hat dafür in diesem Thread einen Schaltplan gepostet (Datei:STM32 Min System Dev Board.pdf).
Inbetriebnahme und Test
Die onboard-LED an PC13 kann man für erste Lebenszeichen verwenden. Hier gibt es ein kleines blinky-Programm https://github.com/spacerace/stm32f103c8t6-blinky im Quellcode und stm32f103c8t6_blinky.bin zum direkten schreiben wenn man ein funktionierendes Board und einen funktionierenden ST Link hat.
Es gab die Software ST-LINK Utility, heute liefert ST den bunteren STM32CubeProg(rammer). Aus der STM32CubeIDE kann der Debugger programmieren. Aber das funktioniert meist nicht, weil die Default-Einstellung in Menü Run Eintrag Debug Configurations Reiter Debugger bei Reset Behaviour auf Connect under Reset steht, aber der ST Link V2 keine RESET Leitung zum BluePill Board führt, an dessen Programmieranschluss ist das Signal ja gar nicht vorhanden. Also muss man während des Programmiervorgangs den kleinen RESET Knopf auf dem Board gedrückt halten, oder die Einstellung auf Core Reset ändern. Immerhin ist egal wie die beiden Jumper stehen.
Kein Wunder also, wenn der STM32 nicht so beliebt ist wie der Arduino.
128k Flash
Wie gehe ich vor um zu testen ob mein STM32F103C8T6 Mikrocontroller wirklich 128kByte Flash besitzt?
Bei der Vorgehensweise hier wird angenommen dass:
- OpenOCD installiert worden ist (unter Windows lautet der Pfad etwas anders) - ein "ST-Link V2" Programmieradapter verwendet wird - das STM32 Board richtig mit dem "ST-Link V2" verbunden wurde (4 Leitungen, 3.3V, GND, SWDIO, SWCLK)
Die Schritte:
0. // Den verfügbaren Flash-Bereich im OpenOCD Script für den STM32F103 ändern :
In der Datei "/usr/share/openocd/scripts/target/stm32f1x.cfg"
Die Zeile mit einer Raute auskommentieren:
#flash bank $_FLASHNAME stm32f1x 0x08000000 0 0 0 $_TARGETNAME
und durch diese hier ersetzen:
flash bank $_FLASHNAME stm32f1x 0 0x20000 0 0 $_TARGETNAME
(habe auch noch "adapter_khz 1000" auf "adapter_khz 950" gesetzt, weil der mini ST-Link V2 eh nur diese Option hat)
1. // Verbindung zum St-Link V2 (im 1. Terminal-Fenster) aufbauen :
openocd -f board/board.cfg
2. // Die Debug-Verbindung (im 2. Terminal-Fenster) öffnen :
telnet localhost 4444
Ausgabe:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
>
[Jetzt werden in die gerade geöffnete Telnet-Konsole einige Befehle eingegeben.]
3. // Den Debuger anhalten :
reset halt
Ausgabe:
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x080036a0 msp: 0x20005000
4. // Die verfügbare Flash-Größe abfragen :
flash probe 0
Ausgabe:
device id = 0x20036410
ignoring flash probed value, using configured bank size
flash size = 128kbytes
flash 'stm32f1x' found at 0x08000000
5. // Bild (Bio-Hazard-Zeichen) in den Flash schreiben :
(das 131072 byte große Bild [mit einem .bin als Dateiendung] liegt hier einfach direkt im Home-Verzeichnis des Nutzers)
flash write_image erase bh20k.bin 0x08000000
Ausgabe:
auto erase enabled
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000003a msp: 0x20005000
wrote 131072 bytes from file bh20k.bin in 4.054750s (31.568 KiB/s)
6. // Bild aus dem Flash wieder zurück lesen :
dump_image dump.bin 0x08000000 0x1ffff
Ausgabe:
dumped 131071 bytes in 2.470239s (51.816 KiB/s)
7. // Beenden :
exit
Ausgabe:
Connection closed by foreign host.
8. // OpenOCD mit STRG+C beenden
Jetzt wird die ausgelesene Datei "dump.bin" zu "dump.bin.bmp" umbenannt weil das eigentlich nur eine Bitmap-Datei ist. Man vergleicht dieses Bild mit der "bh20k.bin.bmp", welche zuvor in den Flash geschrieben wurde. Wenn der obere halbe Teil des Bildes nicht vorhanden ist (weißer Bereich), dann hat der Chip nur 64kByte Flash.
Die verwendete board.cfg sieht so aus:
source [find interface/stlink-v2.cfg]
set WORKAREASIZE 0x4000
# Disable debug when in low power modes
set ENABLE_LOW_POWER 0
# Stop Watchdog counters when halt
set STOP_WATCHDOG 0
# use software reset
reset_config none separate
set CONNECT_UNDER_RESET 0
source [find target/stm32f1x.cfg]
Das komprimierte Bitmap-Testbild "BioHazard-Symbol" mit der .bin - Dateiendung:
In System Programming/Programmer
Durch den SWDIO Header lässt sich das Board sehr einfach per ST-Link und kompatiblem Programmern schreiben/lesen. Mit einer passenden Firmware lässt sich dieses Board auch ST-LinkV2 verwenden.
USB PullUp Problem
R10 ist auf vielen Boards mit 10k bestückt worden und sollte aber ein 1k5 Widerstand sein. Dadurch muss nach jedem Reset das Board ab- und wieder angesteckt werden. Man hat nun zwei Möglichkeiten, man wechselt R10 aus oder schliesst einen 1k8 parallel zu R10 an. Nun hat man wieder die Möglichkeit das an-/abstecken per Software vorzugeben.