経緯
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"が付くやつが必要。
接続
下記を、基板とWCH-LinkE間で接続。
※TX・RXはプログラム内通信で使う。WCH-LinkEはUSBシリアルとして動作する。
V003では入出力のピン配置を部分的に変更可能。とある目的でこの位置(PC0,PC1)に設定。
基板 WCH-LinkE
V 3V3 電源
G GND グランド
PD1 SWDIO 書き込み信号
PC0 RX シリアル送信
PC1 TX シリアル受信
開発環境(ソフト)
開発環境としてはWindows環境で動作する、ArduinoやMounRiverStudioも存在するが、
今回はLinux環境での開発とした。
※Arduino等では、基本ライブラリがFLASHの2/3近くを占め、拡張性が減る。
開発環境を整えるのが、多少手間かも知れないが。
◇コンパイラ
例示のコンパイルには、LINUX環境が必要でありこの準備をする。
と言っても、当方はWindows環境なので「WSL」を使用。
※WSL: Windows Subsystem for Linux WindowsのサブシステムとしてLINUXが動作。
「マイクロソフトのサイト」に詳しく書かれてている。
※ディフォルトでは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
「WCH社」より、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(画面上3個目のアイコン)を実行して、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) 」に有る。
※makefileに "CH32V003FUN=../../ch32v003fun" と指定されており、
basic格納フォルダの二つ上に 「CH32V003FUN」 のダウンロードと格納が必要。
本ソフトはCH32V003の動作確認を主な目的としている。
動作確認の為にTINY BASICに下記コマンドを追加している。
※なおBASICの事例は既に存在するが、コンパイルすると容量超過で動けないよ。
◇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のコマンドが有り、メモリーの参照・変更が可能。
感想
ショボい事例だが、Lチカの次のステップとでも思って頂ければ幸い。
次のステップは、何か役に立つものだろうが敷居は高いな。
毎回思う事だが、この程度のチップを何故日本で製造出来なかったのか。
2nの最先端チップも必要、売り先の確保が必要だが。
自動車を動かすチップを作るのに、TSMCの下請けをする事も必要だろう。
でも、今ではオモチャの様なチップもオモチャの頭脳には必要だろうに。
なお、上記記載内容は全て無保証であり、各自の責任においてご利用願います。