STM32F1 Interfaceboard
#Einleitung
Dieses Projekt ist dazu da, um einen µC als hardware interface zum PC zu haben, um damit einfache und direkte Steuerungen zu ermöglichen.
- Digital Input/Output
- Analog Input
- Read Unique ID (vom Hersteller vergebene Seriennummer)
- Chip Temperatur (leider ungenau)
- SPI Master (serial peripheral interface mit 8bit/16bit/32bit transmissions)
- 1 Wire RGB LED (WS2812 / APA 106 / Neopixel)
Der STM32 als solches, wurde ja schon bei Einstieg STM32F103 vorgestellt. Das hier vorgestellte Board ist sehr günstig zu haben (teilweise < 3 Euro, früher sogar unter 2 Euro).
#MiniSTM32 (blue pill)
- µC STM32F103C8T6 (64kB Flash, 20KB RAM, 72MHz)
- 2 Quarze: 8 Mhz (für HSE) und 32 KHz (für RTC)
- 2 LEDs (eine für power, eine geht an Pin C13)
- SD-Karten Slot (SPI-Modus)
- 2 Jumper (Boot0 und Boot1)
- USB Buchse
- SWD Anschluss
- 1 Taste für reset
Weitere infos: https://stm32-base.org/boards/STM32F103C8T6-Blue-Pill.html
Es wird eine Serielle (auch RS232 oder UART) Verbindung mit 3.3V TTL Spannungslevel gebraucht. Beide oben zu sehenden RS232/UART Adapter liefern das.
#Hardware vorbereiten
Bevor das Board verwendet werden kann, muss die Firmware auf den Mikrocontroller geflasht werden. Das geht am schnellsten mit SWD und einem Programmer.
Einfacher und ohne extra Hardware gehts aber auch, dafür muss der interne Bootloader verwendet werden.
Es werden 4 Verbindungen gebraucht:
- GND
- 3.3V oder 5V
(ich empfehle die 5V zu nehmen, dann versorgt sich das Board über seinen eigenen Spannungsregler. Man könnte auch die 3.3V vom UART Adapter nehmen, aber damit wird dessen Spannungsregler unnötig stark belastet) - Rx an A9
- Tx an A10
Außerdem müssen die Jumper so eingestellt werden, das beim Verbinden der Mikrocontroller im Bootloader startet, wie auf dem Bild zu sehen.
Dann muss man nur noch wissen, welcher COM Port für den Adapter zugwiesen wurde.
Als nächstes muss das "Serial Tool" gestartet werden.
#Serial Tool (flash Firmware)
- Nach dem starten den COM Port einstellen. Die Software listet nur Ports auf, die geöffnet werden konnten.
(Die Baudrate kann zwar hier auch eingestellt werden, das ist dann aber eher was für fortgeschrittene.) Dann mit "Open" den Port für die Kommunikation öffnen. - Auf das Tab "FlashLoader" wechseln.
- Auf "Run single flash sequence..." klicken und warten.
Idealerweise läuft es komplett durch, jeder zwischenschritt ist nach dem beschrieben, was er dort macht.
Beim "Step 6" zum Beispiel, wird eine Datei erzeugt, die "DownloadedBinary.bin" heisst. Dann werden so viele Bytes von dem µC Chip gelesen, wie die zuvor raufgeladene Firmware hatte. Dann wird der Speicher mit der Firmware Datei byte weise mit dem verglichen, was vom Chip herruntergeladen wurde.
Sollten alle Bytes übereinstimmen, ist damit sichergestellt, das die komplette Firmware erfolgreich übertragen wurde.
Die Firmware wird dann gestartet. Mit dem Tab "Direct" -> "GPIO_Version_PinRemap" und "Read all board Informations" kann direkt los probiert werden.
Nur wenn am USB keine konfig vom PC ausgeführt wurde, werden daten die in die UART1 rein kommen, ausgewertet und interpretiert. In der "SerialTool-STM32Mini.exe.config" kann man Settings wie "COM8" voreinstellen.
Achtung:
Solange der Boot0 auf high ist, wird der µC immer in den Bootloader starten. Damit er aber direkt die Firmware ausführt, sollte der Jumper auf dem Bild links wieder nach unten (auf low) gestellt werden.
#Hid Tool (USB modus)
Das HidTool selbst benutzt viele Usercontrols, die auch beim SerialTool verwendet wurden. Aber es gibt auch ein paar Besonderheiten:
- Wärend beim SerialTool jedes µC-Board seinen eigenen COM Port braucht, können beim HidTool mehrere Boards abwechselnd benutzt werden.
- µC Boards können nach ID (eindeutig) oder nach Typ (init Config, mehrfach) ausgewählt werden.
- UART1 ist beim SerialTool zum flashen der Firmware und zur Kommunikation. Beim HidTool ist es ein zusätzlicher serieller Port, der von der Software wie ein Terminal benutzt werden kann.
- Beim HidTool ist der Zugriff nicht blockierend, es ist möglich, das 2 oder mehrere Tools auf das gleiche Board zugreifen. Dass kann zu Problemen führen, wenn gleichzeitig Zugriffe stattfinden (da gibts dann Fehlermeldungen und Timeouts). Aber es hat auch den Vorteil, das man bei einem Fenster was digital umschaltet, oder per SPI sendet, während im anderen Fenster ein paar Analogwerte automatisch ausgelesen werden.
HID (human interface device) ist ein USB Modus, der auch für Maus und Tastatur verwendet wird und ohne extra Treiber funktioniert.
Daher kann man an irgend einem Windows PC (ab Win XP) das Board ran stecken und braucht nur noch das Tool starten.
Funktioniert nur, wenn die Firmware drauf ist und das Board nicht in den Bootloader startet.
Manchmal funktioniert die USB verbindung nicht beim ersten mal, Windows meldet dann "USB Gerät nicht erkannt", dann einfach kurz raus ziehen und wieder rein stecken.
#UART1 mit USB-HID
Hier ein kleiner Test, wo beide Tools auf das gleiche µC Board verwendet werden.
Wie man sehen kann, wird der UART1 des Boards von beiden Seiten bedient.
Das SerialTool ist in diesem Fall nicht weiter benutzbar. Denn nur wenn keine USB Verbindung erkannt wurde, werden Daten die über UART1 rein kommen interpretiert.
Mit aktiver USB Verbindung, werden Daten einfach an den PC weitergeleitet (egal, ob ein HidTool läuft um die Daten zu empfangen).
Als USB Verbindung zählt ein vom PC konfigurierter HID Zugang.
Wenn man nur ein USB Ladegerät anschließst, kann man das SerialTool ohne Probleme verwenden.
Es werden im HidTool alle gefundenen Boards aufgelistet, alle haben die gleiche VID(0xCAFE) und PID(0x5EED). Eine Verbindung kann zu jeweils einem Board pro Fenster hergestellt werden. In der "HidTool-STM32Mini.exe.config" kann zwischen 3 automatischen Verbindungsarten gewählt werden.
- "SelectHidAnyDevice" -> nimmt das erste Board, das gefunden wird. Sinvoll wenn man nur eins hat.
- "SelectHidByInitType" -> nimmt das erste Board, bei dem der InitType passt.
- "SelectHidBySerial" -> nimmt nur das Board, bei dem die Seriennummer passt.
InitType und Seriennummer werden an den USB Descriptor übergeben, sie sind also im System verfügbar, sobald Windows das Hid Device konfiguriert hat.
#InitType (start setup)
Damit unterschiedliche Startzustände ohne verschiedene Firmware versionen erreicht werden, wurden 3 Pins so eingestellt, dass sie beim starten abgefragt werden. So kann man von außen mit entsprechender Belegung 8 verschiedene Startzustände (InitType) erreichen. Der eine Pin ist der Boot1, die anderen 2 sind C14 und C15, die beide den RTC betreiben.
- InitType 1 Input mode(RTC, input)
- InitType 2 In2 (unused, input)
- InitType 3 In3 (unused, input)
- InitType 4 In4 (unused, input)
- InitType 5 Output mode (RTC, SPI Master)
- InitType 6 Motion mode (für bis zu 3 Schrittmotoren)
- InitType 7 NI Card mode (USB-8451 ersatz, experiementell)
- InitType 8 Out8 (unused, input)
Gilt für Firmware Version: 1.0.4
Für alle gilt außerdem:
Uart1 (A9,A10) auf 115200 baud
Uart3 (B10,B11) auf 38400 baud (für Flir Wärmebildkameras)
RGB LED (B8)
USB (A11,A12)
RTC (real time clock):
nur wenn C14 und C15 offen sind (InitType 1 oder 5) ist der aktiv.
Dann wird die LED (am C13) jede Sekunde umgeschaltet. Außerdem wird eine 32bit Variable jede Sekunde nach oben gezählt.
Das sind 4294967295 Sekunden, also 136.1925 Jahre... auf jeden fall lang genug.
#Version 1.0.4
Das erste Release hat noch einige "Verbesserungspotentiale", aber es bietet schon viele Einsatzmöglichkeiten.
Die I2C funktionen sind zum Beispiel noch nicht Verfügbar, aber am Pin schonmal vorgesehen.
API (MiniStm32JoeC_CoreLibrary.dll):
Ich habe möglichst viele Funktionen in eine API Library gepackt. Für das Auslesen und modifizieren der Pins gibt es ein Usercontrol, für das Lesen der ADC pins ebenfalls und auch für die SPI Master funktionen. Dadurch können beide Tools auf viele Funktionen gleichermaßen zugreifen. Vor ein paar Jahren waren beide Tools noch eigenständig.
Die API Library kann auch für eigene Projekte verwendet werden.
desktopapplication source 104 (ZIP, 543.52 KB)
Enthält die Projektdatei (Visual Studio) für die beiden Tools und die gemeinsame API.
ministm32joec fullbundle v104 (ZIP, 5.82 MB)
Hier sind HidTool und SerialTool als ausfürbaren Programme, die Firmware für 1.0.4 und eine Pinbelegungs Excel. Außerdem sind Treiber für die oben zu sehenden USB-Seriell Adapter dabei.
#SensedMaster
Der SensedMaster ist eine besondere Variante des InitType_5, bei den die Chipselects und SPI Steuerleitungen zusätzlich mit analogen Inputs verbunden sind.
Es gibt eine extra "Scan Funktion" um die Signallevel der Leitungen zu prüfen. Dabei wird der SPI Pin umgeschaltet, kurz darauf wird der dazu gehörige (auf dem Board verbundene) Analoge Eingang gelesen und gespeichert.
Für jeden Pin-Scan werden 4 Analoge werte geliefert. Daran kann man dann ablesen, wie gut oder schlecht der entsprechende Signalpegel erreicht wurde.
Signal Scan Funktion (für jeden SPI Pin):
- Speichern des aktuellen PinModus (ob Output/Input)
- Pin auf Digital Output Low, dann Analogwert lesen
- Pin auf Digital Input mit PullDown Widerstand, dann Analogwert lesen
- Pin auf Digital Output High, dann Analogwert lesen
- Pin auf Digital Input mit PullUp Widerstand, dann Analogwert lesen
- Pin wieder auf startzustand zurück stellen
Die 4 Ergebnisse pro Pin werden in der Tabelle aufgelistet.
Sie zeigen wie gut ein digitaler High / Low Pegel erreicht werden kann.
Wenn die ersten 2 ihre Pegel nicht erreichen, wird die SPI Kommunikation möglicherweise nicht funktionieren.
Wenn nur die zweiten 2 Pegel nicht passen, kann es sein das zusätzliche Pullup/Down Widerstände in der Schaltung sind... oder das irgend eine Pappnase mit den Fingern auf dem Board rum grabbelt!
Jedenfalls ist die warscheinlichkeit deutlich höher, das die Kommunikation funktioniert.
Mit dieser Scan funktion kann man Kurzschlüsse gut erkennen. Das Beispiel unten entstand durch eine Pinzette, die einen der Pins mit GND kurzschloss. Als Folge kann der Low Pegel gut erreicht werden, der High Pegel aber nicht.
Zuletzt geändert am: Sep 30 2022 um 9:47 AM
#Version 1.2.0
Bei dieser Version wurden möglichst viele Teile als eigenständige Usercontrols angelegt.
Sie können daher über beide Anwendungen MiniStm32JoeC_SerialTool und MiniStm32JoeC_HidTool fast gleich bedient werden.
MiniStm32-HalfBundle-V-1-2-0.zip
Enthält beide Anwendungen als EXE und die FW zum flashen.
Außerdem noch eine STM32_Pinout.xlsx
MiniStm32-DesktopApplication_V1-2-0.zip
Enthält den Sourcecode beider Anwendungen und der API library MiniStm32JoeC_CoreLibrary.dll.
Wer noch die Treiber für die oben gezeigten Seriellwandler braucht, muss auch noch die größere ministm32joec_fullbundle_v104.zip herrunterladen.
#Neopixel (RGB-LED)
Beide Apps benutzen im Tab "[Ext] RGB-LED" ein gemeinsames Usercontrol zum ansteuern der Neopixel RGB-LEDs am Pin B8.
Über die Tabelle kann man einzelne Farben zuweisen, ansonsten werden typischerweise alle 8 LEDs mit der gleichen Farbe versehen. Entweder per klick auf eine Farbe oder mit den Schieberegler alle in weiß und unterschiedlicher Helligkeit.
Ich habe hier eine LED leiste mit 8 Pins und eine einzelne mit externen Chip im Einsatz. Hier sieht man auch gleich, das es 2 Typen gibt und bei manchen R und G vertauscht sind.
#I2C Master
Der I2C Master ist bei dem Modell etwas speziell, ich hab nach einigen versuchen aufgegeben es stabil hin zu bekommen, man kann im "errara" nachlesen, was das Hardwareproblem ist:
es0340-stm32f101xcde-stm32f103xcde-device-errata-stmicroelectronics.pdf
Ich habe mich dazu entschlossen, eine Timerbasierte-Bitbang-Lösung zu implementieren.
Hier wird über einen Timer regelmäßig ein Interrupt erzeugt und es werden die IO-Pins direkt umgeschaltet. Ein paar Variablen Händeln das ganze umschalten.
- Nachteil
Es ist langsam, nur bis zu 200khz sind so machbar und es lastet den Rechenkern mehr aus. - Vorteil
Es läuft recht stabil und ist flexibel. Verwendet werden die normalen I2C Pins, aber die können auch auf andere Pins remaped werden.
Möglich für DATA: A0-A7 und B0-B7 (Default: B7)
Möglich für CLK: A0-A15 und B0-B15 (Default: B6)
...gilt natürlich nicht für bereits anderweitig benutze Pins wie UART oder USB
Natürlich ist auch dieser Block als User Control für beide Anwendungen gleichermaßen zur Verfügung gestellt.
Es gibt auch ein zweites User Control, das für einzelne Chips ist, die gerade bei mir so rum lagen und bei der Gelegenheit mit Implementiert wurden.
Der Sensed-Master wurde für I2C erweitert. Außerdem wird jetzt auch die Vref zuvor gelesen und basierend darauf wird die Pinspannung berechnet und angezeigt.
So lässt sich "0.08V" auch besser lesen als "114" counts.
Diese Änderung wurde auch auf den SPI-Master übernommen.
Es gibt auch eine Slave-Scan Funktion, womit man sich auflisten lassen kann, welche Chips auf dem Bus antworten.
Standard ist ein Write Scan, aber man kann auch eine Read Scan machen, dabei wird dann aber 1 Byte gelesen und verworfen, weil einer der Temperatursensoren zeigte, das er sonst den Bus Blockiert.
Hier kann man nach Addresse suchen: https://i2cdevices.org/addresses
oder auch: https://learn.adafruit.com/i2c-addresses/the-list
#Motion (Schrittmotor)
Die Schrittmotoren werden jeweils über einen A4988 Motor Treiber angesteuert.
Weitere Infos hier: RCWI-Beta
Es sind 3 Variablen mit 16 bit für die Position vorgesehen, es können also maximal 65535 Schritte gezählt werden, für mich ist es genug (zumindest aktuell).
Es werden immer STEP und DIR von allen Motoren gleichermaßen umgeschaltet, aber es bewegt sich immer nur der Motor, der mit Enable auch aktiviert wurde.
Inzwischen gibt es auch eine "Homing Funktion".
Hierbei wird der Motor so lange in eine Richtung bewegt, bis ein Endschalter auslöst. Dann wird so viele Schritte zurück gefahren, wie zum erreichen des Endschalters notwendig waren. Am ende stehen die Motoren also wie vorher, aber nun ist ihre absolute Position bekannt und man kann einzelne Positionszustände lesen und anfahren.
Es sind 3 Kanäle vorgesehen und momentan unterstützt:
- links / rechts
- hoch / runter
- nah / fern (motor focus)
#Script
Die Script Funktion ist ein textbasierter Kommando Interpreter zum einfachen erstellen von Abläufen.
Damit kann man schnell Sequenzen erstellen und optimieren, bevor man sie implementiert.
Sequenzen lassen sich als TXT Datei laden und speichern.
Verfügbare Kommandos lassen sich im log anzeigen.