Forum: Mikrocontroller und Digitale Elektronik Problem: CH32V003 läst sich nicht (mehr) flashen


von Reinhard R. (reirawb)


Angehängte Dateien:

Lesenswert?

Hallo Forengemeinde,

Wenns dem Esel zu wohl wird, geht er aufs Eis.

oder etwas positiver formuliert

Man ist alt wenn man nichts Neues mehr anfängt.

In einem Anflug von Größenwahn habe ich mir zum Probieren ein Set mit 
einem Testboard mit CH32V003 + Programmer bestellt (habe bisher nur 
Atmels verwendet). Erste Gehversuche mit dem MounRiver-Studio waren auch 
erfolgreich, das Blinkprogramm aus dem GPIO_Toggle-Beispiel tut was es 
soll. Ich habe dann auch noch ein paar Änderungen am Programm 
ausprobiert. Tat soweit alles wie es sollte, bis plötzlich das Schreiben 
auf den Flash beim nächsten Versuch nicht mehr funktionierte.

Fehlermeldung siehe Meldung_3.jpg. Das Compilieren funktioniert ohne 
Fehler (Meldung_1.jpg), die dabei auftretenden Warnungen sind IMO 
irrelevant (Meldung_2.jpg). Ich interpretiere die Meldung so, das der zu 
flashende Prozessor nicht erkannt wird. Das zuletzt geflashte Programm 
blinkt weiter lustig vor sich hin, der Prozessor läuft also noch.

Was habe ich bisher versucht?
- Firmware des WCH-LinkE neu geflasht, Programmer wird erkannt und 
Firmware ist aktuell (Meldung_3.jpg)
- Windows-Treiber neu installiert
- in den Project-Properties gesucht, ob dort ein falscher Prozessor 
eingetragen ist, ist OK
- Das originale GPIO_Toggle-Programm (ohne meine Änderungen) neu geladen
- Verkabelung erneuert, China-Dupondkabel gegen sebst gecrimptes und 
durchgemessenes Kabel ersetzt (ca.12 cm lang, siehe Aufbau.jpg).
- Programmiersignal getestet, direkt am Prozessorpin, siehe Signal.jpg

Was mir sonst noch einfällt:
- MounRiver-Studio deinstallieren und neu installieren
- Den Prozessor auf dem Testboard tauschen (allerletzte Option)

Habt ihr noch eine Idee?

Gruß und einen guten Rutsch ins neue Jahr

Reinhard

von Harald A. (embedded)


Lesenswert?

Du hast ja eine Menge guter Schritte bereits durchgeführt, deine 
allerletzte Option käme bei mir jetzt als nächste dran. Hast Du 
Ersatz-CPUs zur Hand?

: Bearbeitet durch User
von Maxe (maxemaxe)


Lesenswert?

Nach deinem Foto hast du ja gar keinen Programmieradapter im Einsatz, 
sondern nutzt die Serielle Schnittstelle? Ich denke, dass dann mit dem 
Bootloader etwas nicht stimmt, vielleicht war der vorinstalliert und ist 
nun überschrieben, oder es muss ein passender Jumper gesetzt werden. 
Dagegen spricht, dass es schon funktioniert hat, aber das wäre schon mal 
eine Richtung in die man schauen kann. Also im Datenblatt schauen, wie 
die Programmierung über die Serielle funktioniert.

von Reinhard R. (reirawb)


Angehängte Dateien:

Lesenswert?

Harald A. schrieb:
> Hast Du
> Ersatz-CPUs zur Hand?

Ja, in dem Paket waren noch 5 Chips mit drin. Aber dieses Jahr wechsele 
ich nicht mehr ;-)

@Maxe

Doch, das ist der zum Paket gehörende Programmieradapter. Der Anschluß 
ist 2-reihig, kontaktiert habe ich die untere Reihe, die Beschriftung 
die du siehst gilt für die obere Reihe. Ich habe mal die Rückseite 
fotografiert. Angeschlossen sind nur GND, 3V3 und SWDIO, SWCLK wird beim 
CH32V003 nicht benötigt.

Aber wie gesagt, es hat ja schon funktioniert, ca. 20 Schreibzyklen sind 
gelaufen, auf einmal ging nichts mehr. Ich hatte nur eine kleine 
Änderung im Programm, weder das Studio geschlossen noch sonst irgendwas.

Ich habe noch mit dem WCH-LinkUtility ein paar Versuche gemacht, es 
gelingt keine Verbindung zum CH32V003 (Meldung_4.jpg).

Also doch Chip tauschen, Mach ich gleich nächstes Jahr ;-)

OK, Ich gehe jetzt feiern, rutscht gut rein.

Gruß

Reinhard

von Harald A. (embedded)


Lesenswert?

Irgendwo hatte ich doch gelesen, dass diese Chips eine außergewöhnlich 
niedrige Anzahl an Programmiervorgängen spezifiziert haben. Spekulation: 
Flash-Technologie war ja lange Zeit eine Technik, die nur wenige Firmen 
beherrscht haben. Natürlich haben wir diese Zeiten hinter uns gelassen, 
aber vlt. sind die bei WCH noch nicht ganz so weit.

von Reinhard R. (reirawb)


Lesenswert?

Habe ich auch schon dran gedacht, aber lt. Datenblatt hat der min. 10k 
und typ. 80k Schreibzyklen. da sind 20 ein bischen wenig :-(

Andererseits, Datenblätter sind geduldig...

Reinhard

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Es gibt mittlerweile 4 verschiedene WCH-Link Module welches hast du 
Link_E?
Dann solltest du im WCH Utility auch diesen Link_E einstellen.
Wenn ich richtig informiert bin hat der V003 eine verkrüpelte SWD 
Schnitstelle ohne Clock die nur vom Link_E korrekt bedient wird.

Dein Screenshot zeigt jedenfalls dass du RISC-V Link #1 ansprechen 
willst.
Diese verschiedenen Links sind ein Problem zumal die Software zum 
erkennen der div Links ziemlich buggy ist.

https://www.wch-ic.com/downloads/WCH-LinkUserManual_PDF.html
bzw in CN only für den Link_E
https://www.wch. cn/uploads/file/20231103/1698980799168976.pdf

von Uwe G. (scd)


Lesenswert?

Hallo Reinhard,

Vielleicht hast Du Dir Reset oder swdio wegprogrammiert.

Versuch mal das hier:

https://www.mikrocontroller.net/topic/7358147

Edit: link funktioniert nicht, hier den letzten Beitrag beachten: 
Beitrag "CH32V003 – Ressourcen und Beschnupperung der HAL"

: Bearbeitet durch User
von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

In dem Bild "meldung_3" steht aber was von "CH32V305" erkannt und nichts 
von einem "CH32V003". Überprüf das mal...

von Harald K. (kirnbichler)


Lesenswert?

Thomas Z. schrieb:
> Es gibt mittlerweile 4 verschiedene WCH-Link Module welches hast du
> Link_E?

Steht übrigens im ersten Beitrag im Thread - WCH-LinkE.

Einstellen muss man da in mounriver studio übrigens nichts, das erkennt 
selbst, was für ein Programmieradapter dransteckt und gibt sogar 
halbwegs sinnvolle Fehlermeldungen aus.


Irgend W. schrieb:
> In dem Bild "meldung_3" steht aber was von "CH32V305" erkannt

Das ist schon in Ordnung, das beschreibt das "Link Device", mit anderen 
Worten: Den Programmieradapter.

Uwe G. schrieb:
> Vielleicht hast Du Dir Reset oder swdio wegprogrammiert.

Reset (PD7) wird beim CH32V003 nicht zur Programmierung verwendet.
PD1 aber ist kritisch.

Was also war die letzte Änderung am Code?

von Reinhard R. (reirawb)


Angehängte Dateien:

Lesenswert?

Hallo an die versammelte Forengemeinde,

zuerst wünsche ich Allen ein frohes und gesundes neues Jahr.

zum Zweiten, es geht wieder, der CH32V003 auf meinem Testboard ist nicht 
defekt.

Nach dem bekannten Motto: "Eigene Schuld ist Goldes wert" habe ich -auch 
durch eure Anregungen- meinen letzten Code nochmal gesichtet und habe 
festgestellt, dass ich meine Vereinfachungen zu weit getrieben hatte und 
versehentlich die gesamten Ports C und D -außer den genutzten Ausgängen- 
auf
analog Input (0, Standard nach Reset ist 4) gesetzt habe, wodurch 
scheinbar ein Erkennen der MCU am PD1 verhindert wird.

Zurücksetzen konnte ich diesen Fehler, indem ich im Programm 
WCH-LinkUtility die Funktion Target --> Erase (F9) Chip aufgerufen habe, 
die tat es dann auch. Das Flashen des originalen "GPIO_Toggle" 
funktionierte dann auch wieder (Meldung_5.jpg).

Vielen Dank an Alle, die sich an der Diskussion beteiligt haben, das 
Ergebnis ist durchaus positiv und vielleicht für Andere mit ähnlichen 
Problemen auch interessant.

Gruß

Reinhard

von Reinhard R. (reirawb)


Lesenswert?

Kurzer Nachtrag noch, der Harald K. lag mit seinen Analysen betreffs 
Programmieradapter und der Vermutung eines Code-Fehlers in seinem 
letzten Beitrag 100% richtig, vielen Dank an Harald K.

Reinhard

von Harald K. (kirnbichler)


Lesenswert?

Freut mich, was sinnvolles beigetragen zu haben.

von Lothar L. (lole)


Angehängte Dateien:

Lesenswert?

Hallo Reinhard,
ich habe mich vor ca. 1 Jahr auch auf die CH32xx orientiert. Vielleicht 
helfen dir ein paar Tips weiter.
Ich flashe grundsätzlich direkt aus MounRiver Studio wobei immer erst 
die Konfiguration eingestellt werden muss. Vielleicht nicht bei jedem 
Flashvorgang, zur Sicherheit habe ich es mir angewöhnt vor dem Flashen 
immer die 5 Punkte (siehe Bild) durchzugehen.
Verfusen wie beim AVR ist NICHT möglich, egal wie die PINs gesetzt sind. 
NRST ist bei meinen Demoboards grundsätzlich deaktiviert (default). 
Aktivieren geht nur via Software durch ändern der UserOptionBytes (siehe 
Bild). Deshalb muss in der Download Konfiguration bei "Erase Code 
Flash:" (4) der Punkt "By Power OFF" ausgewählt werden. Dann Apply und 
Flashen. Klappt bei mir perfekt, nachdem ich anfangs die gleichen 
Probleme hatte. Ich spiele auch mit dem kleinen Ableger J4M6 im SOP8 
Gehäuse und kann 6 GPIOs benutzen, auch mal mit 3 TimerPWM. Momentan 
habe ich es mehr mit den CH32V203, da geht ein bisschen mehr. In meiner 
Projektliste sind viele Spielereien, aber auch einige ernste Projekte. 
Aktuell bastele ich an einem CO2 Messgerät mit grafischer History auf 
einem 3,2" Display mit ILI9341. Schon wegen der Grafik reicht der 
Speicher vom 003 nicht aus. Die SPI Geschwindigkeit geht auch höher.
Die mitgelieferten Beispiele sind manchmal auch etwas komisch...
Ein GPIO toggle sieht bei mir so aus:
GPIOC->OUTDR ^= GPIO_Pin_1;  und kommt als Macro in eine *.h Datei
Grüße und viel Spaß mit den RISCV Teilen
Lothar

von Reinhard R. (reirawb)


Angehängte Dateien:

Lesenswert?

Hallo Lothar,

vielen Dank für deine Hinweise, ich stehe erst ganz am Anfang. Diese 
Einstellungen von deinem Flashen1.jpg mache ich vorher nicht, bisher hat 
es mit meinem Testboard so funktioniert, bis auf das eine Mal. Aber ich 
werde das mal im Hinterkopf behalten.

Mich nervt hauptsächlich dieses umständliche Programmieren mit diesen 
Strukturen, da blicke ich nicht richtig durch. Deshalb versuche ich das 
Ganze, sagt man da "bare metal"? zu programmieren. ich habe mal zwei 
Dateien angehängt, wie ich einzelne Pins konfiguriere, ohne die anderen 
zu beeinflussen (was ja Ursache für mein Problem weiter oben war).

Aufruf dann einfach:  SET_PIN('D', 0, UOUT_PP_50);

Gibt es bestimmt bessere Lösungen, aber ist ja aber nur für mich als 
hobbybetreibender Rentner.

der CH32V203 steht auch noch auf dem Plan, war mit Demoboard und 5 
Einzelexemplaren auch in meinem Starterpaket, aber ich will erst mal den 
Kleinen quälen :-)

Erstes Projekt ist die Ansteuerung von mehreren WS2812b bzw. WS2815. 
Platinen dafür sind bestellt, schaun wir mal.

Auch dir noch gutes Gelingen mit Risk-V :-)

Gruß

Reinhard

von Norbert (der_norbert)


Lesenswert?

Reinhard R. schrieb:
> Risk-V :-)

Reduzierte Instruktions-Satz Kommandos - Version Fünf

Sehr schön! ;-)

von Harald K. (kirnbichler)


Lesenswert?

Reinhard R. schrieb:
> Mich nervt hauptsächlich dieses umständliche Programmieren mit diesen
> Strukturen, da blicke ich nicht richtig durch. Deshalb versuche ich das
> Ganze, sagt man da "bare metal"? zu programmieren.

Diese Strukturen sind an die von STM für ihre STM32-µCs entwickelten HAL 
"Cube MX" angelehnt.

Wer also Erfahrung mit STM32 hat, wird sich schnell zurechtfinden.

Wenn Du aber "näher am Geschehen" dransein willst, solltest Du Dir das 
hier mal ansehen:

https://github.com/cnlohr/ch32v003fun

von Lothar L. (lole)


Angehängte Dateien:

Lesenswert?

Hallo Reinhard,
komisch, dass sich so viele Rentner mit RISC-V beschäftigen. Ich gehöre 
auch dazu. An die Init-Strukturen habe ich mich schon gewöhnt, als ich 
mit STM experimentiert habe. Sieht umständlich aus, ist aber sehr 
aussagekräftig und praktisch. Mit Copy-Paste hält sich der Tipaufwand 
auch in Grenzen und ein ganzer Port in einem Rutsch ist auch möglich. 
Dein einfacher Aufruf von SET_PIN ist dagegen recht kryptisch. Aber 
viele Wege führen zum Ziel. Meine Spielerei mit WS2812 hänge ich mal an. 
Da habe ich das Timing einfach mit NOPs gemacht, landwirtschaftlich. Der 
Systick ist zwar schnell und gut, wird aber auch von den Delays benutzt 
und nach dem Delay gestoppt. Super finde ich auch die Printf Funktion 
die im Debug integriert ist. Gibt es beim Arduino auch, bei STM sind 
Hilfsmittel gefragt. Außerdem ist der Preis unschlagbar, made in China 
eben. Dazu gehen einige Typen auch mit 5 Volt und OPVs sind auch drin. 
Habe ich noch nicht getestet, da auch schlecht dokumentiert.
Also, viel Spaß mit den RISC-V, ich habe ihn.
Grüße Lothar

von Reinhard R. (reirawb)


Lesenswert?

Harald K. schrieb:
> Diese Strukturen sind an die von STM für ihre STM32-µCs entwickelten HAL
> "Cube MX" angelehnt.
>
> Wer also Erfahrung mit STM32 hat, wird sich schnell zurechtfinden.

Ja, so habe ich das auch empfunden. Ich hatte vor 3 Jahren mal einen 
Einstieg in die STM-Familie begonnen. Habe mir die Sachen von Stefan 
Frings reingezogen, dann irgendwann wegen der Komplexität aufgegeben und 
meine beiden Nucleo-Boards wieder verkauft.

> Wenn Du aber "näher am Geschehen" dransein willst, solltest Du Dir das
> hier mal ansehen:
>
> https://github.com/cnlohr/ch32v003fun

Uff, ist ja auch recht umfangreich, ich schaue aber auf jeden Fall mal 
rein, irgendwas kann man immer gebrauchen, danke.

Lothar L. schrieb:
> Meine Spielerei mit WS2812 hänge ich mal an.

Danke, ich schaue es mir auf jeden Fall an.

> Da habe ich das Timing einfach mit NOPs gemacht, landwirtschaftlich. Der
> Systick ist zwar schnell und gut, wird aber auch von den Delays benutzt
> und nach dem Delay gestoppt.

OK, war eigentlich mein erster Gedanke, den Systick zu nutzen. Und Delay 
stoppt den? Ich dachte immer, der läuft durch wenn erst mal aktiviert?

> Super finde ich auch die Printf Funktion
> die im Debug integriert ist.

OK, soweit bin ich noch nicht. Wobei meine Vorgehesweise eher "Trial and 
Error" als "Debugging" ist :-)

> Dazu gehen einige Typen auch mit 5 Volt und OPVs sind auch drin.

Ja, die 5V sind auch ein Grund die Teile zu nutzen. Ist man z.B. bei den 
WS2812 auf der sicheren Seite. Ich habe da noch die Diskussionen wegen 
Levelshifter bei 3V3-Ansteuerung hier im Forum im Hinterkopf.

Gruß Reinhard

von Reinhard R. (reirawb)


Lesenswert?

@Lothar L.

Also, die WS2812-Ansteuerung in deinen ws2812.c/ws2812.h habe ich mir 
angesehen - und verstanden :-)

Macht auch Sinn da NOPs zu verwenden, was soll das Ding in der Zeit auch 
sonst machen?

Reinhard

: Bearbeitet durch User
von Lothar L. (lole)


Lesenswert?

Schau dir in deinem Projektordner die debug.c an, dann weißt du, was das 
Teil im Delay macht.... in einer while Schleife auf den Zähler warten 
;-). Und der ist 32Bit beim 003 und 64Bit beim 203. Kann schon etwas 
dauern.
Die NOPs konnte ich wenigstens mit dem Oszi einstellen. Ist auch 
platzsparender als eine SPI Version.
Lothar

von Reinhard R. (reirawb)


Lesenswert?

Hallo, ich nochmal.

Lothar L. schrieb:
> Schau dir in deinem Projektordner die debug.c an, dann weißt du, was das
> Teil im Delay macht.... in einer while Schleife auf den Zähler warten
> ;-).

Ja, habe es mir angesehen. Wenn ich das richtig verstanden habe, wird 
der SysTick bei jedem Aufruf von Delay_xx(n) auf 0 gesetzt, gestartet 
und bei erreichen des Compare-Wertes wieder gestoppt. Damit wäre er ja 
für andere Anwendungen unbrauchbar, der sollte doch durchlaufen, oder? 
Also SysTick vergessen und Timer verwenden oder Delay vergessen?

Reinhard

von Lothar L. (lole)


Lesenswert?

Hallo Reinhard,
genauso läuft das, leider. Was du, wie nutzen willst kommt immer darauf 
an, was dein Projekt machen soll. Wenn du den Systick verwenden willst, 
z.B. als 1ms Takt kannst du ein Delay_MS über den Systick Interrupt 
machen, für Delay_US musst du dann den laufenden Systick abfragen. Macht 
aber auch Probleme, wenn ein Überlauf kommt. Den Überlauf einkalkulieren 
bedeutet Rechnerei. Oder im µs Bereich einen Delay mit NOPs machen, 
verzerrt das Delay, wenn ein Interrupt dazwischen schlägt, evtl. INT 
solange sperren. Ansonsten die zwei anderen Timer benutzen. Mit den 
Watchdogs kann man für Delays leider nichts anfangen, sind ja auch nicht 
dafür gedacht. Für "kleinere" Projekte sollten die drei Timer 
ausreichen, für etwas anspruchsvollere nehme ich den V203 und warte 
gerade auf einen Satz CH32X035G8R6. Der kann auch 5V (sinnvoll wenn FETs 
ohne extra Treiber gesteuert werden sollen) hat 3 Timer und bessere 
OPAs, die auch besser dokumentiert sind. Leider auch nur 48MHz.
Güße Lothar

von Reinhard R. (reirawb)


Lesenswert?

Hallo Lothar,

danke für deine Infos. Mein erstes fertiges Projekt habe ich hier mal 
kurz vorgestellt: 
Beitrag "Re: Zeigt her eure elektronischen Weihnachtsbasteleien!"

Dort habe ich zeitliche Abhängigkeiten noch mit normalem Delay 
erschlagen, wobei ich Delay sonst in meinen Programmen vermeide, 
höchstens mal für Tests verwende. Die Erzeugung des Datentaktes habe ich 
mit von dir abgeguckt, danke nochmal dafür.

Den CH32X035 habe ich mir auch mal angesehen, 5V ist schon für manche 
Anwendungen von Vorteil. Was mir allerdings aufgefallen ist, die Teile 
haben keine Anschlüsse für einen HSE, gut, braucht man auch nicht immer.

Na schaun wir mal wie es weiter geht...

Reinhard

von Lothar L. (lole)


Lesenswert?

Hallo Reinhard,
sieht doch echt gut aus, dein erstes Projekt. Schickes PCB.
Delay ist eben auch Geschmackssache. Ich setze oft auf State Machine und 
dafür ist der Systick dann wieder gut. Einen Quarz benutze ich auch 
selten. Für eine UART, SPI oder ws2812 reicht die Genauigkeit des HSI 
und ich habe zwei PINs mehr. Wenn ich die 5V nicht brauche, setze ich 
auf den V203 oder höher. Kann eben jeder machen wie es passt. Als Hobby 
sowieso.
Beim V203 gibt es auch ein RTOS, das braucht eben Speicher.
Lothar

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.