CH32V003でBASICを動かす。

# 経緯
　CH32V003と言う安価なチップに今頃気が付いた。
　ブームは一年以上前だったよう。お陰で資料は豊富だが。
　USB端子付きで100円以下なんて値札の所も存在する。
　　※配送料が加算されるので、その値段では入手できないが。
　　※USB端子を持って居ても、其の儘ではUSB通信は出来ない。
　◆◆◆　まあBASICでも動かして見るか　◆◆◆
　缶コーヒー一杯程度の値段で、マイコン開発環境を構築できるとは。
　世の中どうなってんの。

# チップが安価な理由(憶測)
　チップが安価に提供できる理由として、
　◇製造設備が安価
　　製造技術は20n-30n、枯れた技術で有り歩留まりは良いのだろう
　　製造設備も枯れた物が使用出来るのだろう
　◇RISC-V
　　従来はARM(要技術料)だったが、RISC-Vはパテントフリーで使用可
　◇周辺チップ
　　勿論周辺回路はチップ内だが、著名チップに構成が類似
　　CH32の内蔵IOはSTM社の物に類似して居ると言われている。
　　パテントを買い取ったのか真似っ子なのか、少なくとも何か関係は有りそう。

# チップの簡略素性
　◇プロセッサ:32ビットRISC(最大48MHz)
　◇クロック内蔵
　◇メモリ　　:16KBフラッシュ、2KBSRAM
　◇インターフェース:　USART　I2C　SPI
　　※USB機能は持って居ない。

# 開発環境(ハード)
　◇CH32V003の乗ったミニボード。
　　※チップ単体でも試験は可能。はんだ付けが必要だが。
　　※下記に当方が使った基板(CH32V003F4P6搭載)を示すが、推奨はしない。
　　　LEDは付いてるが、点滅させると書き込みが出来なくなる(解除可能)。
　　　USB端子とポートの接続が疑問。そのままは使えない。
　◇WCH-LinkE
　　※書き込み装置が必要、秋〇でも千円以内で入手可能。
　　※単線双方向通信となり、末尾に"E"が付くやつが必要。
![v003_link.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/231e28d7-0838-4bfd-b422-05009bd41db1.jpeg)

# 接続
　下記を、基板とWCH-LinkE間で接続。
  　※ＴＸ・ＲＸはプログラム内通信で使う。WCH-LinkEはUSBシリアルとして動作する。
　　　V003では入出力のピン配置を部分的に変更可能。とある目的でこの位置(PC0,PC1)に設定。
　　基板　　　WCH-LinkE
　　Ｖ　　　　３Ｖ３　　　電源
　　Ｇ　　　　ＧＮＤ　　　グランド
　　ＰＤ１　　ＳＷＤＩＯ　書き込み信号
　　ＰＣ０　　ＲＸ　　　　シリアル送信
　　ＰＣ１　　ＴＸ　　　　シリアル受信

# 開発環境(ソフト)
　開発環境としてはWindows環境で動作する、ArduinoやMounRiverStudioも存在するが、
　今回はLinux環境での開発とした。
　　※Arduino等では、基本ライブラリがFLASHの2/3近くを占め、拡張性が減る。
　　開発環境を整えるのが、多少手間かも知れないが。

　◇コンパイラ
　　例示のコンパイルには、LINUX環境が必要でありこの準備をする。
　　と言っても、当方はWindows環境なので「WSL」を使用。
　　　※WSL: Windows Subsystem for Linux　WindowsのサブシステムとしてLINUXが動作。
　　「[マイクロソフトのサイト](https://learn.microsoft.com/ja-jp/windows/wsl/install)」に詳しく書かれてている。
　　　※ディフォルトではubuntuがインストールされる。
　　　　当方の環境ではubuntuでは環境が構築できず、追加でDebianを導入した。
　　次はツールチェーンを導入するのでLINUXを起動し、コンソール画面で下記コマンドを入力。
　　　sudo apt-get install gcc-multilib gcc-riscv64-unknown-elf
　　下記コマンドで導入の確認が出来と思う。
　　　/usr/bin/riscv64-unknown-elf-gcc --version
　　下記の様な表示が出れば導入成功。
　　　riscv64-unknown-elf-gcc (12.2.0-14+11+b1) 12.2.0
　　　Copyright (C) 2022 Free Software Foundation, Inc.
　　　　※LINUXには詳しく無いので、同じやり方で上手く行くとも限らない。
　　　　　ダメな場合は、自分で探してバンバンしてくれ。
　◇ダウンローダー
　　WCH-LinkUtility
　　「[ＷＣＨ社](https://www.wch-ic.com/products/WCH-Link.html)」より、WCH-LinkUtility.ZIPを落す。

　　必要ならドライバーを入れ、デバイスマネージャーで確認する。
　　　※Interface-WCHLinkEと、WCH-Link SERIAL(COMx)が追加されている。
　　WCH-LinkUtility.ZIPを適当なディレクトリに解凍。WCH-LinkUtility.exeを起動。
　　画面のCore:をRISC-Vに、Series:をCH32V003に変更。
　　基板とWCH-LinkEを接続し、USBに刺す。
　　Active WCH-Link Mode : (画面下の方)をWCH-LinkRVに変更し、「Get」「Set」を順に押す。
　　Query Chip Info(画面上３個目のアイコン)を実行して、MCU ID等が読み込まれれば接続は正常。
　　次にWSLにWCH-LinkEを認識させる方法だが。
　　　Windows上でターミナル(又はCMD)を起動、usbipd list とコマンドを発行。
　　　"11-4   1a86:8010  WCH-LinkRV"などとリスト表示される。
　　　STATEが"Not shared"になっていたら、usbipd bind --busid 11-4 を発行。
　　　次に、usbipd attach --wsl --busid 11-4 を発行する。
　　　再度、usbipd list を発行し、STATEが"Shared"に変われば成功。
　　　※11-4はこの環境下のUSB接続番号、各自の環境で読み替え。
　　上記が終われば、make でコンパイルからフラッシュ迄一気通貫。
　　　※当方の環境では、sudo make が必要だった。
　　　※之は起動時に毎回接続が必要であり、HEXが出来たらWCHLinkEの釦を使って書込む方が早いかも。

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

　「[ソフトの格納場所(Github)](https://github.com/hi631/CH32V003/tree/master/basic) 」に有る。
　　※makefileに　"CH32V003FUN=../../ch32v003fun"　と指定されており、
　　　basic格納フォルダの二つ上に　「[CH32V003FUN](https://github.com/cnlohr/ch32fun)」 のダウンロードと格納が必要。

　本ソフトはCH32V003の動作確認を主な目的としている。
　動作確認の為にTINY BASICに下記コマンドを追加している。
　　※なおBASICの事例は既に存在するが、コンパイルすると容量超過で動けないよ。
![v003_bas.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159764/3cdfb059-ca9d-4a33-a706-7b8f6de4a62f.jpeg)
　◇OUT 39 1
　　ポート"39"(PC7)に"1"を出力。ボート及び出力指定に変数名も可。
　　　※ポートはPA/PB/PC/PDを各々16bitと想定して連番。PC7=16*2+7。
　◇IN 39 A
　　ポート"39"(PC7)の状態を変数"A"に取り込む。
　◇SAVE 0 1
　　現在のプログラムをFLASHの"0"番目に、"1"(自動runモード)で格納する。
　　save時に"1"を指定すると、リセット時に自動load/runする。
　　　※ブロックは64byteを1ブロックとして80003FC0を先頭に逆順に数えている。
　　　　プログラムの格納位置は4ブロック毎に数える。
　　　　格納位置が重複した場合、前のは上書きされる。
　◇load 0
　　FLASHの"0"番目からロードする。
　◇MON
　　DxxxxxxxxやMxxxxxxxxのコマンドが有り、メモリーの参照・変更が可能。

# 感想
　ショボい事例だが、Ｌチカの次のステップとでも思って頂ければ幸い。
　次のステップは、何か役に立つものだろうが敷居は高いな。
　毎回思う事だが、この程度のチップを何故日本で製造出来なかったのか。
　2nの最先端チップも必要、売り先の確保が必要だが。
　自動車を動かすチップを作るのに、TSMCの下請けをする事も必要だろう。
　でも、今ではオモチャの様なチップもオモチャの頭脳には必要だろうに。
　なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。