CH32V003
- Thông số
- Sơ đồ nguyên lý
- Demo
- Nạp firmware thế nào?
- Sử dụng thiết bị WCH-LinkE
- Nạp mã nguồn từ ArduinoIDE
- Nạp mã nguồn với PlatformIO
- Mua sắm
- Tham khảo
Thông số
CH32V003
| Left | Right | ||
|---|---|---|---|
| SPI-SCK | PC5 | PC4 | SPI-SS |
| SPI-MOSI | PC6 | PC3 | – |
| SPI-MISO | PC7 | PC2 | I2C-SDA |
| PD0 | PC1 | I2C-SCL | |
| SWDIO | PD1 | PC0 | |
| PD2 | PA2 | – | |
| PD3 | PA1 | – | |
| PD4 | PD5 | RX | |
| PD7 | PD6 | TX | |
| V | V | :– | |
| G | G | :– |
CHV003 thuần:

twen32 CHV003 với flash nhiều hơn:

- được thiết kế dựa trên lõi RISC-V2A 32-bit Qingke V2A
- Điện áp vào: :imp: 3.3 / 5V
- Tần số chính: 48MHz
- 1 timer đa năng 16 bit
- 1 timer nâng cao 16 bit
- 1 giao tiếp USART
- 1 giao tiếp IIC (https://youtu.be/4Amal_bGvr0)
- 1 giao tiếp SPI
- 18 cổng I/O
- Kích thước: 31m * 18mm
- 1 Omp làm nhiệm vụ khuếch đại và so sánh = tín hiệu (liên quan tới chức năng ADC)
- 1 Timer cơ sở hệ thống 32 bit SysTick để tạo độ trễ (delay(), millis()).
- 2 WatchDog
- ADC 10bit, áp dụng lên 1 trong 8 kênh vào theo thứ tự PA2, PA1, PC4, PD2, PD3, PD5, PD6, PD4.
- Giao diện gỡ lỗi dòng đơn nối tiếp
- Interrupt/Ngắt lồng chỉ tối đa 2 mức.
- 2 chế độ năng lượng thấp: Sleep, Standby
- Đặt lại bật / tắt nguồn, máy dò điện áp có thể lập trình
- Mỗi MCU có một id định dạnh gồm 64 bit. Xem cách đọc thông số này
1. Bảng so sánh thông số kỹ thuật (Hardware Specs)
| Thông số | CH32V003 Thuần (Tiêu chuẩn WCH) | CH32V003 trên bo TWen32 |
|---|---|---|
| Tần số thạch anh (Clock) | 48 MHz | 48 MHz |
| Bộ nhớ Flash (Gốc / Thực tế) | 16 KB | 64 KB (Phần cứng thực tế tích hợp) |
| Bộ nhớ SRAM (Gốc / Thực tế) | 2 KB | 8 KB (Phần cứng thực tế tích hợp) |
| Điện áp hoạt động | 3.3V / 5.0V | 3.3V / 5.0V |
| Chuẩn nạp / Debug | 1-Wire SDI (PD1/SWDIO, PD0/SWCLK) |
1-Wire SDI (PD1/SWDIO, PD0/SWCLK) |
| Giao tiếp ngoại vi | USART (1), I2C (1), SPI (1) | USART (1), I2C (1), SPI (1) |
| Kênh ADC | 10-bit ADC (8 kênh) | 10-bit ADC (8 kênh) |
| Timer / PWM | 1x Advanced Timer, 1x General Timer | 1x Advanced Timer, 1x General Timer |
2. Bảng so sánh đặc điểm bo mạch & Trải nghiệm thực tế
| Đặc điểm thiết kế | Bo CH32V003 Mini (Loại có nút bấm) | Bo TWen32F003 (Bo đen không nút) |
|---|---|---|
| Nút bấm Reset / Boot | Có (Có nút Reset cứng trên bo) | Không (Loại bỏ nút bấm cơ) |
| Chân Breakout NRST | Có đưa chân NRST ra hàng Pin | Không đưa chân NRST ra hàng Pin |
| Giao tiếp USB Type-C | Chỉ cấp nguồn (Không có USB-UART) | Chỉ cấp nguồn (Không có USB-UART) |
| Tình trạng cờ bảo vệ (ROP) | Thường tắt (Nạp dễ dàng ngay từ đầu) | Thường bật sẵn hoặc bị kẹt chân PD1 |
| Thao tác xử lý khi bị khóa SDI | Bấm giữ nút Reset cứng khi cắm nạp | Bắt buộc dùng mẹo kẹp nguồn/quẹt VCC (Cold Power-Cycle) |
| Cấu hình Compiler (PlatformIO) | Sử dụng mặc định board = generic_CH32V003F4P6 |
Cần chỉnh Linker Script để mở rộng lên 64K Flash / 8K RAM |
Sơ đồ nguyên lý
Chi tiết xem ở đây https://www.wch-ic.com/products/CH32V003.html
Demo
- Đọc đinh danh 64-bit của mỗi MCU
- CH32V003: GPIO as Output
- CH32V003: GPIO as Input (Polling, Interrupt)
- CH32V003: UART Transmit / Receive data
- CH32V003: PWM output
- CH32V003: How to use an ADC
- CH32V003: How to use I2C
- CH32V003: How to use SPI
- CH32V003: Timer based Periodic Interrupt
Nạp firmware thế nào?
Hỗ trợ 2 phương thức nạp firmware:
- Nạp qua giao diện SDI 1 dây (WCH-LinkE)🔌
- Chân kết nối: Chỉ cần 1 chân dữ liệu duy nhất là PD1 (SWDIO) cùng với 2 chân nguồn.
- Hỗ trợ Debug (gỡ lỗi realtime) ngay trên phần mềm
- Cần mạch nạp chuyên dụng WCH-LinkE
- Nạp qua Bootloader tích hợp sẵn (ISP Mode / UART)⚡
- Cách kích hoạt: Đưa chân BOOT0 lên mức cao VCC trong lúc cấp nguồn/Reset để chip chuyển sang chế độ nạp ISP.
- Chân kết nối: Sử dụng cổng UART (TX/RX) kết nối qua mạch chuyển đổi USB-to-UART (như CH340, FT232).
- Ưu điểm: Không cần mạch nạp WCH-LinkE, có thể nạp bằng phần mềm WCHISPTool
Sử dụng thiết bị WCH-LinkE
Cài đặt công cụ
- Tải về cồng cụ https://www.wch.cn/downloads/file/418.html?time=2025-01-29%2000:40:51&code=s1HwvyGrvKvxJQz9lHAZEeXXXnaVCHatzQX7yitg
- Giải nén thư mục

- Cắm thiết bị WCH-LinkE vào cổng USB
- Mở Device Management. Kiểm tra xem thiết bị có được nhận driver đúng như trong ảnh không?

Nếu không, vào cài driverc WCH-Utility\Drv_Link\WCHLinkDrv_WHQL_S.exe
Kết nối WCH-LinkE với board

Kết nối công cụ WCH-LinkE
- Cài đặt và chạy tool WCH-Utility

-
Trên WCH-Utility, ở thanh menu, bấm Target/Connect WCH-Link
để thực hiện việc kết nối phần mềm WCH-Utility và công cụ debug WCH-eLink. Hộp messagebox ở cuối giao diện phải hiện ra thông báo.Succeed to connect with WCH-Link! - Bấm nút Refresh. Sau đó, cấu hình chế độ hoạt động của WCH-ELink là làm việc với Risc-V như sau:
- Connected WCH-Link List = RISC-V Link (#1)
- Active WCH-Link mode = WCH-LinkRV

WCH-LinkE có 2 mode hoạt động tương ứng với 2 dòng MCU theo kiến trúc
RISC-VvàARM. Vì vậy cần chuyển mode để phù hợp.
Xóa toàn bộ Flash (áp dụng khi MCU bị khóa)
Mô tả: trên board TWen32, nhà sản xuất thường nạp sẵn một bản Firmware test/Bootloader gốc. Bản Firmware này có 2 đặc điểm gây kẹt WCH-LinkE: Chân PD1 (SWDIO) bị cướp chức năng, hoặc Chế độ Power-Saving (Sleep) làm tắt clock của giao diện SWD/SDI.
Giải pháp xóa toàn bộ Flash với Cold Reset Power-Cycle:
- Ngắt hờ cụm dây nối WCH-LinkE với board.

- Cắm lại cụm dây 1-wire nối WCH-LinkE với board liên tục như trong video.
- Trên phần mềm WCH-LinkUtility, bấm Tools/Erase Chip (hoặc tốt nhất là bấm phím F9 liên tục).

Chú ý: bước 3 phải làm sau bước 2 và thật nhanh.
Ngay lập tức cắm lại dây nguồn 3V3 vào bo TWen32 trong vòng 0.5 giây. Việc cấp nguồn đột ngột sẽ buộc chip thực thi chuỗi khởi động lại và WCH-LinkE sẽ chộp lấy giao diện SDI trước khi code mẫu trong chip kịp chạy.
Mở khóa MCU
- Bấm Target / Disable Chip Code-Protect
Có thể xem thêm thông tin phụ như:- Bấm Target / Query Chip Info

- Bấm Target / Query Chip Info
Hình ảnh cuôi cùng như sau:

Nạp firmware với hex file
- Giả định đã có hex file bằng các công cụ như
ArduinoIDE,PlatformIO, etc. - Mở WCH-Utility
- Bám File/Open Firmware (hoặc Alt+F1) và trỏ với file hex.
Hộp Target File phải hiện thông tin đúng như đường dẫn đã nhập.

- Bấm nút
Execute Checked Operation (hoặc Alt+F4)
KHÔNG bấm Target/Program (Alt+F10) vì tính năng này không phải là nạp firmware.
File hex luôn được đọc lại refresh vào thời điểm bấm nút nạp. Vì vậy không cần phải thực hiện lại thao tác trỏ vào file hex mới.
Nạp mã nguồn từ ArduinoIDE
-
Kết nối dây để nạp code
Twen32 WCH-eLink GND GND V 3v3 PD1 SMDIO/TMS - Nối linh kiện để demo
- Led nối giữa chân G và PC0
-
Trong ArduinoIDE, thêm loại Board Manager URL mới:
https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json -
Cài đặt board mới (CH32 MCU EVT boards)

-
Chọn board CH32V00x và cổng COM

-
Tạo dự án mới và copy đoạn code như sau
#define MYLED PC0 void setup() { pinMode(MYLED, OUTPUT); } void loop() { digitalWrite(MYLED, LOW); delay(100); digitalWrite(MYLED, HIGH); delay(1000); } - Bấm Upload như các dự án khác.
Done.
Không cần bấm bất cứ nút nào trước hoặc sau khi nạp code. Chương trình được nạp và tự chạy luôn.
Nạp mã nguồn với PlatformIO
-
Khai báo board trong
platformio.ininhư sau[env:ch32v003f4p6_evt_r0] platform = https://github.com/Community-PIO-CH32V/platform-ch32v.git board = ch32v003f4p6_evt_r0 framework = arduino # Sử dụng mạch nạp WCH-LinkE: wch-link, hoặc nạp qua Bootloader UART: wchisp. Tuy nhiên,cách dùng wchisp chưa thử thành công. upload_protocol = wch-link monitor_speed = 115200 build_flags = -fno-strict-aliasing -Os -ffunction-sections -fdata-sections -Wl,--gc-sections
Mua sắm
PHẢI mua loại có nút bấm. Loại không có nút bấm không thể nào detect được bằng công cụ WCH-eLink.
Tham khảo
https://www.hackster.io/patrick-fitzgerald2/program-ch32v003-risc-v-with-arduino-ide-135f6f