RXマイコン用、C++デバイス制御クラスを実装していて、色々と少しづつアップデートしている。
今日の標語:
「C++」を使わない理由が無い!
RX621に内臓されているハードウェアーリソースは豊富なので、まだ、全ては実装出来ていないけど、とりあえず、必要そうな定義は実装してみた。
※十分なテストとかしていないので、バグがあるかもしれないけど・・・
※一番ありがちなのは、アドレス定義ミス。
各ソースコードと機能の対応:
※ルネサスの「RX62Nグループ、RX621グループユーザーズマニュアル ハードウェア編」を元にしている。
rx62x_system.hpp システム制御関係の定義(リセット、電圧検出回路、クロック発生、消費電力削減) rx62x_icu.hpp ICU(割り込みコントローラー)の定義 rx62x_port.hpp I/Oポートの定義 rx62x_dmaca.hpp DMACA(DMAコントローラー)の定義 rx62x_exdmac.hpp EXDMAC(EXDMAコントローラー)の定義 rx62x_dtc.hpp DTC(データトランスファーコントローラー)の定義 rx62x_crc.hpp CRC の定義 rx62x_mtu.hpp マルチファンクションタイマユニットの定義 rx62x_i2c.hpp I2C(RIIC) バスインターフェースの定義 rx62x_i2c_io.hpp I2C の制御 rx62x_i2c_io.cpp rx62x_rspi.hpp RSPI の定義 rx62x_rspi_io.hpp RSPI の制御 rx62x_rspi_io.cpp rx62x_cmt.hpp CMT(コンペアマッチタイマー)の定義 rx62x_cmt_io.hpp CMT の制御 rx62x_cmt_io.cpp rx62x_sci.hpp SCI(シリアルインターフェース)の定義 rx62x_sci_io.hpp SCI の制御 rx62x_sci_io.cpp rx62x_rtc.hpp RTC の定義 rx62x_rtc_io.hpp RTC の制御 rx62x_s12ad.hpp S12AD(12ビットA/Dコンバーター)の定義 rx62x_ad.hpp AD(10ビットA/Dコンバーター)の定義 rx62x_da.hpp DA(10ビットD/Aコンバーター)の定義
☆テンプレート化してあるので、複数チャネルがあるデバイスは全て同じように扱える。
☆デバイスのテンプレートは、多少工夫してあるので、判りやすく、間違えば大抵エラーとなる。
DMACA、4チャネル
EXDMACA、2チャンネル
I2C、2チャンネル
RSPI、2チャンネル
CMT、4チャネル
SCI、6チャネル、※何故か4チャンネルは無く(0、1、2、3、5、6)
※SCIは、シリアル入力(RxD)に対応するポートを入力に指定する必要がある。
ルネサスがサンプルなどで提供しているデバイスの定義ファイルを捨てて、とりあえず、現状、定義してあるデバイスヘッダーでコンパイル出来るように変更した。
この修正で、必要な部分は、全て C++ で実装されているので、それを使う事が出来る。
fatfs は、RXマイコン依存の部分を新しいデバイステンプレートを使って、C++でコンパイル出来るように修正した。
※基本的に、えるむさんのコードはそのままになっている。
※サンプルにあったRXマイコン用のコードは、C++デバイス定義用「mmc_rspi.hpp、mmc_rspi.cpp」に修正されている。
プログラムの動作について:
・RxD0、TxD0 にターミナルを接続すると、簡単なシェルが起動する。(115200、8ビット、1ストップビット)
・RTC は外部の I2C に DS1371 を接続する。(ds1371_io.cpp でどのポートを使っているか判る)
※RX621 内臓の RTC は、バッテリーバックアップ出来ないので仕方なく接続・・・
※RX621 内臓の RTC を使う事も出来る、コードは一応用意した。(rx62x_rtc_io.hpp)
※「sd_monitor.cpp」で、どちらを使うか選択出来る。
・VS1063a の接続する場合、ソースコードを確認の事。
・「syscalls.c」で、POSIX のファイル操作(SDメモリーに対して行う)を実装してあり、fopen 系、printf など普通に使う事が出来る。
・「init.c」で静的に宣言しているクラスなどのコンストラクターが呼ばれる。
・「stdc++」ライブラリーをリンクしているので、STL も使える。
・コマンドは、以下
% ls SD カードのディレクトリーを表示 % cd xxx カレントディレクトリーを移動 % date 日付、時間を表示、設定も可能 % play xxx オーディオファイルを再生(現在はポーリングとなっている) % volume ボリュームの呼び出しと設定
このフレームワーク?では、C++ で普通にプログラム可能なのだが、iostream は使わない事、メモリを非常に食うので、フラッシュに入らないと思う。
※ C++ だけど、とりあえず、printf を使って欲しい。
※当然ながら、iostream と関連性が強く、インクルードしてあるソースも避ける事。
STL は普通に使えるし、boost も全てでは無いけど使える~(iostream に関連する制限がある点に注意)
リンクに、変な警告が出ているけど、とりあえず無視するしかないが、問題は無さそう~
※このエラーが何故出るのか不明・・・、出ないようにする方法が不明なので、そのままになってる。
------
I2C や RSPI のデータ転送を DMA ベースにしたいとか、色々やる事があるけど、その前にお約束の LCD を繋ぎたい~
※バグを発見したり、質問があれば書きこんで~