ch32x035のbootloaderの書き換え


ch32v203用のmruby/cで、mrbコードだけを書き換えるためには、comuのbootloaderとminichlinkを使うと良いことは、2026/8/20のブログに書いた。 そのときは、主にminichlinkの問題で、32k以上のコードを書き込むことができなかったが、その後にそれを修正して64kまで書き込めるようになり、通常の用途には十分になった。 これで、ch32v203のmruby/c環境には、大きな問題点は無くなったと考えている。

一方、ch32x035についても、mrbコードだけを書き換えられないという同じ問題が残っている。 こちらはch32funのexamples_usbのbootloaderを使うと良いだろうと考えていたので、試してみた。 それをch32x035用にコンパイルして、WCH-LinkEで接続して以下のコマンドを実行すると、ch32x035のbootloader領域を書き換えることができる。

sudo ./minichlink -w bootloader.bin bootloader

すると、bootモードで立ち上げると、新たなbootloaderが立ち上がり、アドレスを指定してminichlinkでコードを書き込めるようになる。 但し、そのアドレスはflashの消去の単位である256の倍数とする必要がある。

mrblibとTaskとFloatを無効にした状態で、現在のmruby/cを動かす本体のバイナリのサイズは57kよりも僅かに小さい。 mrbを57kのところに置くようにプログラムを書き換えて、make buildするとバイナリができる。 それを書き込むには、bootモードにして、以下のコマンドを使えば良い。

sudo ../minichlink -w ch32x035.bin flash

そして、以下のようにmrbコードのみを書き換えることもできる。

sudo ../minichlink -w temp.mrb flash+$((1024*57)) -b

最初にWCH-LinkEを使わないといけないのが面倒だが、一旦bootloaderとメインのバイナリを書き込んだら、その後はUSBからmrbコードだけを書き換えればよいので、mruby/cの運用が楽になった。 minichlinkはそのままだと32k以上のflashの消去に失敗するだろうが、2026/8/20のブログの追記のように変更すれば、問題は起こらなかった。 ch32x035については、ほとんど使わないmethodを消すなど、使い易くするための様々な工夫がまだ考えられるが、mrbコードのみの書き換えが出来るようになったのは大きいだろう。

また、このbootloaderが気に入らなければ、unbrickすると、元のbootloaderに戻るらしい。 これは試してはいないが、元に戻せるのなら、安心してbootloaderを書き換えることができるだろう。 しかし、全体を一括してしか書き換えられないwchispよりも、部分的に書き換えのできるminichlinkがうまく動けば、そのままで通常は問題ないだろう。