CH32X035で充電器をPD制御する

# 経緯
　充電器を購入しようとしたら、ＰＤとかＰＰＳという言葉が目に付いた。
　最近の充電器は５Ｖ以外の電圧を出せる様だ。今更気が付いた。
　トリガー基板なるものを物色していたら、ワンチップマイコンでも出来るじゃないか。
　◆◆◆　よし、試してみなければ　◆◆◆
　しかしCH32X035チップの小さい事、単価も安いけど。

# 必要なハード
　◇CH32X035のチップが乗った基板
　　CH32X035F8U6 Mini Core Board。
　　アリエクで1200円/5個程度で販売していた。
　　日本のアマゾ〇では売ってないようだ。
  ![board.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/cb4a9d00-bb8d-d512-91af-79d7ee027b4a.jpeg)

　◇開発装置
　　WCH-LinkE
　　同様に500-1000円程度で販売している。
![wch-linke.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/a73799af-4d32-c11e-a428-c25a3f6d2875.jpeg)

# 接続
　下記６本を、基板とWCH-LinkE間で接続。下記２本はプログラム内で使用。
　　基板　　　WCH-LinkE
　　３Ｖ３　　３Ｖ３　　　電源
　　ＧＮＤ　　ＧＮＤ　　　グランド
　　ＤＣＫ　　ＳＷＣＬＫ　デバッククロック
　　ＤＩＯ　　ＳＷＤＩＯ　デバック信号
　　Ａ２　　　ＲＸ　　　　シリアル送信
　　Ａ３　　　ＴＸ　　　　シリアル受信

# 必要なソフト
　◇コンパイラ
　　MounRiverStudio　Eclipseをベースにした、由緒正しき開発環境。
　　オールインワン、これ一つで小難しいツールチェーンも入れてくれる。
　　　※但し、かゆい所には手が届かず、ロードモジュールがちと大きいという噂も。
　　「[MounRiver社](http://www.mounriver.com/)」を開き、Downloadをクリック。
　　MounRiver_Studio_Setup_V192.zipをダウンロード
　　　※当方の環境ではV210.zipでは、WCH-LinkEと繋がらなかった。
　
 ◇ダウンローダー
　　WCH-LinkUtility
　　「[ＷＣＨ社](https://www.wch-ic.com/products/WCH-Link.html)」より、WCH-LinkUtility.ZIPを落す。

# 環境構築
　◇WCH-LinkE
　　必要ならドライバーを入れる。必要ならデバイスマネージャーで確認する。
　　　※Interface-WCHLinkEと、WCH-Link SERIAL(COMx)が追加されている。
　　WCH-LinkUtility.ZIPを適当なディレクトリに解凍。WCH-LinkUtility.exeを起動。
　　画面のCore:をRISC-Vに、Series:をCH32X035/34/33に変更。
　　基板とWCH-LinkEを接続し、USBに刺す。
　　Active WCH-Link Mode : (画面下の方)をWCH-LinkRVに変更し、「Get」「Set」を順に押す。
　　Query Chip Info(画面上３個目のアイコン)を実行して、MCU ID等が読み込まれれば接続は正常。
　　動作確認出来れば後は放置、閉じておいても構わない。
　　　※MounRiverStudioからは自動操作される。
   
　◇MounRiverStudio
　　解凍してインストール。
　　適当なディレクトリにサンプルプロジェクトを格納しておき、xxxx.wvprojをダブルクリック。
　　MounRiverStudioが立ち上がる。
　　ビルド(画面の６番目)を実行。0 errorsが表示されれば成功。
　　ダウンロード(画面の９番目)を実行。Verify Successと出れば成功。
　　　※下記プロジェクトで有ればWCH-LinkEのシリアル出力にTINY BASICが表示される。
　　　※出なかった場合は、配線を見直すか、もっとまともなサンプルを使う事。

# サンプルソフト(CH32X035_bas)の説明

　「[ソフトの格納場所(Github)](https://github.com/hi631/CH32X035) 」のCH32X035_basディレクトリに有る。

　本ソフトはCH32X035の動作確認を目的としている。
　チップと基板の動作確認コマンドを、BASICコマンドとして発行する。
　動作確認の為にTINY BASICに下記を追加している。
　◇ＰＤ　「PD xx」で、指定電圧xxに充電器電圧が変更される。※電圧が不一致だった。
　　　　　　※xxは、「5, 9, 12, 15, 20」Vの何れか、充電器によつて出ない電圧も有る。
　　　　　　　リセット後に一旦、充電器との切断接続が必要。
![pd12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/72236081-5821-e645-57f8-be4a782df7c7.jpeg)

![pd_out15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/92c7fd1b-50db-0b00-c088-1454621b8793.jpeg)

　◇ＬＥＤ　「LED x」(xは1又は0)で、基板上のLEDが明滅。
　◇ＳＡＶＥ／ＬＯＡＤ(別途説明)
　◇ＭＯＮ(別途説明)

# ＳＡＶＥ／ＬＯＡＤ
　FLASHエリア(08000000-0800FFFF)にプログラムが使わない08008000以降に格納する。
　
　◇ＳＡＶＥ
　　「SAVE xx y」で書込む。xxは格納位置の指定。yは1で自動起動の指定。
　　yを1にしてSAVEした場合、LOAD時に自動起動する。
　　格納位置は08008000番地から1KB毎に割り振って居る。
　　　※BASIC入力可能エリアは約8KB有るので、フルサイズを格納した場合0-7が格納済みとなる。
　　　　プログラムの重ね書きに注意。
　　　※既にプログラムは32KBに近づいており、追加する場合は格納開始位置の変更が必要だろう。

　◇ＬＯＡＤ
　　「LOAD xx」で。xxは読出し位置の指定。
  
　◇自動起動
　　リセットスタート時に自動起動(0番目のプログラム)を毎回確認している。
　　「SAVE 0 1」で格納した場合、電源オンで格納プログラムが起動する。

# ＭＯＮ
　BASIC上で「MON」の入力でモニターが起動する。
　　※CH32X035のハードチェックの為なので、機能は一寸ショボい。
　◇ＤＵＭＰ
　　「Dxxxxxxxx」でxxxxxxxx番地からの128バイトを表示。
　　「Dxxxxxxxx yyyy」で、xxxxxxxx番地からのyyyyバイトを表示。
　◇メモリ操作
　　「Mxxxxxxxx」で、xxxxxxxx:yyと表示される。
　　　zzと追加入力すると書き込みを行い、次の番地へ移動。
  　　「.」で終了。
　◇メモリフィル
　　「Fxxxxxxxx yyyy zz」の入力で、xxxxxxxx番地からのyyyyバイトにzzが書き込まれる。

# ＢＡＳＩＣについて
　[豊四季タイニーBASIC](https://vintagechips.wordpress.com/2015/12/06/%E8%B1%8A%E5%9B%9B%E5%AD%A3%E3%82%BF%E3%82%A4%E3%83%8B%E3%83%BCbasic%E7%A2%BA%E5%AE%9A%E7%89%88/) のLinuxエディションを使用。
　　※お手軽で便利なソフト公開有難うございます。
　get,put,randを差し替えれば、汎用的に使える。
 　　※今回RANDは不動作。
　コマンド名、シンボルを設定し、caseを追加すれば機能拡張が可能。
　　※勿論、実行する処理本体が必要ですが。

# デバッグについて
　この程度のチップは専用のデバッグ装置など無く、printf攻撃に頼るのが通常だと思うが、
　由緒正しきEclipseの末裔(かな)なので、追加インストール無しでグラフィカルにＧＤＢが使える。
　一寸嬉しかったので、多少説明を加える。
　　※書いてる本人はGDBを真面に使った事無いので、間違った記述をしているかも。

　起動したら、止めたい行の左をダブルクリックで赤〇表示。
　　※デバック中に追加変更もご自由に。
  ![start.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/470f8ff7-010f-7f8b-d6bf-b2c91e0e7b2d.jpeg)

　次にデバッグ(虫のマーク)をクリック。
　多分、何かダイヤログが出るので、OKとかDebugとかを選択すれば、デバッグ画面に移行できる。
 ![debugstart.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/94fa9aac-fe76-0634-8895-5e7dab429de9.jpeg)

　run(７つ目の三角)を押せば、動作後設定した所で止まり、赤〇に黄色三角が表示される。
 ステップ実行(右左折の様なマーク)で一行毎の動作確認も可能。※アセンブラレベルも可能と思う。
![break.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/28acbdb4-8492-f524-3ebb-101c9e5b4996.jpeg)
 
　止まる事により、CPUがこの部分を走行する事が確認できる。
　画面上の変数に触れると、値が表示される。
 ![pin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/6b8b6f50-eeb6-1f10-dba8-aeec24df0e79.jpeg)

　　※但し、Break;にブレークを掛けたら、無視された。
　　　念のために止まるかどうかを、先に確認すべきだな。

　あまり使わなかったが、考え違い等でドツボに嵌まった時などは極めて有効なツール。
　ソフト開発の最終兵器として素晴らしい。
　GDBはArduinoでも利用可能だが、それ用のハードと別途設定が必要。敷居は高い。


# 感想
　CH32X035の単価は50円程度だろう。基板に実装しても250円前後。
　この程度の値段で、FLASH 62KB, RAM 20KBのチップが買え、GDBも使える。
 　(輸入の手間とかあるから、日本国内ではこの値段で買えないが)
　従来のチップでは勝負出来ないであろう。後はソフト勝負だが果たして勝負できるだろうか。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。