8PinのRISC-VマイコンCH32V003J4M6をArduino IDEで使っています。
時としてプログラムを書き込めなくなるので,その事例と対処法のメモです。

私の場合,UART通信を使ったときに書き込めなくなったので,エミュレーターのユーティリティ機能でマイコン上で動いている「プログラムを全消去」を使いました。



CH32V003の中でもJ4M6はピン数が8と少ないマイコンなので,プログラムの書き込みピンSWIOとデフォルトのUART通信のTXが同じPD1ピンになっています(^^;;;。

実はArduino IDE のシリアルモニタを使うのにもTXをWCH-LinkEエミュレーターのRXに接続する必要があります。


今,私が欲しい思っているピンの役割とWCH-LinkEとの接続です。








[問題点 プログラムが書き込めなくなる!]

実際にTX-RXもつないでUARTを動かしてみると一度は動きますが,次回からプログラムが書き込めなくなります。

考えてみればプログラムがスタートするとUARTがPD1を占領して動き続けるのです。

マイコンの開発ボードなどではリセットをかけてプログラムモードで待機する仕様になっているようですが,今回の組み合わせのシステムではプログラムを強制的に全消去する荒技が用意されていました(^^;;;;。



[WCH-LinkUtilityでプログラムを全消去してから再度プログラムを書き込む]
 
WCH-LinkEの初期設定に使ったWCH-LinkUtilityで,マイコン上で動いているプログラムを強制的に全消去します。

電源も落とさずにマイコンと上記の接続をしたまま,
WCH-LinkUtilityの"Target"タブから"Clear All Code Flash-By Power off"を選ぶと実行され,結果が表示されます。

なお,「Power off」によるリセット はWCH-LinkEの電源供給のコントロールで自動的に行われているみたいなので手は出さないようにしています。





下記はこれで消去した後,性懲りも無く再度書き込んでシリアルモニタに出力してみたプログラムです(^^;;;;;

なおArduino IDEでは今のところ"serial1"などのピン変更はうまくいかないようです。




一度消しても,また入れて動かすと書き込めなくなるので,PCの画面はArduino IDEとWCH-LinkUtilityとリファレンスマニアルのWindowが開いたままで作業しています(^^;;;。




動いているマイコンにプログラムが書き込めなくなるのはBASICで動くマイコンのPICAXEでも経験していたので,何かあるだろうと思っていたら,フォーラム上に回答がありました。

CH32V003シリーズでも8pin以外はリセットNRST信号が出ていますし,プログラムを書き込むPD1ピンも独立しているのでそうは問題が無いのですが,8pinで困ったご同輩がやはりいたようです(^^)。

ま,UARTに限らず,プログラムが書き込み難くなった時の手段として使えそうですね。