タラバガニー設計局stalins.clubNOTE/notes/ch32v003-software-usb-bootloader

USBを持たないCH32V003をUSBで書き込むrv003usb bootloader

CH32を理解するためのノート群 の中でも、CH32V003の開発文化を象徴する例。

事実

CH32V003はハードウェアUSB peripheralを持たない。

cnlohr/rv003usbは、V003のGPIOとソフトウェア処理だけでUSB Low-Speed deviceを実装するプロジェクトである。

低レベルの受信処理はassembly、上位USB処理はCで実装される。

rv003usbにはHID、gamepad、keyboard/mouseなどの例に加え、self-flashing bootloaderが含まれる。

bootloader版はHIDとしてenumerateし、コード実行・書き換え機能を約1,920 bytesへ収めている。

V003には通常のuser Code Flashとは別に、0x1FFFF000から始まる1,920-byteのSystem/BOOT領域がある。工場出荷時bootloaderもこの領域を使う。

rv003usb bootloaderをここへ配置すれば、16KBのuser Code Flashをbootloaderで削らずに運用できる。

minichlinkはこのUSB bootloader経由の書き込みをサポートする。

工場bootloaderとの違い

V003の工場bootloaderはUART ISPである。

CH32V00xにはUSB ISPはなく、wchispもV00xについてserial transportを使うよう説明している。

またV003の工場bootloaderは、BOOT0 pinのような外部pin状態だけで入る方式ではない。ユーザープログラムがFLASH_STATR.MODEを設定してsoftware resetする必要がある。

そのため工場出荷直後のblank chipへUARTだけで最初のコードを入れる用途には制約がある。

考察

rv003usbの価値は「USBが使える」ことより、安価な製品へUSB connectorだけを出し、日常のfirmware update経路まで作れることにある。

初回だけSWIO programmerでbootloaderを入れれば、その後は専用書き込み器なしで更新できる。

V003のような非常に安いMCUでは、製品一台あたりに高価なdebug connectorを残さず、USBをupdate経路として使える意味が大きい。

一方software USBはtiming制約が厳しい。アプリケーション動作中にUSB stackを常用する場合と、起動時bootloaderだけで使う場合を分けて考えるべきである。

さらに変な使い方

rv003usbにはV003自身をSWIO programmerとして使うrvswdio_programmerも存在する。

つまり、

PC → software USB → CH32V003 → SWIO → 別のCH32

という構成まで作れる。

出典

▸ ノート一覧に戻る