CH32V203 programmieren

OP #7897102
Lesenswert?

Ich versuche den CH32V203 zu programmieren. Die Verbindung kommt aber nicht zustande. Woran liegt es?

1
Open On-Chip Debugger 0.11.0+dev-02415-gfad123a16-dirty (2023-10-11-14:01)
2
Licensed under GNU GPL v2
3
For bug reports, read
4
  http://openocd.org/doc/doxygen/bugs.html
5
Info : only one transport option; autoselect 'sdi'
6
Warn : Transport "sdi" was already selected
7
Ready for Remote Connections
8
Info : WCH-LinkE  mode:RV version 2.12 
9
Error:  WCH-Link failed to connect with riscvchip
10
Error:  1.Make sure the two-line debug interface has been opened. If not, set board to boot mode then use ISP tool to open it
11
Error:  2.Please check your physical link connection
Angehängte Dateien:
#7897137
Lesenswert?

Ich wurstle mich z.Zt. durch die Risc-V von WCH. Z.Zt. spiele ich mit genau Deinem Board herum. Zusammen mit dem MounRiver IDE hatte ich noch mit keinem der Dev-Board oder mit meinen eigenen Boards irgendwelche Probleme. Das einzige was mir einfällt: der E-Link ist default für die ARM MCUs von WCH konfiguriert. Diesen musst Du auf Risc-V umstellen. Entweder mit der Windows-Tool oder falls Du wie ich mit Linux unterwegs bist: Gehäuse öffnen und vor dem Einstecken den Mode-Switch gedrückt halten. Dadurch wechselt die LED von blau auf rot.

OP #7897161
Lesenswert?

Mehmet K. (mkmk) 24.06.2025 16:54

Das einzige was mir einfällt: der E-Link ist default für die ARM MCUs von WCH konfiguriert. Diesen musst Du auf Risc-V umstellen.

Danke. Irgendwo hatte ich gesehen, dass Programmierer die rote LED für RISC-V und die blaue LED für etwas Anderes.
Ich habe aber einen CH32V003 erfolgreich damit programmiert, deshalb müsste die Einstellung eigentlich stimmen.

Moderator #7897188
Lesenswert?

Auch bei mir funktioniert der WCH-LinkE mit zwei verschiedenen CH32V003- und einem CH32V203-Board (sieht genau so wie deines) problemlos. Ich kann mich nicht erinnern, dass ich dafür mit irgendwelchen Spezialtools oder dem Mode-Switch etwas umkonfigurieren musste.

Da ich ich den WCH-LinkE im Paket mit zwei Dev-Boards und ein paar losen CH32[02]03 erworben hatte, hat vielleicht der Hersteller oder Händler die ggf. erforderlichen Konfigurationen bereits vorgenommen.

Mit welchen Kommandozeilenargumenten rufst du openocd auf?

OP #7897403
Lesenswert?

Mit welchen Kommandozeilenargumenten rufst du openocd auf?

Ich nutze die Arduino IDE.

Dort sieht das ganze so aus:

1
packages/WCH/tools/openocd/1.0.0/bin/openocd -f /home/christoph/.arduino15/packages/WCH/tools/openocd/1.0.0/bin/wch-riscv.cfg -c init -c halt -c program {/tmp/arduino_build_205312/nix2.ino.elf} verify; wlink_reset_resume; exit;

und wch-riscvcfg:

1
  
2
#interface wlink
3
adapter driver wlinke
4
adapter speed 6000
5
transport select sdi
6

7
wlink_set_address 0x00000000
8
set _CHIPNAME wch_riscv
9
sdi newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00001
10

11
set _TARGETNAME $_CHIPNAME.cpu
12

13
target create $_TARGETNAME.0 wch_riscv -chain-position $_TARGETNAME
14
$_TARGETNAME.0 configure  -work-area-phys 0x20000000 -work-area-size 10000 -work-area-backup 1
15
set _FLASHNAME $_CHIPNAME.flash
16

17
flash bank $_FLASHNAME wch_riscv 0x00000000 0 0 0 $_TARGETNAME.0
18

19
echo "Ready for Remote Connections"

Gibt es eine Möglichkeit, die Verbindung über openocd schrittweise, manuell zu testen?

OP #7897994
Lesenswert?

In meinem Benchmark sind die Risc-V weit abgeschlagen vom ARM-Cortex M33 des Pipico2. Ich hätte erwartet, dass die Kerne des Pipico2-RiscV deutlich schneller als die des CH32V203 sind, aber sie scheinen ähnlich schnell.

1
Geschwindigkeitsfaktor reltaiv zum Arduino Nano:
2
CH32V203:    : ~5.3
3
PiPico RiscV : ~6
4
PiPico ARM   : ~51
1
/*
2
Program: Float Benchmark Arduino Framework
3

4
2025-06-26 mchris
5
*/
6

7
void setup() {
8
  Serial.begin(115200);
9
}
10

11
void loop() {
12
  float sum = 0;
13
  float x, y;
14
  Serial.println("start");
15
  uint32_t start = micros();
16
  for (uint32_t n = 0; n < 10000; n++) {
17
    float r = random(0, 1000) * 1e-6; // random float between 0 and 0.001
18
    x = sin(2 * PI * n / 1000 + r);
19
    y = cos(2 * PI * n / 1000 + r);
20
    sum += sqrt(x * x + y * y);
21
  }
22
  uint32_t dt = micros() - start;
23
  Serial.print("sum: ");
24
  Serial.println(sum, 6); // more decimals for float
25
  Serial.print("calculation time [us]: ");
26
  Serial.println(dt);
27
  Serial.println();
28
  delay(1000); // avoid flooding serial
29
}
(Firma: @home) #7898000
Lesenswert?

Nemopuk schrieb:

Christoph M. schrieb:

Das gelbe Patchkabel im Bild hatte keinen Durchgang.

Das hatte ich schon zweimal. Die haben in dem Fall einfach auf die Isolation gecrimpt.

Nemopuk schrieb:

Das hatte ich schon zweimal. Die haben in dem Fall einfach auf die Isolation gecrimpt.

Ich hatte dieses Problem auch schon mehrfach vorliegen und es hat lange gedauert bis es entdeckt wurde!

#7898151
Lesenswert?

Apollo M. schrieb:

Ich hatte dieses Problem auch schon mehrfach vorliegen und es hat lange gedauert bis es entdeckt wurde!

Wahrscheinlich ist es besser, sich diese Steckkabelchen selbst zu machen. Es gibt ja diese Dupont-Stecker (bzw. -Buchsen) und -Zangen zu kaufen. Dann kann man auch gleich vernünftige Litze mit 0,25mm² oder so nehmen, statt der AWG200 aus Eisen...

(Firma: Wilhelm.Consulting) #7920364
Lesenswert?

Chris schrieb:

Der Cortex-M33 hat aber eine.

Schon, das Problem wird aber sein, dass damit die interrupt-latency wesentlich größer wird... immerhin musst du, sobald ein interrupt eine FPU instruktion verwendet alle FPU register sichern und beim verlassen wieder zurückschreiben.

Das sollte man auf keinem Fall vernachlässigen!

Hadmut F. schrieb:

aber mit langsam float wird die sensor fusion acc & gyro schwierig, da sind massig floats.

Kommst du mit fixed-point nicht zurecht? Ein paar wenigen Nachkommastellen sollten doch reichen, oder?

Bei den Winkelfunktionen brauchst du eigentlich nur 0-90° in einer Lookup-Table. Also bei 0.1° Genauigkeit 910 Stützpunkte also <4k im Flash bei 4-byte-"floats".

Ansonsten hätte der CH32V307 eine FPU... (+ ein paar nette interfaces)

73

OP #7920439
Lesenswert?

Chris schrieb:

Der Cortex-M33 hat aber eine. Hans Schon, das Problem wird aber sein, dass damit die interrupt-latency wesentlich größer wird... immerhin musst du, sobald ein interrupt eine FPU instruktion verwendet alle FPU register sichern und beim verlassen wieder zurückschreiben.

Der PiPico2 ist aber ein Dual-Core. Da kann man einen Kern als Numbercruncher ohne Interrupts betreiben.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren