RL78/G13のCRCチェック機構

RL78で相変わらずごそごそと調べています。
コード生成の「安全機能」についてなのですが
このうち、フラッシュメモリCRC演算を使いたいと
おもいます。
使用するを選択しても特になにかできるような
コードがはかれているようすはありません。

ハードウエアマニュアルによれば、私のつかう
R5F100LEAFBだと64KBバイトなので
0-FFFBH
を指定してコード生成。
CA78K0R(ビルドツール)のオブジェクトコンバートオプションで
CRC演算を行う
CRC結果出力アドレス FFFC
CRC演算範囲 0h-0FFFBh
CRC演算方法 高速CRC
としたのですが、特になにかが生成されている
様子もありません。
HEXの生成アドレスFFF0からもFFでうめられているように見えます。

そこで問題なのですが、そもそもこのハードウエアCRC
演算は有効なのでしょうか?
CubeSuite+のユーザマニュアルをみよ、との指摘も
ありますが、実際に見つけられたのは
R_CGC_Set_CRCOn(void);
が定義されており、CRC検査開始ビット指定が
あるのみです。
ハードウエアマニュアルの支持通りにするなら
R_CGC_Set_CRCOn(void);
をコールして HALT命令を実行すればCRCチェックが
かかるようにみえますが、具体的には
どうすればいいのでしょう?
なにか資料がありませんでしょうか

  • スタッフのチョコです。

    ご迷惑をおかけして申し訳ありません。

    お問い合わせの高速CRC機能については,サンプルコードとアプリケーションノートを準備中です。
    サンプルコードそのものはできていて,現在ドキュメントの作成中です(来月末までには登録する予定です)。

    具体的な処理としては,CRC0CTLレジスタを設定して,RAM上のプログラムでHALT命令を実行することでCRC演算が行われます。(マニュアルの図22-3参照)

  • スタフのフィルです。

    RL78をご使用いただきありがとうございます。

    ご質問の件、”RL78/G13 ユーザーズマニュアル ハードウェア編 Aug.22.11Rev.1.00”のP902に記載の本機能の実行条件にご注意ください。

    ”「RAM上のプログラムによるメイン・システム・クロックでのHALTモードでのみ動作可能です。」”

    従いまして、以下の手順で実行が可能です。
    ・R_CGC_Set_CRCOn(void)実行
    ・もしサブシステムクロック動作の場合、メインシステムクロック動作に切り替える
    ・RAM上に配置されたサブルーチンに遷移(RAMフェッチ)
    ・HALT実行

  • 解答ありがとうございます。

    おおむね理解しているつもりですが
    最大の問題は肝心の想定されるCRC値が
    うまく出力されていないようすだということです。
    どこに出力されているのでしょう?
    前にも書きましたが、CRC値はFFのままにみえるのです。

    う~ん。
  • >サンプルコードそのものはできていて,現在ドキュメントの作成中です(来月末までには登録する予定です)。

    ということであれば、もう少し早くいただけないですかねぇ。
    完全なドキュメントでなくてもかまわないのですが。
    月末には実装完なのですが、自前でROMチェックルーチン
    つくるよりは遙かに確実なはずなので。

    入手の方法はありませんか?

  • 以下のような感じです。
    HALTしてRETしてくると、PGCRCLはちゃんと返ってくるようです。
    ハードウエアマニュアルどおりのうごきだとおもいます。

    ==========================================
    unsigned char ChkHardwareCRC(void)
    {
    // HALT\, RET
    char CRC_check_ram[] = {
    0x61\, 0xED\, 0xD7\,
    0\,0\,0\,0\,0\,0\,0\,0\,0\,0
    };
    unsigned int CRCvalue = 0;
    unsigned int CRCvalue2 = 0;
    unsigned char ret = 1;

    //X_ROM_CRC_SUM : 0xFFFC サムの保存アドレス
    __far int* const ptr = X_ROM_CRC_SUM;

    // RAM アドレス内にHALT配置
    void __far (*funcHALT)(void) = &CRC_check_ram[0];

    CRC0EN = 1; // CRC演算動作許可

    funcHALT(); // HALT実行

    CRC0EN = 0; // CRC動作停止

    CRCvalue = PGCRCL ;
    CRCvalue2 = *ptr;


    if ( CRCvalue != CRCvalue2 ) ret = 0;
    else ret = 1;

    return ret;
    }

    ==========================================

    問題は、
    0xFFFCにサムアドレスがきちんと生成されていない
    ということだとおもいます。
    やりかたはあっているでしょうか?
    CA78K0R(ビルドツール)をクリックして、
    オブジェクト コンバート オプションのタブをひらく。
    CRC演算の項目を
    CRC演算を行う
    CRC結果出力アドレス FFFC
    CRC演算範囲 0h-0FFFBh
    CRC演算方法 高速CRC
    に設定。

    もしかして、これだけではダメなんでしょうか?
    あと一歩まできているとおもうんですが。
    ヒントをいただければ、とおもうんですが。
    よろしくお願いします。

  • スタッフのチョコです。

    もしかすると,オンチップデバッグをオンにされてはいないでしょうか。

    オンチップデバッグではROMの最後の512/256バイトを使用してしまいます。そのためにCRCの値が出力されていないのではないかと思われます。

    CGのクロック設定のだけでなく,リンクオプションも確認してください。
    落ちらで確認した画面を添付しておきます。

    IqBqxnUnN4FUs6Xu-0_A0035.jpg

    O0A8sRqgy1zIlK8h-1_A0036.jpg

  • オンチップデバッガ設定が原因でしたか!
    たしかにFDFE以前だときちんとHEXファイルには
    指定アドレスで書かれるようです。
    さすがにE1デバッガなしで開発、ってのは現実的で
    ないので、CRCはFDEFにセットするようにして
    運用しようとおもいます。

    さて、あとすこしだとおもうのですが
    もうすこしおつきあいください。

    HEXにはきちんとCRCが設定されているようなので
    さきのROM読み出しルーチンをやってみましたが
    やっぱり失敗します。
    いろいろためしてみると、コンパイルしたコードが
    入っているアドレスに対してはきちんと読み出しが
    できているようです。
    これにたいし、コンパイルコードがはいっていない
    ROM領域についてはFFFFになる雰囲気なのです。

    先にあげたROM読み出しコードではなにかたりないのでしょうか?
  • スタッフのチョコです。

    どうも,オブジェクト・コンバータ段階では,オンチップ・デバッグで使用する領域にはFFが埋まっているようです。
    このため,オンチップ・デバッグが生きている状態では,ビルド時の値が実際に動作させるときの状態と一致しません。

    こうなると,CRCチェックはオンチップ・デバッグしない状態で確認するしかないようです。

  • チョコさん
    お手数おかけしています。
    たしかにその領域はFFでうめられて、CRCも吐かれないので、了解です。

    ただ、ず~っっと前のほうのエリア、たとえば、0300とか、コードが置かれるあたりのほうでためしているのですが、CRCはきちんと指定アドレスに埋め込まれています(HEXで確認)

    これで、前回示したプログラムをうごかすと、
    ROMコード部はちゃんと読み出せています。
    (デバッガで読み出す値と逆アセンブラの値がきちんと一致して読み出せてます)
    ところが、ROMコードのないところはFF。
    これは正しいのですけど、CRCをおいたところまでFFになるのは何か仕掛けがあるのかなと。

    あと一歩だとおもうんですが...
  • tetnoguchi様

    情報が大変遅くなり申し訳ございません。

    オンチップデバッグを行う際、デバッグ用モニタ領域は、
    消去するため、0xFFFCの領域もその対象になり、
    期待値を埋め込んでおくことができません。

    また、リセットベクタ(0x2番地)もデバッグ用途に
    書き換えられますので、演算結果も異なってしまいます。

    このためRL78/G13のオンチップデバッグでは
    高速CRC機能の動作はできますが、肝心のチェックが
    できません。
    フルICEのIECUBEではチェックが可能です。