なんちゃら技術研究所

このブログはアフィリエイト広告を利用しています

今更のRX210ソフト開発


今更感はありますが、RX210マイコンのソフト開発をする機会がありましたのでメモ的な覚書にはなりますが、誰かの役に立つかもしれないので公開します。

 

ペリフェラルドライバ生成ツール

RX210はRXマイコンの中では古いため、スマートコンフィグレータではなく、PDG2を使ってドライバを生成します。

PDG2入手先 → Peripheral Driver Generator | Renesas

 ※My Renesasへの登録が必要です。

なお、RX210に関する不具合情報を確認すると、パッケージバリエーションに対応できないという致命的なものがありましたので、修正パッチをダウンロード。

しかしダウンロードしたzipファイルの中身を見ると、肝心の修正ファイルがありません!!

ルネサスに問い合わせると、直接、メールで送られてきました。

(問い合わせて数時間後の回答という素早い対応でした。ありがとうございます)

PDG2を使ってみる

ハードウェアマニュアルを読んで「どう使いたいのか」をある程度は理解しないと、設定でどれを選べばよいか迷いそう、という印象です。

まぁ、自分でソースをゴリゴリ書くことを考えると、十分に時短なんですが。。。

 

シリアル通信(送信)とDMAの連携に関する問題

今回、シリアル通信(UART)の速度を260400bpsとかなり高速にする必要があり、送受信ともにDMA転送を使うことにしました。

一般的にマイコンのUART送信の場合、

①送信データレジスタに送信1Byteを書き込む

②送信データレジスタからシフトレジスタへ転送される

③シフトレジスタから1bitずつ出力される

という動きになります。

②のタイミング(=送信データレジスタが空になる)で出されるTXI割込み要求と、

③ですべてのbitが出力されたタイミングで出されるTXE割込み要求の2つがあります。

DMAを使う場合、「TXI割込み要求でDMAを駆動し、次の送信byteを書き込む」のでDMA転送の終了≠送信の完了にはなりません。(最後に転送した1byteがまだ通信ラインに出力されていない)

このため、DMA転送の終了後、TXE割込み要求を待つ、というのが常套手段になります。

しかし、PDG2のリファレンスマニュアルにある通り、SCIで「DMAを使用する」設定にすると割込みコールバックが使用できない、という問題に直面しました。

PDG2のSCI設定(DMA有)

問題解決のアプローチ

PDG2の設定画面では、SCIのところで「DMAを使用」と選択肢が出てきますが、SCIのレジスタ設定にはDMAに関する項目はありません。

ということは、SCIのほうでは「DMAを使用」にしなくても特に影響は出ないのではないか?と考えて、「送信完了を関数呼び出しで通知」としてみました。

PDG2のSCI設定(DMA無)

もちろん、DMAのほうはSCIの送信で駆動する設定にします。

PDG2のDMA設定(SCI送信で駆動)

この設定で、動作させてもDMAで送信データを転送してくれましたが、肝心の「送信完了割込み」のコールバック関数は呼び出されないという状況に。

試行錯誤の時間

こういう時はほとんどの場合、割込み許可になっていないんだよなー、とか思いながらCS+のデバッグ画面でレジスタを確認すると、BINGOです。

ところが、送信開始前に明示的に許可をしてみても、状況は変わらず、いつの間にか許可したはずの割込みが禁止状態に。。。

そこで、ステップ実行をしながら、割込み許可フラグをモニタリングすると、送信開始のAPI実行直後に禁止されていました。

このAPIはライブラリ化されている関数を呼び出しているだけなので、これ以上の深追いは無駄(修正できない)と考え、推論を立ててみます。

推定したAPIの動作

本来の使用方法は、第1引数に「送信対象のbyte列を格納した配列のポインタ」、第2引数に「送信byte数」を設定して呼び出します。

APIを呼び出した後は送信完了割込みまで、ユーザ側でやることはありません。

ライブラリの中で、TXI割込みを使って1byteずつレジスタへ書込みを行い、最終byteの書込み時にTXE割込みを許可している、と考えると、合点がいきます。

最終的な問題解決の答え

DMA転送完了割込み(コールバック)で、TXE割込みを許可することで、無事にSCIの送信完了割込み(コールバック)が呼ばれるようになりました。

ちなみにソース(ブログ用に書いたものです)はこんな感じです。(SCIの初期設定は割愛)

送信開始時の処理例

DMA割込み関数例

SCI送信完了割込み例

なお、PDG2では通信動作停止のAPIとしてR_PG_SCI_StopCommunication_C0()が生成されますが、送信・受信ともに止めてしまい使い勝手が悪いので、送信だけを止める/受信だけを止めるようなAPI(以下、参照)を作成して使っています。

自作API(送信停止/受信停止)

今回はDMAC0、SCI0を使用しています。他のチャネルを使用する場合は、適切に記述を合わせてくださいね。