16.06.2025 R. Seelig |
||||||||||||||||||||||||||||||
Zu allererst: Diese Seite behandelt eine Toolchain-Kette, Funktionen für den CH32V003 und den Aufbau eines DIY Selbstbauprogrammers unter Linux (auch wenn die Programmerhardware unter Windows lauffähig ist, benötigt der Programmer und die Toolchain-Kette eine komplett andere Installation) Die hier beschriebenen Programme und Sourcedateien sowie alle Bilder und Pläne sind - exklusive des Compilers - in einer Archivdatei zusammengefasst, die hier gedownloaded werden kann: Aller Anfang ist schwierig und möchte man mit einem unbekanntem Mikrocontroller starten kommt es unweigerlich zu unterschiedlichen Einstiegshürden. Heutzutage gibt es für Bastler (heißt mittlerweile ja neudeutsch "Maker") jedoch viele Produkte die diesen Einstieg erleichtern und so erklärt sich auch der große Erfolg von Arduino: Einstecken, Programm aufspielen, geht. Für diese Gruppe ist der Selbstbauprogrammer nicht gedacht. Für den, der sich den Einstieg leichter machen und mit einem CH32V003 anfangen möchte gibt es vom Hersteller des Chips ein Entwicklungspaket namens MounRiver Studio welches hier gedownloadet werden kann: Hinweis: Der hier vorgestellte Selbstbauprogrammer ist mit der IDE MounRiver Studio NICHT kompatibel, bzw. kann von dieser IDE heraus nicht gestartet werden. Hier müßte auf Konsolenebene eine erstellte Binary- oder Hexdatei manuell in den Controller übertragen werden. Des weiteren benötigt es zum Programmieren der Firmware des Programmers einen Ardudino UNO / nano oder eines AVR-Systems mit zugänglichen GPIO-Pins und einer USB2UART Bridge. ATmega328, ATmega168, ATmega8 und ATtiny2313 sind in der Lage, die Firmware in den Programmer zu flashen.
Grundsätzlich gibt es vom Hersteller des Chips auch einen sehr günstigen Programmer / Debuger für den CH32V003 zu kaufen, aber hier gibt es schon den allerersten Fallstrick, auf den man hereinfallen kann (und auf den auch der Autor hereingefallen ist): Im Internet werden unterschiedliche Programmer angeboten, die auf den ersten Blick identisch aussehen, es jedoch nicht sind: ![]() Wichtig: Der WCH-Link ohne "E" ist NICHT in der Lage einen CH32V003 zu programmieren und ist wohl ein älterer Adapter, der gerne als WCH-LinkE verkauft wird. Dem Autor wurden insgesamt 3 Stück WCH-LinkE verkauft, die jedoch Programmer ohne "E" waren. Das ist dann auch der Grund, warum der Selbstbauprogrammer aufgebaut worden ist. Unterscheiden kann man die Versionen vordergründig dadurch, dass der Programmer ohne "E" mit einem 16 pol. IC (CH549), der mit "E" mit einem 20 pol. IC (CH32V305) realisiert ist. Dieser Programmer ist natürlich mit dem herstellereigenen MounRiver Studio kompatibel, jedoch auch mit dem hier später vorgestellten Framework CH32FUN auf Kommandozeilenebene.
Um es hier deutlich zu machen: Der Selbstbauprogrammer sowie das CH32FUN Framework sind nicht vom Autor dieses Textes. Das Programm des Programmers sowie das Framework selbst sind auf zwei github- Seiten von Christian Lohr zu finden. Für das Arbeiten mit diesem Text ist ein Download von diesen Seiten nicht notwendig, weil bis auf den Compiler selbst alle benötigten Dateien im Archiv zu diesem Text enhalten sind. Die Linkadressen zu Christian Lohr's Seiten wird hier für denjenigen aufgeführt, der sich evtl. aus den dort erhältlichen Programmen und Dateien sein eigenes Setup "zusammenbasteln" oder sich über weitreichende Beispiele informieren mag: CH32FUN-Framework: https://github.com/cnlohr/ch32fun RVSWIO-Programmer und V-USB: https://github.com/cnlohr/rv003usb
![]() Um mit dem Programmer Zielsysteme sowohl für 3,3V und 5V unterstützen zu können, wurde der Schaltung ein 3,3V Spannungsregler hinzugefügt, die mittels eines Jumpers (voltage selector) oder eines Schiebeschalters umschaltbar ist. Da ein USB-Pegel nur 3,3V Pegel annehmen darf, sind in die D- und D+ Leitungen des USB in allerbester (okay, eher "dirty") V-USB Manier im Stile von bspw. eines USBasp 3,3V Zenerdioden eingefügt worden. Hier sind kleine 1/4W Z-Dioden zu verwenden. Bei leistungsstärkeren ZDioden kann es vorkommen, dass die Kennlinie im Sperrbereich die Spannung nicht steil genug begrenzt und höhere Pegel (bis hinauf zu 3,9V) auf den Leitungen des USB auftreten. Hier arbeitet dann der Programmer nicht richtig, bzw. wird der Programmer vom PC nicht als solcher erkannt und arbeitet demzufolge dann mit diesem auch nicht zusammen. Die Connector-Reihe J3 beherbergt alle Anschlüsse die für den Umgang mit einem Zielsystem benötigt werden:
![]() Hinweis: Der CH32V003 im TSSOP-20 Gehäuse, die Mini-USB Buchse sowie der Spannungsregler AMS1117 3.3 sind auf PCB-Adaptern zu verlöten und diese Adapter dann auf der Lochrasterkarte zu verbauen. Beim Aufbau darauf achten, von den niedrigen Bauteilen zu den höhreren Bauteilen zu Bestücken. Am Besten wird mit den Lötbrücken angefangen. Die Lötseite ist so dargestellt, wie die Verdrahtung aussehen muß, wenn die Platine umgedreht wird.
Vorraussetzungen, um den Programmer und ein späteres Arbeiten mit CH32V003 zu ermöglichen:
Die Reihenfolge für die Inbetriebnahme des Selbstbauprogrammers und der Toolchain für den CH32V003 ist:
Als erstes muß der Compiler aus den oben genannten Quellen gedownloaded und ausgepackt werden. Dieses kann entweder aus dem Desktop heraus mit dem Programm Engrampa, in der Konsole mit dem Midnight Commander oder manuell mittels Befehlseingabe erfolgen. Grundsätzlich kann für den Speicherort des Compilers jedes Verzeichnis gewählt werden, da alle vom Compiler benötigten Dateien relativ zu seiner Verzeichnisstruktur vorhanden sind. Der Autor hat als Speicherort /usr/local gewählt, damit der Compiler für alle Benutzer verfügbar gemacht werden kann. Da mit Emgrampa und dem Midnight Commander das Entpacken menügesteuert ist bedarf es für diese Variante keine weitere Erklärung. Exemplarisch hier also nur das Entpacken in der Kommandozeile: In den Ordner wechseln, in den das Compilerarchiv gedownloaded wurde, sich dort als Superuser anmelden:
xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64Innerhalb dieses Ordners ist ein weiterer Ordner namens bin enthalten. Dort sind alle Programmteile des Compilers gespeichert und der vollständige Pfad zu diesen Programmen lautet dann: /usr/local/xpack-riscv-none-elf-gcc-14.2.0-3-linux-x64/bin/Dieser Pfad ist wichtig, weil er in den Suchpfad eingetragen werden muß, in dem Linux aufgerufene ausführbare Dateien sucht. Für die Aufnahme des Compilerpfades in den Suchpfad gibt es 2 Möglichkeiten. Zum einen ist es möglich, den Suchpfad so zu erweitern, dass alle Benutzer des Linuxsystem diesen Compiler nutzen können. Zum anderen kann der Suchpfad nur für den aktuellen Benutzer erweitert werden. In beiden Fällen sind ist jeweils eine Textdatei zu editieren und um einen Eintrag zu erweitern. Für die Erweiterung des Suchpfades für alle Benutzer ist die Datei /etc/profile als root zu bearbeiten. Ist das Programm Midnight Commander mc und der dazugehörende Editor mcedit auf dem System installiert (auf den meisten System ist das der Fall) kann dieses nach Anmelden auf der Konsole als root mit folgendem Aufruf erfolgen:
Für die Erweiterung des Suchpfades für den aktuellen Benutzer ist die Hidden-Datei /home/benutzername.bashrc zu bearbeiten. Wäre der angemeldete Benutzer bspw. mcu, würde der Aufruf lauten:
Hat man den Editor mcedit verwendet, ist der Eintrag mittels der F2 Taste zu speichern und der Editor selbst kann mit F10 beendet werden. Es ist sinnvoll, zu überprüfen, ob der Compiler richtig arbeitet. Das kann jetzt oder zu einem späteren Zeitpunkt erfolgen, aber es ist empfehlenswert es gleich nach dieser Installation zu erledigen, damit bei einem späteren eventuellen Fehlverhalten gut ausgeschlossen werden kann, dass der Fehler nicht an einem nicht arbeitenden / auffindbaren Compilerprogramm liegt. Zu diesem Zweck startet man den Rechner am besten neu, damit die gemachten Änderungen aktiv sind. Nach dem Neustart des Rechners sollte jetzt der Compiler von jedem Verzeichnisort aufgerufen werden können. Hierzu lässt man sich die Ausgabe der Versionsnummer des Compilers geben und damit ist dann geklärt, dass die Suchpfade richtig gesetzt sind:
Das Archiv hat den Dateinamen ch32v003_gettingstarted.tar.gz und enthält alle benötigten Dateien und kann in ein (fast) beliebiges Verzeichnis entpackt werden. Auch hier kann das Entpacken mittels Engrampa, dem Midnight Comander oder per Befehlseingabe erfolgen. Nachfolgende Angaben in Bezug auf ein Verzeichnis beziehen sich im Text hier immer auf einen Benutzer mcu. Bei Befehlseingaben ist der entsprechende Benutzername anstelle von mcu einzugeben! Beim Entpacken des Archivs wird ein Ordner ch32v003 in dem Verzeichnis angelegt, in den das Archiv ausgepackt wird. Im Beispiel hier ist es das Homeverzeichnis des Benutzers mcu:
minichlink ist das Programm, mit dem der PC über einen Programmer (ARDULINK, der Selbstbauprogrammer oder auch ein Debuger/Programmer von WCH) den Mikrocontroller anspricht und flasht. Dieses Programm liegt im Sourcecode vor und muß compiliert werden. Hierfür wechselt man in das Verzeichnis /home/mcu/ch32v003/minichlink und startet dort make:
Rules: minichlink spricht die Hardware an (USB) und damit ein normaler Benutzer diese Verwenden kann, muß dem Linux gesagt werden, dass ein Benutzer dieses tun darf (nur ein Admin, root oder superuser kann ohne Einschränkung alle Hardware des PC's benutzen). Linux verwendet hierfür sogenannte "Regeln" die im zentralen Konfigurationsverzeichnis /etc/udev/rules.d abgelegt werden. In diesen Regeldateien wird vereinbart, welche Benutzergruppen welche Hardware verwenden dürfen. Im Ordner minichlink ist hierfür die Regeldatei 99-minichlink.rules enthalten, die Hardware für den Selbstbauprogrammer, einen USB-Bootloader für CH32V003 und die originalen Debuger / Programmer von WCH für die Benutzer in den Gruppen "plugdev" und "dialout" freigibt. Diese Regeldatei muß als root nach /etc/udev/rules.d kopiert werden:
Beim nächsten Reboot des PC hat der Benutzer nun die Rechte, Programmer für den Mikrocontroller zu benutzen. Hinweis: Jedes USB-Gerät besitzt eine Produktidentifikationsnumer, PID oder auch idProduct und eine Herstelleridentifikationsnummer, VID oder auch idVendor. Die Regeldatei beinhaltet eine Auflistung genau dieser Identifikationsnummern zum Zugriff auf die Hardware.
Um die Firmware in den Selbstbauprogrammer zu flashen benötigt es einen Programmer, den wir (noch) nicht haben. Hierfür kann man sich mit einem Arduino UNO/nano oder eines AVR-Systems behelfen, welches über einen der Controller ATmega328p / 168 / 88 oder ATtiny2313 sowie einer USB2UART-Bridge verfügt. Hierfür gibt es das AVR-Programm ARDULINK. Dieses Programm ist bereits compiliert und kann mittels eines Scripts in den AVR-Controller geflasht werden. Hierzu wechselt man in das Verzeichnis ardulink und startet dort das Script. Im Script selbst sind Angaben über den zu verwendeten Programmer des AVR, den Anschlußport des Controllers und den zu angeschlossenen Controller selbst zu tätigen. Jede der Eingaben im Script ist mit der Return-Taste zu bestätigen. Hinweis: Originale Arduino's verwenden den Port ttyACM0, die China-Clones haben in aller Regel einen CH340G Chip als USB2UART-Bridge verbaut und verwenden den Port ttyUSB0. Desweiteren werden originale Arduino nano mit einer Baudrate von 57600 Baud, manche Clones mit 115200 Baud betrieben.
Der Arduino ist jetzt ein Programmer für einen CH32V003, der SWIO-Anschluss ist hier PD6 Arduino Pin 6. Mit diesem könnte man jetzt schon arbeiten und grundsätzlich Programme für den CH32V003 flashen (wie es der Autor des Textes zu Beginn mit dem CH32V003 auch getan hat). Allerdings hat der ARDULINK-Programmer einen entscheidenden Haken: er ist schier unerträglich langsam. Für das Flashen eines Programms in der max. Größe von 16 kByte benötigt ARDULINK ca. 80 Sekunden , bis das Programm geflasht ist. Für ein flüssiges Arbeiten ist dieses viel zu langsam und aus diesem Grunde wurde der Selbstbauprogrammer aufgebaut.
![]() Um die Firmware zu flashen verbindet man Pin 6 / PD6 des Arduino's über einen 2,2k Serienwiderstand mit dem self-Anschluß des Selbstbauprogrammers. Der 5V und Masseanschluß GND des Arduinos ist ebenfalls mit dem Selbstbauprogrammer zu verbinden. Um die Firmware für den Programmer zu flashen wechselt man in das Verzeichnis /home/mcu/ch32v003/rvswdio_programmer und startet dort erst make und anschließend make flash:
Da der Arduinoprogrammer sehr sehr langsam ist, wird der Flashvorgang ca. 40 Sekunden dauern. Während dieser Zeit werden (leider) keine Bildschirmausgaben gemacht und es muß einfach auf das Ende des Flashvorgangs gewartet werden. Nach Beendigung des Flashvorgangs ist es geschafft und der Programmer ist betriebsbereit, sofern keine Fehler aufgetreten sind und der Hardwareaufbau ebenso fehlerfrei ist. Nach dem Anschließen des Programmers an einen USB-Port kann überprüft werden, ob der Programmer sich auch am USB anmeldet. Hierfür gibt man in der Konsole ein:
|
![]() |