Blue Pill in Mbed          


Elektronik-Labor  Projekte   


Die Blue Pill Platine mit ihrem 32-Bit-Controller STM32F103C8T6 ist extrem preiswert und verfügt über einige interessante Möglichkeiten. Neben einem 8MHz-Qarz befindet sich auch ein Uhrenquarz auf der Platine. Der Chip hat eine Echtzeituhr, die ich bei anderen Systemen oft vermisst habe. Außerdem ist ein USB2.0-Interface an Board, was viele Möglichkeiten eröffnet.



Für einen ersten Test mit Mbed habe ich Informationen von  Zoltan Hudak gefunden: https://os.mbed.com/users/hudakz/code/STM32F103C8T6_Hello/ Dort findet man auch die Anschlussbelegung. Weil Blue Pill nicht offiziell von Mbed unterstützt wird, muss man das Nucleo-F103RB auswählen. Für einen ersten kleinen Blinker soll die grüne LED auf dem Board an PC_13 angesteuert werden. Compile ist erfolgreich, und man kann das Bin-File laden. Üblicherweise bilden MBed-fähige Systeme eine Art USB-Speicherstick, in das man das File kopiert, damit der Controller sich selbst programmiert. Beim Blue Pill gibt es auch einen andern Meg.



Ich verwende den ST-Link V2, um das File in den Chip zu laden. Dazu gibt es die passende Software bei ST mit dem Namen  STM32 ST-Link Utility: https://www.st.com/en/development-tools/stsw-link004.html Ich hatte am Anfang große Probleme mit einem  fehlerhaftenVerbindungskabel zur Platine. Aber mit der richtigen Verbindung ist alles ganz einfach. Ich lade das Bin-File von Mbed aus dem Download-Verzeichnis. Dann wähle ich Target/Connect und lösche den Chip komplett mit Target/Erase Chip. Nach Target/Program... blinkt die LED.



Ein Vorteil von MBED ist, dass man sehr leicht Code von einem auf das andere System übernehmen kann. Für den Microbit hatte ich mal ein Programm mit AD-Wandler und serieller Ausgabe geschrieben. Das habe ich nun in mein Bluepill-Blinkprogramm reinkopiert, die Anschlüsse angepasst und kompiliert.

#include "mbed.h"

DigitalOut myled(PC_13);
AnalogIn u2(A1);

int main() {
float d[2000];
uint16_t n=0;
for (n=0; n<1000;n++){
d[n]=(u2.read());
}
for (n=0; n<1000;n++){
//printf("%d\r\n",n);
printf("%f\r\n",255*d[n]);
}
myled = 1;
wait(0.2);
myled = 0;
wait(0.2);
}


int xmain() {
while(1) {
myled = 1; // LED is ON
wait(0.2); // 200 ms
myled = 0; // LED is OFF
wait(1.0); // 1 sec
}
}

Um es zu testen, musste ich erst herausfinden, welche der möglichen UART-Schnittstellen nun verwendet wurde und welche Baudrate verwendet wird. Das empfinde ich als Nachteil, in MBed weiß ich manchmal nicht genau, was ich tue, weil viele Details im Hintergrund liegen. Mit dem Oszilloskop habe ich dann gesucht, wo etwas herauskommt. Es war der Pin A2, also offenbar Serial2 TX.  Dort habe ich einen Seriell/USB-Wandler von FTDI angeschlossen. Und an A1 kam ein analoges Signal vom Sinusgenerator. Im Terminal  kommen die gewünschten Daten  mit 9600 Baud an.




Und im Arduino-Plotter sieht man das Messergebnis. Der Sinusgenerator war auf 1 kHz eingestellt. In etwa 5 ms werden also 500 Messwerte erfasst. Die Abtastrate beträgt also ca. 100 kHz.





Elektronik-Labor  Projekte