CH32VのオレオレArduino環境を作ろう その8 ファームウエア転送方法

概要

前回はタイマー周りを実装しました。現在USB PDの実験をしているのですが、結構手間がかかるのでもう少し寄り道して、書き込み方法を調べてみました。

書き込み方法一覧

ツール書き込み方法WindowsLinuxmacOS
MounRiver StudioWCH-LinkEX
MounRiver Studio CommunityWCH-LinkEXX
MounRiver Studio ToolchainWCH-LinkEXX
openocdWCH-LinkEXXX
WCH-LinkUtilityWCH-LinkEX
wlink(Rust)WCH-LinkEXXX
minichlink(ch32v003fun)WCH-LinkEXXX
WCHISPTool_Setup(WCHISPStudio)USB、SerialX
WCHISPTool_CMDUSB、SerialXX
wchisp(Rust)USBX
(WinUSB)
XX
UF2(USB Mass Storage)USB
(Mass)
XXX
WCHMcuIAP_WinAPPSerialX
ch32v003-uart-programmer(Go)SerialXXX

上記が一覧になります。OSによって使えるツールが結構違うので気をつける必要があります。

書き込み方式

WCH-LinkE

純正書き込み機を利用した転送方式です。これが一番基本的なものなのですが、標準的なSWDではなく、拡張したSWDを利用しているため一般的なSWD書き込み機では転送できないチップがあります。

https://www.wch.cn/downloads/WCH-LinkUserManual_PDF.html

WCH-LinkEのマニュアルに書いてありますがCH32V10xとCH32V20x、CH32V30xは標準のSWDに対応しているWCH-Linkで転送できますが、それ以降のCH32V00xやXやLのチップはRISC-Vモードに対応しているWCH-LinkEを使う必要があります。

ただ、一部のチップではWCH-Linkが使えるとしても、WCH-LinkEに統一しておいたほうがCH32X035に書き込めないみたいなミスをするのでおすすめです。

USB

CH32V00xシリーズ以外のRISC-VチップはUSBデバイス機能を搭載しており、BOOTピンをHIGHにして起動することによりUSBポートからの書き込みが可能になります。

CH32V103の場合にはBOOT用のピンが独立しているのでわかりやすいです。ただし、データシート上にはこの情報がなく、EVTの中にある「Evaluation Board Reference」を確認する必要があります。

CH32X035の場合にはUSB_P(PC17)がBOOTになり、HIGHにして起動することで書き込みモードになります。

書き込みモードへ自動的に遷移できないので、IDEなどからの自動書き込みもできません。かなり書き込みが面倒ですが、WCH-LinkEがなくても書き込めるメリットはあります。

Serial

シリアル転送で書き込みができるモードがあるのですが、調べてみたところかなり使いにくい仕様でした。チップのROM領域にあるブートローダーでサポートされているものではなく、プログラムの先頭領域にシリアルでの書き換えが可能になるファームウエアを転送し、本体のプログラムはその後ろにずらして配置する必要があります。

最初にWCH-LinkEやUSBでシリアル転送できるブートローダーを転送しておけば、その後はシリアルだけで更新可能なのですが、WCH-LinkEなどで他のプログラムを転送してしまうとシリアル転送のボードローダーも上書きされてしまいます。シリアル転送で動かすファームウエアも開始アドレスをずらした特殊設定が必要になるので個人的にはおすすめしません。

マニュアルでも限定的な用途でしかおすすめしないとありました。開発環境などを全部準備してそのなかでプログラムをするなどの学習ボードなどであれば非常に便利かと思います。また、こちらはUSBデバイスを利用しないのでCH32V003でも利用可能です。

USB(Mass)

こちらもシリアルと同様にUSBマスストレージとして認識するファームウエアを入れておき、UF2ファイルをコピーするとそれを書き込んでプログラムの更新をします。

Adafruitなどはこの方式を好んでいるように思えますが、ブラウザ上でプログラミングをして転送するファームウエアをダウンロードしてコピーするみたいな環境を準備できる場合には便利だと思います。

書き込みソフト

MounRiver Studio/openocd

標準的な開発環境であるMounRiver Studioとその中で利用しているopenocdの組み合わせです。MounRiver StudioもOSによって提供されているパッケージが違うので注意が必要です。

Arduino IDE上ではデバッグもできるようにopenocdを使って転送しているのでWCH-LinkEのみの書き込み方法に限定されています。

WCH-LinkUtility

WCH-LinkEを利用してファームウエアを転送する場合に利用する標準ツールです。このツールはWindowsでしか提供されていませんので注意が必要です。そしてWCH-LinkEのファームウエアバージョンを更新する場合にはWCH-LinkUtilityかMounRiver Studioを利用する必要があるのでWCHだとWindows環境で開発をするのが一番無難になります。

wlink(Rust)

Rustで作られたWCH-LinkE用転送ツールです。Rust以外の場合にはあまり利用されていないと思います。

minichlink(ch32v003fun)

標準SDKのEVTよりも軽量なch32v003fun環境で利用する転送ツールです。おそらくこのツールが一番できがよい気もします。

WCHISPTool

USBデバイスから書き込みをするためのツールです。Windows版のみGUIでLinuxとmaxOSはCLIのみの提供となります。そして書き込みに必要な設定ファイルはWindows版で出力する必要があるのがちょっと面倒なツールとなっております。

wchisp(Rust)

Rust製のツールでWindowsはZadigを利用してWinUSBにドライバを入れ替える必要があります。実際のところ面倒なのでおすすめしません。WCH-LinkUtilityなどで利用できなくなるので、このツールの利用をとめて、ドライバの更新などを使ってデフォルトドライバに戻すのをおすすめします。

WCHMcuIAP_WinAPP

シリアル経由でプログラムを書き込みためのツールです。このツールは掲示板やメールで問い合わせをするとソースをくれるみたいな運用でした。

非常に特殊状況以外では利用をおすすめしません。

ch32v003-uart-programmer

74thさんによるシリアル書き込みツールです。Go言語で作られており、マルチプラットフォームで動作するのが特徴です。

(おまけ)CH32V003に書き込みできない場合

CH32V003はSWDのピンを他のモードに変更することができる関係で、初期化を間違えると書き換えることができない状態になってしまいます。他のボードだとBOOTピンでUSB経由での書き込みモードとかあるのですが、CH32V003はUSBもなくピン数も少ないのでよく書き込み不可になります。。。

MounRiver Studio

MounRiver Studioの場合メニューにあるFlashのCongigurationの中から、Erase Code Flashで「By Power off」を選択してApplyすることでファームウエアを消して初期状態に戻すことができます。

WCH-LinkUtility

WCH-LinkUtilityからの場合にはTargetの「Clear All Code Flash-By Power off」を選択してクリアすることができます。

minichlink

Usage: minichlink [args]
 single-letter args may be combined, i.e. -3r
 multi-part args cannot.
 -3 Enable 3.3V
 -5 Enable 5V
 -t Disable 3.3V
 -f Disable 5V
 -u Clear all code flash - by power off (also can unbrick)
 -b Reboot out of Halt
 -e Resume from halt
 -a Place into Halt
 -D Configure NRST as GPIO
 -d Configure NRST as NRST
 -s [debug register] [value]
 -g [debug register]
 -w [binary image to write] [address, decimal or 0x, try0x08000000]
 -r [output binary image] [memory address, decimal or 0x, try 0x08000000] [size, decimal or 0x, try 16384]
   Note: for memory addresses, you can use 'flash' 'launcher' 'bootloader' 'option' 'ram' and say "ram+0x10" for instance
   For filename, you can use - for raw or + for hex.
 -T is a terminal. This MUST be the last argument.

「minichlink -u」でClear all code flash – by power offでクリアされます。

リセット連打

リセット連打しながら任意のツールで成功するまで何度も書き込むことでSWDが利用できないファームウエアが動く前のタイミングで書き込みができる場合があります。minichlinkを使えばWindows以外の環境でもリカバリ可能ですがminichlinkは自分でビルドする必要がありちょっと面倒なので、覚えておいてもよいテクニックです。

まとめ

WCH-LinkEとUSBだと同じファームウエアを転送することができるので、USB経由も自動書き込みができれば便利なのですがちょっとむずかしそうです。

シリアルはESP32のように自動書き込み回路が作れそうなのですが、最初のブートローダー書き込みがネックになりそうです。なのでおすすめはWCH-LinkEでの書き込みになります。

コメント