Forum: Projekte & Code CH32V003: serieller Bootloader


von Ralph S. (jjflash)



Lesenswert?

Puuh, es ist vollbracht und ich war an etwas wieder länger gesessen als 
ich das gewollt hatte, aaaber: Etwas funktioniert!

Eigentlich hatte ich vor, das zuerst in einem Nachbarthread zu posten 
(weil ich dort Fragen zu einem Problem gestellt hatte), aber nachtdem 
der Bootloader nun fertig ist, glaube ich, dass er in die Rubrik 
"Projekte und Code" besser passt.

Doku habe ich noch keine geschrieben (zumindest noch nicht richtig), 
aber wenn ich das gemacht habe (ich möchte noch andere Dinge zum 
CH32V003 aufschreiben), werde ich das in dem "Getting started" Thread 
einfügen. Vor allen Dingen muß ich dann dort die Makefiles anpassen, 
damit der neue Bootloader auch mittels es nun notwendigen Hostprogramms 
geflasht werden kann.

Zum Bootloader:

das hat mich etwas Nerven gekostet und einen Chip hat es mir zerstört, 
bei dem ich nicht weiß weshalb. Auch ein "unbrick" funktioniert nicht 
mehr. Vielleicht habe ich den Bootloaderbereich zu oft beschrieben (von 
dem ich nicht weiß, ob der genauso oft beschrieben werden kann, wie der 
"normale" Flashbereich).

Wie dem auch sei: Im Anhang sind alle Dateien enthalten (inkl. dem 
CH32FUN) um den Bootloader zu compilieren.

Im Ordner uart_bootload_page:
"make build" compiliert den Bootloader
"make flash" flasht zuerst den Bootloader in den Bootloaderbereich und 
setzt danach die entsprechenden Optionbytes

Im Ordner host:
liegt ein Binary v003flash und die Source v003flash.pas. Ja, richtig 
gelesen: das Hostprogramm für den Bootloader ist in FreePascal 
geschrieben, nicht in C, C++, Python oder Rust, sondern in FreePascal. 
Warum? Weil ich seit schier anbeginn der Zeit (noch unter DOS irendwann 
Ende der 80er Jahre) ein Uploadprogramm geschrieben hatte (damals für 
E-Prom Simulator und meinen allerersten selbstgebauten MCS-51 
InCircuitEmulator) und ich bis heute das eben immer nur an die neuen 
Gegebenheiten anpasse. Grundsätzlich ist es doch egal, in welcher 
Sprache ein Hostprogramm geschrieben ist, das einen Programmer / 
Bootloader füttert.

Die Syntax von v003flash ist:

v003flash serialport firmware.hex

Beispiel:

v003flash /dev/ttyUSB0 blink.hex

Was ist das "besondere" an einem Bootloader (und prinzipiell haben 
diejenigen Recht die nicht verstehen können, wie man damit "arbeiten" 
will, wenn man doch keinen Debuger hat und es viele andere Gründe gibt, 
die richtig sind)?

Das "besondere" daran ist, dass man ohne irgendwelche zusätzlichen 
Sachen eine Schaltung aufbauen kann (siehe Foto) und mit einem einzigen 
(USB-)Kabel zugleich die Kommunikation dabei hat und das ganze dazu 
mittlerweile "abartig" billig ist.

Demnächst werde ich wohl endlich eine PCB routen mit den Spielzeugen zum 
CH32V003 und dann wird auch diese Schaltung mit darauf kommen, ich werde 
sie wohl "Arduino ch32nano" nennen :-)

von Harald K. (kirnbichler)


Lesenswert?

Ralph S. schrieb:
> glaube ich, dass er in die Rubrik
> "Projekte und Code" besser passt.

Aber sicher doch.

Auch wenn ich den Bootloader sicherlich nicht benötigten werde: Lob für 
Dein Projekt, aus dem man viel interessantes lernen können wird.

Find' ich gut, daß sich hier jemand so gründlich mit den WCH-Risc-µCs 
auseinandersetzt.

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Harald K. schrieb:
> Find' ich gut, daß sich hier jemand so gründlich mit den WCH-Risc-µCs
> auseinandersetzt.

"Gründlich" ist das wahrscheinlich nicht, ich kratze wohl nur an der 
"Oberfläche" und weiß das auch.

Aber hier das erste "Update" zum Bootloader:

Ich habe das Hostprogramm minimal überarbeitet. Antwortet der Bootloader 
nicht oder wählt man den falschen seriellen Port, bricht das 
Hostprogramm jetzt ab, als ewig in einer Schleife zu hängen.

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Im Anhang jetzt hoffentlich "vorerst" das letzte Update, auch 
hoffentlich keine gröberen Fehler mehr:

In der vorherigen Version hatte das Hostprogramm den Flashvorgang des 
Bootloaders auch dann gestartet, wenn auf demselben seriellen Port, auf 
dem geflasht werden soll, bereits ein Terminal geöffnet war (in meinem 
Falle entweder picocom oder putty).

Das hatte dazu geführt, dass nicht nur vom Host, sondern auch vom 
Terminal Bytes geschickt wurden, was verherende Folgen haben kann, denn 
2 Bytes geben die Anzahl der zu flashenden Pages an, in einem - nicht 
seltenen Fall - werden dann so viele Pages geschrieben, dass auch der 
Bootloader zerstört wird.

Das jetzige Hostprogramm unterbindet den Flashvorgang, wenn auf der 
anderen Schnittstelle bereits ein Programm aktiv ist.

Puuuh

Viele Grüße und viel Spaß

Ralph

von Christoph M. (mchris)


Lesenswert?

Ralph S. (jjflash)
11.06.2025 18:04
>2 Bytes geben die Anzahl der zu flashenden Pages an, in einem - nicht
>seltenen Fall - werden dann so viele Pages geschrieben, dass auch der
>Bootloader zerstört wird.
Ähm .. willst du nicht einen Limit-Check einbauen?

von Ralph S. (jjflash)


Lesenswert?

Christoph M. schrieb:
> Ralph S. (jjflash)
> 11.06.2025 18:04
>>2 Bytes geben die Anzahl der zu flashenden Pages an, in einem - nicht
>>seltenen Fall - werden dann so viele Pages geschrieben, dass auch der
>>Bootloader zerstört wird.
> Ähm .. willst du nicht einen Limit-Check einbauen?

Der Limit-Check ist da schon drin, aaaaaber wenn der Bootloader die 
Anzahl der Pages abfrägt, aber das Terminal und nicht der Host etwas 
schickt, dann löscht er zuviele Pages. Das ist jetzt dadurch gefixt, 
dass der Host die Schnittstelle ganz alleine hat. Dieser sendet 
garantiert nicht mehr als die 256 erlaubten Pages. Ich habe jetzt mit 
dem Ding bestimmt 2 stunden mit unterschiedlichen Szenarien gespielt. 
Der Bootloader blieb stabil

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Ärgerlich: Doch noch einen Fehler gefunden (relativ übel sogar): Flasht 
man den Bootloader auf einen fabrikneuen Chip, auf dem noch nie ein 
Programm gelaufen ist, funktioniert der Loader nicht.

Dem bin ich jetzt begegnet in dem nach dem Flashen des Bootloaders und 
dem Schreiben der Optionbytes der Loader automatisch aktiviert wird.

Vorgehensweise:

- make
- make flash
- make optionbytes

Flashen und schreiben der Optionbytes können sowohl mit einem WCH-LinkE, 
dem Selbstbauprogrammer oder mit dem ArduLink gemacht werden. Für 
ArduLink im Makefile entsprechend den Programmer auswählen

Gruß,
Ralph

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

Nachdem mich ein freundliches Forenmitglied privat angeschrieben hat 
(der das hier wirklich nutzt), ist nun immer noch ein Bug im Makefile 
aufgetreten: die Variable zur Nutzung eines ArduLink ist beim 
Funktionsaufruf kleingeschrieben und gehört groß geschrieben. Um hier 
jetzt nicht mit Unnötigem Datenmüll noch ein Archiv hochzuladen hier 
jetzt nur das korrigierte Makefile im Anhang.

Sorry für den Fehler!

von F. P. (fail)


Lesenswert?

Ralph S. schrieb:
> Ärgerlich: Doch noch einen Fehler gefunden (relativ übel sogar): Flasht
> man den Bootloader auf einen fabrikneuen Chip, auf dem noch nie ein
> Programm gelaufen ist, funktioniert der Loader nicht.

Was genau führt zu diesem Problem? D.h. worin unterscheidet sich ein 
Chip (mit dem Bootloader) auf dem nie ein Programm gelaufen ist, von 
einem Chip (ebenfalls mit dem Bootloader) auf dem schon mal ein Programm 
gelaufen ist? Wie merkt sich der Chip, daß schon mal ein Programm 
gelaufen ist?

von Ralph S. (jjflash)


Lesenswert?

F. P. schrieb:
> Was genau führt zu diesem Problem? D.h. worin unterscheidet sich ein
> Chip (mit dem Bootloader) auf dem nie ein Programm gelaufen ist, von
> einem Chip (ebenfalls mit dem Bootloader) auf dem schon mal ein Programm
> gelaufen ist? Wie merkt sich der Chip, daß schon mal ein Programm
> gelaufen ist?

Ganz ehrlich: ich kann es mir nicht genau erklären! Ursprünglich hatte 
ich in Verdacht, dass mein Linkerscript Interruptvektoren in den 
"Nicht-Bootbereich" hineinragen läßt. Das habe ich überprüft und dem ist 
nicht so. Zudem bin ich dann hergegangen und habe den Bootloader so 
geschrieben, dass er überhaupt keine Interrupts benötigt und das ganze 
schlicht per Polling erledigt.

Danach habe ich mir den Systemticker genauer angesehen und das System 
nicht über ein "SystemInit" von CH32FUN gestartet, sondern bspw. die 
Takteinstellung über Bare-Metall Direktprogrammierung der Register 
gemacht. Dasselbe Verhalten. Im Moment sind mir leider die fabrikneuen 
Chips ausgegangen. Gehe ich her und lösche den gesamten Flashbereich, 
den gesamten Boot-Bereich und schreibe die Optionbytes neu, braucht es 
kein zuvor geflashtes Programm auf dem Chip. Irgendwann nächste Woche 
bekomme ich neue Chips (bei der Erstbestellung hatte ich mir nur 5 Chips 
20 pol. und 5 Chips 16 pol. beschafft, weil ich nicht gedacht hätte, 
dass mich der Controller so sehr beschäftigen wird, ich wollte ihn 
einfach nur ausprobieren).

Zur Erklärung:
Der User-Flashbereich geht von Adresse 0x08000000 bis 0x08003fff, der 
Bootloaderbereich ist komplett vom User-Flashbereich abgetrennt und 
beginnt physikalisch ab 0x1ffff000, wird aber auf 0x00000000 gemappt und 
ist 1920 Byte lang.
RAM-Bereich ist von 0x20000000 bis 0x20000800.

Dann hatte ich in Verdacht, dass irgendwo CH32FUN mir hineinspuckt und 
es ein Programm sein muß, das mit CH32FUN erstellt worden ist. Um das zu 
evaluieren habe ich mir ein Binary-Blink-Programm erstellt mit MounRiver 
herunter geladen und mit dem Bootloader geflasht ... und das hat auch 
funktioniert.

Warum jetzt also der Bootloader mit einem Fabrikneuen Chip nicht will? 
Wenn ich neue Chips habe, werde ich neue "Untersuchungen" machen.

von Ralph S. (jjflash)


Lesenswert?

F. P. schrieb:
> Was genau führt zu diesem Problem?

In Bezug auf deinen Nachnamen "Peinlich": Wenn du andeuten magst, dass 
mir das ganze peinlich sein sollte kann ich dir sagen: Es ist mir nicht 
peinlich! Sollte das ganze keine Andeutung sein betrachte den Text hier 
jetzt als nicht geschrieben!

von F. P. (fail)


Lesenswert?

Nö, **ich** bin peinlich.

von F. P. (fail)


Lesenswert?

Ralph S. schrieb:
> Warum jetzt also der Bootloader mit einem Fabrikneuen Chip nicht will?

Ich fragte, weil ich ein ähnliches Problem habe, allerdings mit Code 
Flash, nicht mit System Flash. Ich hatte ja neulich im anderen Thread 
vorgeschlagen, einen 64-pin CH32V305 zu nehmen, BOOT0 hochzulegen und 
dann die Original-WCH-LinkE-Firmware per USB (wchisp) einzuspielen, ganz 
ohne weitere Hardware. Da inzwischen ein 12-MHz-Quarz eingetroffen ist, 
habe ich das mal ausprobiert. Das Einspielen der Firmware auf einem 
fabrikneuen Chip funktioniert, aber die Firmware will nicht. Genauer: 
die beiden Load Switches werden aktiviert (d.h. etwas tut sich), aber 
der HSE springt nicht an, also keinerlei USB. Auch nicht, wenn ich die 
seltsame Hardware des WCH-LinkE nachbaue und die internen Verbindungen 
(z.B. PA8=PC9) des CH32V305F nachbilde. Mit meiner eigener Test-Software 
schwingt der HSE und USB geht. Entweder ich habe etwas übersehen oder 
die Firmware braucht noch etwas, das einem fabrikneuen CH32V305 fehlt. 
Die Chips des CH32V305F und des CH32V305R müßten dem Datenblatt nach 
identisch sein. Die Option Bytes sind beim CH32V305 uninteressant, 
bleiben eigentlich nur die Vendor Bytes, der System Flash (boot loader), 
oder eben etwas, das mit dem von Dir beobachteten Effekt zusammenhängt. 
OSC_OUT wie mit dem Mode-Taster auf GND kurzzuschließen, habe ich mir 
bisher nicht getraut.

von Ralph S. (jjflash)


Lesenswert?

F. P. schrieb:
> Nö, **ich** bin peinlich.

Okay... :-) ... niemand ist peinlich, der sich mit den Dingen hier 
beschäftigt. Bei der Komplexizität der Chips, obwohl das im Falle von 
CH32v003 noch halbwegs übeschaubar ist, macht man Fehler, wenn man darin 
noch neu ist. Peinlich wäre, etwas heftig zu verlautbaren und zu 
vertreten, aber keine wirkliche Ahnung hat. Mit dem danachfolgenden Post 
von dir, zeigst du, dass du eben nicht peinlich bist.

F. P. schrieb:
> Entweder ich habe etwas übersehen oder
> die Firmware braucht noch etwas, das einem fabrikneuen CH32V305 fehlt.

Ich beschäftige mich zwar (noch) nicht mit dem V305 (und wahrscheinlich 
werde ich das so intensiv wie ich das mit dem V003 jetzt mache nicht 
wieder tun, aber bei den vielen Infos die ich für den V003 
zusammensuche, habe ich den Verdacht, dass genau das der Fall ist: Es 
fehlt einem fabrikneuen Chip etwas. Natürlich habe ich noch nicht alles 
verstanden (und werde das wohl auch niemals tun), aber in manchen 
Beschreibungen stehen, für mich nur Andeutungen, darüber drin, was es 
benötigt den Bootsektor zu aktivieren.

Jetzt hat der V305 einen anderen RISCV-Kern als der V003, aber 
wahrscheinlich ist WCH dann doch hergegangen und ist bei ihren Produkten 
überall ähnliche Wege gegangen etwas zu realisieren. Okay, das alles ist 
ein "im Nebeln stochern", solltest du etwas mehr herausfinden wäre das 
für mich interessant zu wissen, was das ist. Grundsätzlich bin ich mit 
dem Bootloader wie er jetzt ist zufrieden, was nicht heißt, dass ich das 
nicht verbessern mag. Allerdings liegt da mittlerweile mein 
Hauptaugenmerk auf der Geschwindigkeit.

Für mich erschließt es sich bspw. nicht, warum das Schreiben eine 
Flashpage (64 Byte) so lange dauert:
1
  while( FLASH->STATR & FLASH_STATR_BSY );               // warten bis Schreibvorgang fertig

Beachtet man, das ich für den Bootloader mit 57600 Baud / 8N1 arbeite 
und nach jeder Page zur Bestätigung ein Zeichen ('o') geschickt wird so 
werden für ein komplettes Beschreibung insgedamt 16384 Bytes + 256 
(Bestätigungbytes) vom Host geschickt. Das macht somit (bei 10 Bits per 
Byte) 16640 / 57600 = 2,88s für die Datenübertragung. Das erklärt also 
nicht, warum ein Flashvorgang mit meinem Bootloader für einen kompletten 
Flashvorgang fast 20 Sekunden braucht (okay, ArduLink benötigt fast 90 
Sekunden), ein Vorgang mit dem WCH-LinkE jedoch nur 4 Sekunden.

Irgendwie sollte es noch etwas schnelleres geben, als ein Pagewrite, 
denn der LinkE kann das ja auch schneller und die Frage ist: Wieso kann 
der das ?

von Ralph S. (jjflash)


Angehängte Dateien:

Lesenswert?

"Nur mal so" zur Funktionsfähigkeit des Bootloaders:

Wenn ich in Arduino den Core aus

https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json

installiere und dann diesem Packet meinen Bootloader "unterjubele" 
(durch erweiterte Dateien platform.txt und boards.txt und das 
Flasherprogramm v003flash nach

~/.arduino15/packages/WCH/tools/openocd/1.0.0/bin

kopiere, funktioniert der Bootloader auch dort (gerade ausprobiert). 
Hiermit kann man dann den CH32V003 absolut genauso programmieren, über 
nur diese eine USB-Buchse, wie man das von einem Arduino-UNO / Nano 
gewohnt ist.

von Christoph M. (mchris)


Lesenswert?

Ralph S. (jjflash)
17.06.2025 07:26

>Hiermit kann man dann den CH32V003 absolut genauso programmieren, über
>nur diese eine USB-Buchse, wie man das von einem Arduino-UNO / Nano
>gewohnt ist.
Wenn es wirklich funktioniert, ist das super. Eigentlich will ich die 
MCU schon die ganze Zeit mal testen.

Beitrag #7893663 wurde vom Autor gelöscht.
von Ralph S. (jjflash)


Lesenswert?

Christoph M. schrieb:
> Wenn es wirklich funktioniert, ist das super. Eigentlich will ich die
> MCU schon die ganze Zeit mal testen.


Das ganze funktioniert, aber unter Linux. Dem Bootloader selbst ist das
Betriebssystem das ihn füttert egal, aber das Hostprogram "v003flash"
habe ich für Linux (in FreePascal) geschrieben. Dort gibt es u.a. einen
Systemaufruf von "fuser" den es so in Windows wohl nicht gibt.

Aber unter Linux funktioniert das einwandfrei. Die Frage ist hier
jedoch, wieviel Sinn es macht, den CH32V003 unter Arduino zu
programmieren. Ein einfaches Blinkprogramm belegt schon 4971 Byte und
ich weiß, ich kann es gerade im Moment nicht konkret ausprobieren, dass
ein nicht so aufwändiges Demoprogramm mit 7-Segementanzeigetreiber über
9000 Byte belegt, dann stellt sich schon die Frage was man damit machen
möchte. Für kleine Dinge mag das dann funktionieren, aber mit den 16384
Byte Flash insgesamt wird es mit Arduino dann schon eng. Aber es
funktioniert. Für kleine Dinge kann man bestimmt damit leben.

Wenn du also Linux hast, befolgst du die Anweisungen in

Beitrag "Re: CH32V003: serieller Bootloader"

und downloadest das korrigierte Makefile des Chatverlaufes, Downloadest
die Dateien "platform.txt" und "boards.txt" ebenfalls aus diesem
Chatverlauf.

Hast du die Dateien, dann erweiterst du die Einträge bei:

Datei - Voreinstellungen - Zusätzliche Boardverwalter URLs. um

https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json

Im Boardverwalter selbst installierst du jetzt ein neues Board (dort
suchst du nach CH32)

Wenn das funktioniert hat, kopierst du die gedownloadeten Dateien
"platform.txt" und boards.txt nach

~/.arduino15/packages/WCH/hardware/ch32v/1.0.4/

Dann folgst du den Anweisungen des Textes in der PDF:

- einen Arduino zum Programmer für CH32V003 machen (siehe Text)
- PIN 6 (PD6) Arduino über einen 2,2kOhm Widerstand mit SWDIO von
CH32V003 verbinden
- den Bootloader über Arduino flashen. Hierfür vor dem Flashen im
Makefile des Bootloader-Ordners eintragen: USE_ARDULINK = 1
- make
- make flash
- make optionbytes

im Verzeichnis host:
- make
es entsteht das Hostprogramm für den Bootloader und heißt : v003flash

Diese Datei kopierst du nach

~/.arduino15/packages/WCH/tools/openocd/1.0.0/bin

Nach einem Start von Arduino solltest du jetzt zum einen ein
CH32V003-Board auswählen können und als Flashing-Programm v003flash

Hinweis zur Hardware. In meinem Schaltplan habe ich noch einen 22 nF
Kondensator vom Ausgang des RTS-Anschlusses einer USB2UART-Bridge
gewählt. Das war zu "optimistisch" und manchmal funktioniert das nicht.
Dieser 22 nF Kondensator ist durch 100 nF zu ersetzen. (Jetzt gerade im
Moment sitze ich an der Hardware und sinniere darüber nach, wie man die
Resetschaltung des CH32V003 besser gestalten könnte, denn: Um den zu
reseten muß man ihm die Betriebsspannung abschalten. Ist der Chip einmal
unter Betriebsspannung gelaufen, löst ein Reset einen Neustart eines
Firmwareprogrammes aus, aber startet nicht den Bootloader)

Das hört sich jetzt sehr kompliziert an, aber die "Arduino-Jünger" ,
glaube ich, wissen ganz genau was da zu tun ist (Arduino mache ich halt
nicht wirklich).

von Christoph M. (mchris)


Lesenswert?

Dein Bootloader wäre super für einen CH32V003 Arduino-Nano-Clone 
geeignet.
Den könnte man auf direkt auf das Experimentierbrett stecken und hätte 
auch gleich eine serielle Schnittstelle.

>Das hört sich jetzt sehr kompliziert an, aber die "Arduino-Jünger" ,
>glaube ich, wissen ganz genau was da zu tun ist

Deine Ausdrucksweise "Arduino-Jünger" stört mich, da sie negative 
konnotiert ist. Du könntest das lassen.

von Ralph S. (jjflash)


Lesenswert?

Christoph M. schrieb:
> Dein Bootloader wäre super für einen CH32V003 Arduino-Nano-Clone
> geeignet.
> Den könnte man auf direkt auf das Experimentierbrett stecken und hätte
> auch gleich eine serielle Schnittstelle.

Genau das ist die Intension und genau dafür route ich auch eine PCB 
dafür!

Christoph M. schrieb:
> Deine Ausdrucksweise "Arduino-Jünger" stört mich, da sie negative
> konnotiert ist. Du könntest das lassen.

Oha, fühlst du dich da "negativ konnotiert"? Ich gehe niemals her und 
bewerte jemanden danach, wie er oder sie etwas bewerkstelligt. Weder 
hier im Forum noch im "wahren Leben". Wenn sich also jemand an einem 
Wort "Jünger" stört ist das seine (und nicht meine) Sache. Prinzipiell 
ist ein "Jünger" von etwas zu sein nicht "negativ konnotoert" sondern 
impliziert, dass jemand Fan, Anhänger oder sonstwie von etwas ist (und 
sich dort dann in aller Regel gut auskennt).

Sicherlich lasse ich mir nicht vorschreiben, in welcher Ausdrucksweise 
ich etwas schreibe, solange es nicht beleidigend ist. Würde ich hier 
etwas negativ "konnotieren", hätte ich sicherlich in meiner Anleitung 
nicht explizit Arduino einen Abschnitt gewidmet!

von F. P. (fail)


Lesenswert?

Ralph S. schrieb:
> Für mich erschließt es sich bspw. nicht, warum das Schreiben eine
> Flashpage (64 Byte) so lange dauert:
>
>
1
>   while( FLASH->STATR & FLASH_STATR_BSY );               // warten bis 
2
> Schreibvorgang fertig
3
>
>
> [...] Das erklärt also
> nicht, warum ein Flashvorgang mit meinem Bootloader für einen kompletten
> Flashvorgang fast 20 Sekunden braucht (okay, ArduLink benötigt fast 90
> Sekunden), ein Vorgang mit dem WCH-LinkE jedoch nur 4 Sekunden.

Vielleicht liegt es daran, daß Dein Code im Flash läuft wohingegen beim 
Programmieren mit dem WCH-LinkE die CPU vermutlich stillgelegt ist? 
Hilft es, den Code ins RAM zu kopieren?

von Ralph S. (jjflash)


Lesenswert?

F. P. schrieb:
> Vielleicht liegt es daran, daß Dein Code im Flash läuft wohingegen beim
> Programmieren mit dem WCH-LinkE die CPU vermutlich stillgelegt ist?
> Hilft es, den Code ins RAM zu kopieren?

Das ist der nächste Versuch, den ich machen werde. Hierfür muß ich das 
Linkerscript anpassen. Puuuh

von F. P. (fail)


Lesenswert?

Mit -fPIC übersetzen und den Boot-Loader sich selbst zu Beginn ins RAM 
kopieren lassen und dann dort hinspringen.

von Ralph S. (jjflash)


Lesenswert?

... aus RAM laufen lassen hat leider nichts gebracht !

von F. P. (fail)


Lesenswert?

F. P. schrieb:
> der HSE springt nicht an

Habe eben bei einem WCH-LinkE gemessen: der HSE wird gar nicht 
verwendet! Vielleicht wurde der Quarz mal von einer früheren 
Firmware-Version benutzt. Ich suchte also bisher an der falschen Stelle. 
Seltsamerweise beschreibt WCH-LinkUserManual.PDF ein Problem mit dem 
WCH-LinkE das durch Neulöten des Quarzes behoben werden können soll.

: Bearbeitet durch User
von F. P. (fail)


Lesenswert?

Bitte entschuldigt die Entführung dieses Threads. Hier schreibt jemand, 
daß der Quarz in Version 1.3 des WCH-LinkE hinzukam und vermutet, daß 
dies für eine (zukünftige) High-Speed-USB-JTAG-Firmware gemacht wurde:

https://en.eeworld.com.XX/Reference_Designs/detail/80614

(XX ist durch cn zu ersetzen, wegen Spam-Filter der Forums-Software.)

Dort gibt es auch eine weitere Version der Firmware und mit dieser wird 
mein CH32V305R zu einem WCH-LinkE! Nur mit Kondensatoren und 
Spannungsregler. Bisher habe ich aber nur "wlink status" ausprobiert. 
Wenn das wirklich funktioniert, werde ich wohl besser einen eigenen 
Thread für eine Bauanleitung aufmachen.

von Ralph S. (jjflash)


Lesenswert?

F. P. schrieb:
> https://en.eeworld.com.XX/Reference_Designs/detail/80614
>
> (XX ist durch cn zu ersetzen, wegen Spam-Filter der Forums-Software.)

Ich wußte nicht, dass chinesische Seiten hier mittels Spam-Filter 
blockiert werden, eigentlich schade.

F. P. schrieb:
> Dort gibt es auch eine weitere Version der Firmware und mit dieser wird
> mein CH32V305R zu einem WCH-LinkE! Nur mit Kondensatoren und
> Spannungsregler.

Ist in sich sehr interessant, leider bin ich nicht im Besitz eines V305, 
weil ich eigentlich nur dem V003 verhaftet bleiben will (auch wenn sich 
beim V305 128k Flash und 32k Ram sehr interessant anhören, ist mir hier 
ein STM32F4 dann doch lieber. interessant hier ist dann für mich 
lediglich das TSSOP-20 Gehäuse... mit so viel Flash).

F. P. schrieb:
> Bisher habe ich aber nur "wlink status" ausprobiert.
> Wenn das wirklich funktioniert, werde ich wohl besser einen eigenen
> Thread für eine Bauanleitung aufmachen.

Schmunzeln muß: Wenn du das dann wirklich am Laufenhast und eine 
Bauanleitung einstellst, würde ich doch glatt über meinen Schatten 
springen und V305 besorgen, nur um das nachzubauen.

Der Programmer im Nachbarthread:

Beitrag "CH32V003: serieller Bootloader"

kann zumindest einen V203 flashen, einen V305 weiß ich nicht, da ich wie 
gesagt, keinen zur Verfügung habe (und natürlich hat er auch keine 
USB2UART-Bridge).

Aber: ich bin auf Deine Bauanleitung gespannt.

von Johannes F. (jofe)


Lesenswert?

Ralph S. schrieb:
> würde ich doch glatt über meinen Schatten
> springen und V305 besorgen,

Ich könnte dir zum Selbstkostenpreis einen oder zwei V305RBT6 (LQFP-64M 
10x10) schicken, wenn du möchtest. Habe z.Zt zehn Stück von LCSC auf 
Lager.

von F. P. (fail)


Lesenswert?

Ralph S. schrieb:
> Ist in sich sehr interessant, leider bin ich nicht im Besitz eines V305,
> weil ich eigentlich nur dem V003 verhaftet bleiben will (auch wenn sich
> beim V305 128k Flash und 32k Ram sehr interessant anhören, ist mir hier
> ein STM32F4 dann doch lieber. interessant hier ist dann für mich
> lediglich das TSSOP-20 Gehäuse... mit so viel Flash).

Interessant ist auch High-Speed USB mit eingebautem PHY. Bei den STM32 
haben das nur ganz wenige.

> Der Programmer im Nachbarthread:
>
> Beitrag "CH32V003: serieller Bootloader"
>
> kann zumindest einen V203 flashen, einen V305 weiß ich nicht

Den CH32V305R kann man ganz ohne Programmer programmieren, direkt per 
USB, da BOOT0 herausgeführt ist.

von F. P. (fail)


Lesenswert?

Ich habe den Selbstbau-WCH-LinkE (nur) mit CH32V305R nun hier 
beschrieben: Beitrag "WCH-LinkE selbst gebaut mit CH32V305RBT6 und sonst fast nichts"

von Ralph S. (jjflash)


Lesenswert?

Johannes F. schrieb:
> Ich könnte dir zum Selbstkostenpreis einen oder zwei V305RBT6 (LQFP-64M
> 10x10) schicken, wenn du möchtest. Habe z.Zt zehn Stück von LCSC auf
> Lager.

ganz lieben Dank, aber im Moment habe ich so viele Projekte am Start, 
dass ich keine weiteren neuen mehr aufmachen möchte, V203 wollte ich 
auch noch austesten und glaube, das werde ich mal auf Eis legen. Doku 
für V003 wird erst mal weiter bearbeitet ... und dann kümmere ich mich 
um meine STM32 Sachen...

und das auch erst dann, wenn ich wieder aus dem Krankenhaus bin..

F. P. schrieb:
> Ich habe den Selbstbau-WCH-LinkE (nur) mit CH32V305R nun hier
> beschrieben: Beitrag "WCH-LinkE selbst gebaut mit CH32V305RBT6 und sonst
> fast nichts"

werde ich mir jetzt ansehen... und bin gespannt

von F. P. (fail)


Lesenswert?

Die Ursache des Problems war einfach nur eine falsche Firmware. Keine 
Ahnung, warum FIRMWARE_CH32V305_v2.8.bin und FIRMWARE_CH32V305_v2.15.bin 
nicht gehen.

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.