RXduinoライブラリをお買い上げいただいたお客様から、カスタムボードでCubeSuite+を使ってRXduinoを使いたいというご要望をいただきました。
そこで、自分でもCubeSuite+をインストールして、カスタムボードに移植する方法を確かめてみました。
CubeSuite+のダウンロード
まず、CubeSuite+をダウンロードしてくるのですが、昨年から名前が変わっていて「統合環境CS+」となっていました。
CS+の評価版を入手するには、http://japan.renesas.com/products/tools/ide/csp/index.jsp から「無償評価版を入手」のボタンを押して入ります。そして、一番上にある 【無償評価版】 統合開発環境 CS+ for CC V3.00.00 (一括ダウンロード版) のリンクをクリックします。あとは300MBくらいをじっとダウンロードします。
RXduino V1.20をダウンロード
特電のダウンロードページから、RXduino V1.20のソースコード一式をダウンロードします。V1.20は、V1.08の正式な後継バージョンなので、ライブラリの動作も旧V1.08版と互換性があり、安定しています。
上のZIPファイルをダウンロードしたら解凍します。デスクトップにrxduino-src-v120cshewというディレクトリが出来上がったはずです。
ライブラリプロジェクトの作成
ここではRX63N/RX631用のカスタムボードを起こしたと仮定して、RX63N用の新しいライブラリを作る方法を紹介します。
まず、解凍したフォルダのrxduino-src-v120cshew\cslibを見ます。
中に"RXduinoライブラリ構築(GR).mtpj" というファイルがあるので、これを開きます。このプロジェクトがひな形となります。
mtpjファイルを開くと細かいサブプロジェクトがいっぱい出てくるので、CPUの型番をクリックして、「マイクロコントローラを変更」をします。そして、実際に使うCPUの型番に変更します。
ここでは特電のAD360というボードに変更しようと思うので、R5F563NBDxFB(144pin)を選びます。
全部のプロジェクトのCPUを目的のものに変更します。
そうしたら次は、すべてのプロジェクトのCC-RXをクリックして選択し、プロパティを開きます。
そして、共通オプションの中のマクロ定義を開くと、
TARGET_BOARD=BOARD_GRSAKURA
と書いてある部分があるので、これを自分のボード名に変えます。
AD360というボードなので、
TARGET_BOARD=BOARD_AD360
にしましょう。
そして、名前を付けてプロジェクトを保存します。 ここでは、"RXduinoライブラリ構築(AD360).mtpj" にします。
ボード定義ファイルを作る
rxduino-src-v120cshew/core/tkdnhal/
にbrd_ad360.hというファイルを作ります。内容は、brd_grsakura.hをそのままコピーしてきて、下記の部分を書き換えるといいでしょう。
/**************************************************************************//**
* @file brd_ad360.h
* @brief Precision 18bit 20ch A/D data logger
* @version V1.00
* @date 9. Feb 2015.
* @author Tokushu Denshi Kairo Inc.
* @note Copyright © 2011-2015 Tokushu Denshi Kairo Inc. All rights reserved.
* @details これはボード固有のカスタマイズを行うためのヘッダファイルです
******************************************************************************/
#define CPU_IS_RX63N //!< @brief CPUがRX63Nである
#define ROMSIZE (1024*1024) //!< @brief ROMの容量(1MB)
#define RAMSIZE (128*1024) //!< @brief RAMの容量(128kB)
#define DEFAULT_SERIAL SCI_USB0 //!< @brief Serial.beginで使うデフォルトのシリアルポート
#define USBVCOM_VID 0x2129 //!< @brief USB仮想COMポートのベンダID
#define USBVCOM_PID 0x050f //!< @brief USB仮想COMポートのデバイスID
#define USB_STRING_DESCRIPTOR_DATA \
'R', 0x00, 'X', 0x00, 'd', 0x00, 'u', 0x00, \
'i', 0x00, 'n', 0x00, 'o', 0x00, ' ', 0x00, \
'U', 0x00, 'S', 0x00, 'B', 0x00, ' ', 0x00, \
'V', 0x00, 'C', 0x00, 'O', 0x00, 'M', 0x00, \
' ', 0x00, 'p', 0x00, 'o', 0x00, 'r', 0x00, \
't', 0x00,
#include "tkdn_hal.h"
// ボードに応じた定数の設定
#ifndef TARGET_BOARD
#define TARGET_BOARD BOARD_AD360
#endif
#define CPU_TYPE RX63N //!< @brief CPUの種類
#define BOARD_NAME "AD360" //!< @brief ボードの名前
① USBのベンダID,プロダクトIDを2129:050fにすると、RXduino汎用仮想COMポートとなります。
② USB_STRING_DESCRIPTOR_DATAは、USBを最初にパソコンに挿したときに表示される名前です。
③ #define TARGET_BOARD BOARD_AD360
というのは、先ほどCS+のGUIでマクロ設定した名前に合わせます。
④ BOARD_NAMEは、プロンプトや各種メッセージで使われるボード名です。
これら4か所を変更すれば、とりあえず動きます。
ボード番号の割り当て
core/tkdnhal/tkdn_hal.h に、
・・・
#define BOARD_RAXINOI 0x56310541 //!< @brief ボードIDの定義。RaXino-i
#define BOARD_NP1055 0x56310551 //!< @brief ボードIDの定義。 future project
#define BOARD_YRDKRX63N 0x56380008 //!< @brief ボードIDの定義。YRDKRX63N
#define BOARD_AKIRX62 0x5621000a //!< @brief ボードIDの定義。AKI-RX62
#define BOARD_BBRX62 0x5628000b //!< @brief ボードIDの定義。BlueBoard RX62N
という場所があるので、
#define BOARD_AD360 0x56310711 //!< @brief ボードIDの定義。AD360 DataLogger
を追加します。この番号は、他のボードと重ならないようにします。
tkdnhalのboarddef.hを作る
この作業はGCC用なので、本来はいらないのですが、念のためやっておきます。
まず、 core/tkdnhal/boarddef.hを開きます。
#include "tkdn_hal.h"
#if (TARGET_BOARD == BOARD_YRDKRX62N)
#include "brd_yrdkrx62n.h"
#endif
#if (TARGET_BOARD == BOARD_YRDKRX63N)
#include "brd_yrdkrx63n.h"
#endif
#if (TARGET_BOARD == BOARD_RAXINO)
#include "brd_raxino.h"
#endif
#if (TARGET_BOARD == BOARD_GRSAKURA)
・・・
・・・
・・・
#endif
#if (TARGET_BOARD == BOARD_AKIRX62)
#include "brd_akirx62.h"
#endif
#if (TARGET_BOARD == BOARD_BBRX62N)
#include "brd_bbrx62n.h"
#endif
#if (TARGET_BOARD == BOARD_RXMEGA)
#include "brd_rxmega.h"
#endif
という箇所があるので、最後に
#if (TARGET_BOARD == BOARD_AD360)
#include "brd_ad360.h"
#endif
という行を追加します。BOARD_AD360と、インクルードするファイルは上で作ったファイルにします。
ヘッダファイルのコピー
とてもややこしいのですが、以下のようにしてください。
- /core/tkdn_hal.hを/include/tkdnhal/tkdn_hal.hにコピー
- /core/board_ad360.hを/include/tkdnhal/board_ad360.hにコピー
- /core/board_ad360.hを/include/tkdnhal/boarddef.hにコピー
/include/tkdnhal/boarddef.hは、/include/tkdnhal/board_ad360.hと同じ内容になります。
ソースコードの一部書き換え
とてもややこしいのですが、
- core/tkdnhal/tkdn_ether.c
- core/tkdnhal/tkdn_spi.c
- lib/fatfs/mmc_rspi.c
- lib/sdmmc/mmc_rspi.c
の一部を書き換える必要があります。
上記のファイルには、
#if (TARGET_BOARD == BOARD_GRSAKURA) || (TARGET_BOARD == BOARD_RAXINOI) || (TARGET_BOARD == BOARD_NP1055)
のようなマクロ定義がたくさんあります。
これらのマクロ定義に、
|| (TARGET_BOARD == BOARD_AD360)
を付け加えないと、コンパイルが通らないことがあります。ペリフェラルの使用状況に合わせて書き換えてください。
なお、この手順は面倒なので次のRXduino 1.50では改善します。
リビルド
CS+で、クリーン・プロジェクトをやってから、リビルド・プロジェクトを行います。1分くらいでリビルドできるはずです。
書き込み
これで、rxduino-src-v120cshew\cslib\RXduinoライブラリ構築(AD360)_12\DefaultBuildディレクトリに、userapp.motが出来上がっているので、書き込みます。
書き込みにはE1エミュレータが便利です。
これでCS+でRXduinoが動くようになるので、いままでの100倍くらいデバッグが楽になると思います。
CS+を使うということは、コンパイラにGCCではなくCC-RXを使うことになるので、いくつかのプログラミング上の変更点が出てきてしまいます。移植の際には気を付けてください。
① printfをUSB仮想COMポートに出力するには
main()が始まったら、すぐに
setbuf(stdout, NULL);
setvbuf(stdout, (char *)NULL, _IONBF, 0);
を行ってください。そうしないと、Serial.printとprintfの表示タイミングがずれてしまいます。
② 変数の宣言はスコープの最初に書かなければならない
CC-RXでは、int x;みたいな宣言はスコープ({}で囲まれた範囲)の先頭になければなりません。C99オプションを付けても結果は同じで、好きな場所には書けません。
③ 配列の要素数は定数にしなければならない
CC-RXでは、
const int MAX=100;
int array[MAX];
のような書き方ができません。#define文で書いてください。
④ 長さゼロの配列が作れない
CC-RXでは、
int array[0];
のような長さゼロの配列が作れません。これが原因で、tkdnip.cをCC-RXに移植できないでいます。C99オプションを付けてもダメです。何のためのC99オプションかもはやわかりません。
だいたい以上のことに気を付ければ、RXduinoのプログラムをCubeSuite+で実行できるようになります。
最近のコメント