CH32V003で、UARTで書き込みできるブートローダを書き込んで利用する

tl;dr

  • CH32V003 には UART 経由で書き込めるようになるブートローダーのコードが公開されているよ
  • ハードウェア WCH-LinkE、ソフトウェア WCH-LinkUtility を使ってブートローダーを書き込んだあとに、PC0を3V3にいれて電源を入れると、UART経由で書き込めるモードに入って、専用のツールでUART経由で書き込めるようになるよ
  • しかし、安価なUSBシリアル変換IC CH340 では書き込めず、WCH-LinkE 付属の UART か、FT232HL で書き込めることを確認できたよ。
    • (2023/3/20追記)CH340でも成功しました。CH340Gなど外部クリスタルのものの方が成功しやすいようです。

動機

WCHのgithubにて、CH32V003 で UART 経由で書き込めるようにする手順が、PDFで公開されています。

github.com

この手順に従うことで、UART 経由で書き込めるとのことでした。

自分の作っているCH32V003開発ボードを販売しようと思ったときに、私の方で先にブートローダーを書き込んでおけば、手に入りやすいUSBシリアル変換で書き込めるようになるのではと思い立ちました。

このUARTの通信を解析すれば、専用のツールを使わなくてもコマンドラインで手軽に書き込めるようになればいいなと期待していました。

ブートローダーをビルドする

ブートローダーのコードは以下にあります。

github.com

このディレクトリは MountRiverStudio プロジェクトファイルになっています。

MountReverStudioで開いて、Buildを押すと、obj/CH32V003_IAP.bin がビルドされます。

ブートローダーを書き込む

ブートローダーのファームウェアを書き込むには、ハードウェア WCH-LinkE と、ソフトウェアWCH-LinkUtilityを使います。WCH-LinkUtilityはいかにあります。

github.com

これは現在のところ Windows でしか提供されていません。これを以下のように操作するとブートローダーを書き込むことができました。

ブートローダーで、UARTを待ち受ける状態にする

ブートローダーは以下のように動いています。

  • D5(TX)、D6(RX)でUARTを開始する
  • PC0 が low(0V) ならばファームウェアを起動し、 High(3V3)ならば UART で待ち受けるようになる。

また、注意点として、以下があります。

  • RST では確かにファームウェアはリセットされているようなのですが、このモードを切り替えることができませんでした。直接電源を抜き差ししていました。
  • PC0が未接続(フローティング)であればファームウェア起動となるはずですが、そのようにはならず、low/high を的確に設定しないと、どっちの状態になるかよくわかりませんでした。

専用ツールを使ってUART経由で書き込む

専用ツールが、以下に公開されています。

github.com

Demoと書いてあるのが、STMicroを意識している感じがして面白いです。

先にCH32V003のPC0を high(3.3V)につないで、電源を入れます(5Vピンを抜き差ししていました)。この状態で、このツールを以下の手順で操作します。

書き込むが成功すると、「Success to IAP Download」と表示されます。

CH340 では書き込めなかった

普段は、USBシリアル変換IC CH340C を使ったデバイスを使っています。しかし、これでは書き込みに成功しませんでした。

一方以下の2つのデバイスでは書き込むことができました。

  • WCH-LinkE 付属のUSBシリアル変換
  • FT232HL

FT232HLは秋月でも購入することができます。

akizukidenshi.com

(2023/04/15追記)その後再度試すと、CH340Cでも問題なく書き込みに成功しました。

試して駄目だったこと

ブートローダーのコードにはUARTの速度が書かれています。この速度を落とせば CH340C でも書き込めるようになるのではないかと思いました。

github.com

しかし、リビルドして再度ファームウェアを書き込んでも、なぜか専用のツールのUARTの速度を下げても書き込めるようにはならず、依然として 460800 でしか書き込むことができませんでした。新しい CH32V003 を用意してきても同様でした。。。謎です。

(2023/3/20追記)以下の箇所に固定値が書かれていました。0xd0 を指定すると、115,200 bps でUARTが動作することを確認できました。

https://github.com/openwch/ch32v003/blob/main/EVT/EXAM/USART_IAP/CH32V003_IAP/User/iap.c#L50

まとめ

あらかじめこのブートローダーを書き込んでおけば、WCH-LinkEがなくても書き込めることが確認できました。

しかし、安価な CH340 では書き込むことができず、FT232HL のようなICを使ったUSBシリアル変換が必要であることがわかりました。

やりたかったマイCH32V003開発ボードの販売に事前にブートローダ書き込んでおく作戦を目論んでいました。しかし、安価なUSBシリアル変換は使えなかったため、高価なUSBシリアル変換を買うくらいならWCH-LinkEを買えばよいので、この作戦は微妙だなぁ、という結論になってしまいました。今WCH-LinkEに使われているCH32V305FBP6を購入したところなので、WCH-LinkE付きで販売できないか考えます。

(2023/3/26追記)MacOSLinuxでもUART経由で書き込めるようにするツールを作りました。

github.com