ch55xduinoの特徴


先日からCH552Tをいじり始めたが,開発環境としては,ch552xduinoが良いように思えたので,使ってみた. 多少はその特徴が分かってきたので,メモを残しておく.

まず,Arduino IDEを立ち上げて,File - Preferencesとして,Additional Boards Manager URLsのところに,以下のどちらかのURLを追加する.

https://raw.githubusercontent.com/DeqingSun/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json
https://raw.githubusercontent.com/WeActTC/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json

私は開発者のものである前者を選んだ. そして,Tools - Board:… - Boards Managerから,ch552で検索して,CH55xDuino MCS51 plain C core (non-C++)をインストールする. Linuxの場合には,権限の問題をクリアするために,以下のコマンドを実行する.

sudo cp ~/.arduino15/packages/CH55xDuino/tools/MCS51Tools/20??.??.??/linux/99-ch55xbl.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

これでインストールは完了である.

Arduinoでは,Tools - Board - CH55x Boards - CH552 Boardとして,その下のClock Sourceは24MHz (internal) 5Vを選ぶ. プログラムを作ったら,DFUモードにして書き込む. 具体的には,P3.6を3.3Vにpull upした状態で,USBコネクタを接続して,すぐに書き込む. 開発ボードには,それ用のボタンがあるので,ボタンを押したままUSBコネクタを接続すれば良い. USB Settingsがdefault CDCの場合には,二回目の書き込みからは,そのままで書き込める.

通常のArduinoはC++だが,ch55xduinoはC言語である. これは,このCPUのフリーのC++コンパイラが無いかららしい. そのためもあり,多少書き方に特徴がある. 他のサイトにも書いてあることだが,ピンは二桁の数字で指定する. ピンのmodeは,INPUT,OUTPUT,INPUT_PULLUPに加えてOUTPUT_ODがある. 最後のはopen drain出力である. USBSerial.printなどの代わりにUSBSerial_printなどを使う. それから文字列については以下の次の段落にあるように注意が必要である. これらの違いを意識するだけで,それなりのプログラムは書けると思う.

文字列は少し癖がある. そのため,文字列をポインタを使って指定して表示しようとしたら,最初はerrorが出てうまく行かなかった. ch55xduinoの表示ルーチンでは,genericという機能を使って,表示したいものの型を判定して,呼び出す関数を切り替えて,適切に表示されるようにしている. そのソースを見てみると,文字列には,__code char *c,__data char *c,__xdata char *cの三つの種類があり,errorはそれがきちんと指定されていないから起こっていることが分かった. ch552には,256byteの内部RAMと1024byteの外部RAMがあり,前者は__data,後者は__xdataというように指定する. ちなみに,内部RAMのほとんどは別の用途に使うので,通常の変数は外部RAMに置かれるが,速い応答が必要な変数は,__dataで指定することによって,内部RAMに置くこともできる. 一方,プログラム本体はプログラムROMというflashにある. その部分に書かれた文字列が,__codeという指定をするのだろう. 文字列はそれがどのメモリにあるかを適切に指定しなけらばならない. 私の今回の場合はポインタの指定に__codeを加えることによって,うまく動くようになった. 普段は,charの配列に__xdataをつけて__xdata charとしておけば,問題無いことが多い.