RX65シリーズのデュアルバンク機能を使い、プログラムの遠隔書き換えをしたいですが
バンク切り替えがうまくっておりません。
プログラム上で下記①と②を動作させたいです。
①新しいプログラムデータを受け取りながら、現在起動バンクでない領域に書き込む
②起動バンクを切り替えて再起動
開発環境がCS+にCC-RX、マイコンはRX651(フラッシュ2M)を利用しています。
②について下記のコードを書いています。
//起動バンクを逆転する OFSM.BANKSEL.BIT.BANKSWP = !(OFSM.BANKSEL.BIT.BANKSWP & 0x7); //WDTから再起動する while(1){}
起動バンク選択レジスタBANKSWPについて、ハードウェアマニュアルには読み取り専用とありますが
フラッシュマニュアルにはいったんこれを読んで、反転書き込みとあります。
なのでそのようにコードを書いたつもりですが、このコードではBANKSWPが変更されていないようです。
FACIコマンドではハードウェア操作が必要なので遠隔アップデートには使えません。
このレジスタを書き換える方法やもっと読んでおくべきマニュアルがあれば教えていただけないでしょうか、
よろしくお願いいたします。
※追記
エミュレータはE1と少々古いものを利用しています。
エミュレータからの書き込み時に下記エラーを吐くので、何か関係があるかもしれません。
ダウンロードが完了しましたが、以下の問題がある可能性があります。
[警告の直接原因]
Warning: MDEレジスタのBANKMDビットへのライトデータをデバッガ起動時に指定された内容に変更しました。
(W1811343)
shinさん、こんにちは。NoMaYです。> 起動バンク選択レジスタBANKSWPについて、ハードウェアマニュアルには読み取り専用とありますが> フラッシュマニュアルにはいったんこれを読んで、反転書き込みとあります。ハードウェアマニュアルの以下の記載が、実は微妙、だと思います。どういうことかというと、OFSMは、メモリなの?レジスタなの?どっちなの??ということです。結論は、取り扱い上は内蔵フラッシュメモリ、と捉える方が現実的と思います。「7. オプション設定メモリ(OFSM)7.1 概要オプション設定メモリ(OFSM) は、以下に示すレジスタの総称です。 ← この文面がとっても奇奇怪怪なのです。」内蔵フラッシュメモリですので、そもそも以下のような通常の内蔵周辺レジスタのような書き換えは出来ない、です。OFSM.BANKSEL.BIT.BANKSWP = !(OFSM.BANKSEL.BIT.BANKSWP & 0x7);そして、内蔵フラッシュメモリとして、FACIコマンドで内蔵フラッシュメモリを書き換えないといけないです。多くの人は自前でFACIコマンドで書き換えるよりもFITのR_FLASH_RXモジュールのAPIで書き換えます。(そうではないかなぁ、と私は思っているですけれども。) さらに言うと、書き換える、という操作をするというよりも、起動バンク切り替えAPIを呼ぶ、という操作をする、という感じになります。逆に、こちらからお尋ねしたいことがあるのですけれども、以下の、使えない、というのはどういうことでしょうか?> FACIコマンドではハードウェア操作が必要なので遠隔アップデートには使えません。
NoMaYさま、こんにちは。
コメントいただきありがとうございます。
OFSMの記述については私もこの表現で混乱した所があったかもしれません。
「OFSMはオプション設定メモリの状態を反映するレジスタです」
このくらいで解釈しておくことにします。
なので、ここに書き込んで設定というのは現実的でないですね!理解いたしました。
>逆に、こちらからお尋ねしたいことがあるのですけれども、以下の、使えない、というのはどういうことでしょうか?>> FACIコマンドではハードウェア操作が必要なので遠隔アップデートには使えません。
FACIコマンドをプログラム内で書いたが思ったように動作せず、
下記のトピックを見て#pragma指令で動作させるものと思ったからです。
https://community-ja.renesas.com/cafe_rene/forums-groups/beginners/f/002-2095199602/6003/rx65n-p-e
「FACIコマンドではハードウェア操作が必要なので」と書いてしまいましたが
私の理解が追い付いていないだけで、おそらくプログラムから操作できるのだろうと今は思っています。
FACIコマンドを使おうとして下記のように書いていました。
FLASH.**への操作でFACIコマンドが扱えると思っていますがこの理解でいいのでしょうか?
FITモジュールは現在入っておらず、導入方法を探っています。こちらも同時に試すつもりです。
//デュアルバンクの切り替えをして再起動する RX65グループフラッシュメモリユーザーズマニュアルpp54~55等を参考void swapDualBank(void){ initFACICommand();//FACIコマンドのモードを変更
sendFACICommand_c(0xE8);//フラッシュデータ領域編集開始 sendFACICommand_c(0x02);//2回データを送る宣言 sendFACICommand_s(0x0000);//データ1回目 sendFACICommand_s(0x0000);//データ2回目 sendFACICommand_c(0xD0);//送信終了 //
while(1){} //WDTから再起動する}
//FACIコマンドのモードを変更void initFACICommand(void){ volatile unsigned char *addr_faci = (unsigned char*)0x007E0000;//FACIコマンド発行領域定義
//書き込みロック解除 FLASH.FWEPROR.BIT.FLWE = 1;
//バンク選択レジスタ用の値を代入 FLASH.FSADDR.BIT.FSADDR = 0x00FF5D20;
//フラッシュ上のデータフラッシュメモリ書き込みを有効化 FLASH.FENTRYR.WORD = 0xAA80; while(FLASH.FENTRYR.WORD!=0x80){}//反映されるまで待ち、できなければWDTで再起動
//周辺クロック通知 FLASH.FPCKAR.BIT.KEY = (uint16_t)0x1E; FLASH.FPCKAR.BIT.PCKA = (uint16_t)0x3C;//FCLK : 60
//コマンドロック状態の場合解除する while(FLASH.FASTAT.BIT.CMDLK==1U){ if(FLASH.FASTAT.BIT.CFAE==1 || FLASH.FASTAT.BIT.DFAE==1){ FLASH.FASTAT.BIT.CFAE = 0; FLASH.FASTAT.BIT.DFAE = 0; }}
void sendFACICommand_c(unsigned char dataToSet){ volatile unsigned char *addr_faci = (unsigned char*)0x007E0000; *addr_faci = dataToSet; while(FLASH.FSTATR.BIT.SUSRDY==1){}}
void sendFACICommand_s(unsigned short dataToSet){ volatile unsigned short *addr_faci = (unsigned char*)0x007E0000; *addr_faci = dataToSet; while(FLASH.FSTATR.BIT.SUSRDY==1){}}
shinさん、こんにちは。NoMaYです。> FLASH.**への操作でFACIコマンドが扱えると思っていますがこの理解でいいのでしょうか?すみません、操作の詳細までは自分では追えませんが、 FLASH.**レジスタの操作でFACIコマンドが扱える、 FLASH.**レジスタの操作で内蔵フラッシュメモリ(オプション設定メモリやデータフラッシュも含む)を書き換えることが出来る、筈だと自分も考えています。(ごめんなさ、自分はもうFIT/CGというかRXスマートコンフィグレータありきになっているので、内蔵周辺I/Oレジスタ操作の詳細を追いかけるのはしんどくて、、、というか、もともとその辺は不得手で、、、)
NoMaYさま、コメントいただきありがとうございます。
すみません、コードまで追って欲しいような書き方をしてしまい..
このあたりはドキュメントが少ないと思ってたのですが、おっしゃるように
FIT/CGのAPIを活用するのが一般的なのだと思います。まずは環境整備してみます。
レジスタの勘違い原因が分かったのと、揃えるべき環境がおおまかに分かったので
大変助かっております。ありがとうございますm(_ _)m
うまくいってTipsあれば追加で書き込みます!
shinさん
こんにちは、ルネサスの中の人です。
RXマイコンを中心に、通信・セキュリティ・リアルタイムOS周りを中心にソフト開発のとりまとめ的なことををしています。NoMaYさんとは少し前にこの掲示板上でAmazon FreeRTOSの初期試作をご一緒させていただきました。
ファームウェアアップデートがいろんな安全規格・セキュリティ規格的なものに搭載推奨と謳われるようになってきているからか、組み込み機器のファームウェアアップデートを検討される方が増えたように思いますね。RXやRAにあるデュアルバンク機能はファームウェアアップデートの強い味方です。ファームウェア書き換え中もシステム動作が継続可能です。
RXにおいて勉強におすすめな資料はNoMaYさんもご提示のとおり、FITモジュールとしてまとめている以下が良いかと思います。
https://www.renesas.com/jp/ja/document/scd/rx-family-flash-module-using-firmware-integration-technology?r=1499716
FITDemosフォルダに入っているサンプルコードをe2 studioに読み込めば、そのフォルダに入っているデータに対応するマイコンボードであればそのままフラッシュ書き込みの実験が可能です。
そのボードを持っていない場合は、自分で更地からe2 studioをつかってプロジェクト作成し、プロジェクトを構築する必要がありますが、以下RX72N Envision Kitを題材にしたガイドを使うとわりと簡単に任意のRXマイコン内蔵機能の動作確認ができます。
https://github.com/renesas/rx72n-envision-kit/wiki/%E3%83%9B%E3%83%BC%E3%83%A0
→新規プロジェクトベース(ベアメタル)
ファームウェアアップデートを極めていくと、上記RX72N Envision Kitの工場出荷時ファームウェアのようにAWS経由でOTAすることも可能です。上記RX72N Envision KitではAWS経由でOTAする動作も実験できますのでご興味ありましたら試していただくのが良いかもしれません。
https://github.com/renesas/rx72n-envision-kit/wiki/AWS%E3%81%A8FreeRTOS%E3%82%92%E7%94%A8%E3%81%84%E3%81%9FOTA%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A1%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E6%96%B9%E6%B3%95
以上です