別シリーズ記事にて、大変お求めやすい価格の32ビットRISC-VマイコンCH32Vの吉例Lチカ成功(先達の方のお陰です。)それに気をよくしてCH32Vの各種機能を使ってみることにいたしました。Lチカの次はHelloWorldだな、と勝手に目標設定。HelloWorldしてみましたが、8ピンマイコンです。これが結構難物。
8ピンマイコンCH32V003J4M6
WCHブランド(沁恒)のCH32V003の製品ページが以下に。
32-bit general-purpose RISC-V MCU-CH32V003
CH32V003は沁恒の複数あるRISC-Vコア搭載のマイコンシリーズの中でも、一番ローエンドのシリーズみたいです。今回、仕入れてみたのはその中でも最もお求めやすい一品、以下の型番の品です。
CH32V003J4M6
ぶちゃけ、ピンピッチが1.27mmのSOP8なので、手先が不器用な上に老眼のこの年寄でもはんだ付けがなんとかなる、という一択デス。やっぱり0.6mmピンピッチ品は手半田つらいっす。
非同期シリアル接続、出来るけれども
本来、CH32V003シリーズは、Eclipseベースの”MounRiver”というIDEで開発するのが公式みたいです。しかし、先達の方々のお陰もあってArduino IDEでも可能。当面、Arduino IDEで頑張りたいと思います。
先行記事にてLチカできたので、そのコードをちょい直し。SerialポートへHelloWorldするコードに改変してみました。コイツは書き込みしない方が良いコードっす。御注意を。
かなり引っかかったのが、CH32V003J4M6のピンアサインです。書き込みはWCH-LinkEエミュレータというUSBドングルから1線式のインタフェース(SWIO)で行えるのですが、その1線とデフォルトのSerialポートのTXがバッティングしておるのです。なにか良い切替方法がないかしらんと思いつつ、「見る前に飛べ」とばかりに上記コードを書き込みんでしまいました。
WCH-LinkEエミュレータにはUSBシリアル機能もあり、TX、RX端子も備わってます。とりあえずSWIO端子を取り除き、WCH-LinkEエミュレータのRX端子をCH32V003J4M6のピン8に接続しました。
HelloWorldしてますぞ
普通にArduino伝統の Serial オブジェクトを使えばUART出力が可能なようです。よかった。しかし、その後があきまへん。
ちょっとプログラムを変更し再書き込みしようとしたところこんなエラーがでました。Link Utilityもチップを認識できなくなりました。
ちょっと見ずらいですが、上のエラーメッセージにそって調査してみました。
-
- CH32V003J4M6チップ(8ピン)には SWCLKの接続先は無い。よって2線式のデバッグIFは使用できない(と思われる。)なお、よりピン数の多い他のパッケージではSWCLKの端子は設定されている。
- 8ピンパッケージのPin8に影響を与えないUSART(UARTとして使用)のポートアサインは無い。4種類の端子組が切替られるようになっているが、なんらかの機能がピン8にアサインされているか、TXに設定可能な端子がそもそも8ピンの中に無い。
SWIOを使わずUARTからFlash書き込みするようなブートローダーもあるようなのです。そういうブートローダへの切り替え処置をした後ならともかく、デフォのSerialポート使ってしまうとSWIOからの書き込み不能(いまのところ。)というわけで「Lチカ+HelloWorld専用チップ」が1個出来上がってしまいました。お求めやすい価格なので幸い何個も仕入れてあり。
それではということでI2CでHelloWorld
それではということでI2Cバスの利用を試みました。毎度I2Cのテストに酷使しております秋月電子通商製のAQM1602のDIP化ボード利用です。接続回路図が以下に。
Arduino環境なので、秋月電子通商殿のリファレンスソースそのままで動作する筈ですが、今回テキトーに変更かけているので、以下にソースを(オリジナルは秋月電子通商殿っす。)
#include <Wire.h> #define LCD_ADRS 0x3E char hello[] = "HELLO WORLD."; void writeData(byte data) { Wire.beginTransmission(LCD_ADRS); Wire.write(0x40); Wire.write(data); Wire.endTransmission(); delay(1); } void writeCommand(byte cmd) { Wire.beginTransmission(LCD_ADRS); Wire.write(0x00); Wire.write(cmd); Wire.endTransmission(); delay(10); } void init_LCD() { delay(100); writeCommand(0x38); delay(20); writeCommand(0x39); delay(20); writeCommand(0x14); delay(20); writeCommand(0x73); delay(20); writeCommand(0x56); delay(20); writeCommand(0x6C); delay(20); writeCommand(0x38); delay(20); writeCommand(0x01); delay(20); writeCommand(0x0C); delay(20); } void setup() { pinMode(PD6, OUTPUT); Wire.begin(); init_LCD(); int nLen = strlen(hello); for(int i=0; i<nLen; i++) { writeData(hello[i]); } } void loop() { digitalWrite(PD6, HIGH); delay(1000); digitalWrite(PD6, LOW); delay(1000); }
Lチカ+LCDにHelloWorldしておりますで。