CH32V006についてのch32funのバグ
CH32V006を少しいじってみたが、新しいICということで、ch32funでまだ対応できていないことなどがあって、苦労した。 その際、小さなバグを発見したので、ここに書いておこうと思う。
まず、rv003usbのbootloaderで小さなデータをflashに書き込むときには問題ないのだが、大きなデータのときには問題がある。 2026/8/20のブロクには、minichlinkで32k以上を消去するには、pgm-b003fun.cのerase_block_binの14バイト目を0x16から0x56に変える必要があることを書いたが、おそらくその問題はch32v006でも現われるだろう。 また、消去の待ち時間が足りなくて時々エラーが出るので、以下のようにして同じファイルのmax_retriesの値を100から200に変えると、このエラーは出なくなる。
sed -i -e 's/max_retries = 100;/max_retries = 200;/' pgm-b003fun.c
いくつかのプログラムを試してみたのだが、GPIOはあっさりと動いた。 PWMはうまくいかなかったが、これは私のプログラムの問題だった。 ピンとタイマーの情報をstatic const uint8_tの配列に保存していたのだが、これをうまく読み出せていないようだったので、static volatile uint8_tにしたらうまくいくようになった。 constだとflashに配置しようとして、アラインメントの問題が生じることがあるようだ。
次にADCを使おうとしたら、ここでもうまく動かなかった。 これは、CH32V003とは、使い方が少し変っていたのが原因で、ADCの初期化の部分をCH32V20xと同様に処理するようにしたらうまく動くようになった。 具体的には、以下の様に修正すれば良い。
sed -i -e '/void funAnalogInit/,/#if defined(CH32V20x)/ s/#if defined(CH32V20x)/#if defined(CH32V20x) || defined(CH32V006)/' ch32fun.c
これで、funAnalogInitとfunAnalogReadでADCを使えるようになる。
他の機能については、まだ使ってみていない。 ch32funでch32v006を使う場合には、他にもいろいろとトラブルがあるかも知れないが、徐々に解決していきたいと思う。