Skip to the content.

CH32V003

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:
ch32v003 front ch32v003 back

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

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ó 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ý

image

Chi tiết xem ở đây https://www.wch-ic.com/products/CH32V003.html

Demo

  1. Đọc đinh danh 64-bit của mỗi MCU
  2. CH32V003: GPIO as Output
  3. CH32V003: GPIO as Input (Polling, Interrupt)
  4. CH32V003: UART Transmit / Receive data
  5. CH32V003: PWM output
  6. CH32V003: How to use an ADC
  7. CH32V003: How to use I2C
  8. CH32V003: How to use SPI
  9. CH32V003: Timer based Periodic Interrupt

Nạp firmware thế nào?

Hỗ trợ 2 phương thức nạp firmware:

  1. 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
  2. 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ụ

  1. Tải về cồng cụ https://www.wch.cn/downloads/file/418.html?time=2025-01-29%2000:40:51&code=s1HwvyGrvKvxJQz9lHAZEeXXXnaVCHatzQX7yitg
  2. Giải nén thư mục
    alt text
  3. Cắm thiết bị WCH-LinkE vào cổng USB
  4. Mở Device Management. Kiểm tra xem thiết bị có được nhận driver đúng như trong ảnh không?
    alt text
    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

ch32_wchlinke 1 ch32_wchlinke 2

Kết nối công cụ WCH-LinkE

  1. Cài đặt và chạy tool WCH-Utility
    WCH-ELink
  2. Trên WCH-Utility, ở thanh menu, bấm Target/Connect WCH-Link 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!
    
  3. 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

    alt text

WCH-LinkE có 2 mode hoạt động tương ứng với 2 dòng MCU theo kiến trúc RISC-VARM. 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:

  1. Ngắt hờ cụm dây nối WCH-LinkE với board.
    How to erase CH32V003 flash memory
  2. Cắm lại cụm dây 1-wire nối WCH-LinkE với board liên tục như trong video.
  3. 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).
    Erase Chip
    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

Hình ảnh cuôi cùng như sau:
alt text

Nạp firmware với hex file

  1. Giả định đã có hex file bằng các công cụ như ArduinoIDE, PlatformIO, etc.
  2. Mở WCH-Utility
  3. 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.
    alt text
  4. Bấm nút alt text 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

  1. Kết nối dây để nạp code

    Twen32 WCH-eLink
    GND GND
    V 3v3
    PD1 SMDIO/TMS
  2. Nối linh kiện để demo
    • Led nối giữa chân GPC0
  3. Trong ArduinoIDE, thêm loại Board Manager URL mới:

     https://github.com/openwch/board_manager_files/raw/main/package_ch32v_index.json
    
  4. Cài đặt board mới (CH32 MCU EVT boards)
    alt text

  5. Chọn board CH32V00x và cổng COM
    alt text

  6. 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);
     }
    
  7. Bấm Upload như các dự án khác.
    Done. alt text

    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

  1. Khai báo board trong platformio.ini như 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