PDG2で提供していない周辺機能を使ったとき割込み設定処理は?

RX63N cs+ PDG2を使用しています。

PDG2で提供していない周辺機能を使ったとき割込み設定処理はどのように組み込んだらよろしいでしょうか。

例えばcanを使いたい時など?

ちなみに割込みを使わなければ、勝手に追加すればよいことはわかりました。

しかし、割込み設定はPDG2にしっかり組み込まれているため、悩んでいます。

Parents
  • sakuraisanさん、こんにちは。NoMaYです。

    HEWでPDG2を使わずに割り込みを使った経験があれば出来ると思います。その経験があれば、ICUのIERレジスタやIPRレジスタ、CPUのRTE命令、CC-RXの#pragma interruptディレクティブ、といった話は省いても大丈夫そうですね。

    それで、CANの割り込みプログラムの作成方法ですが、HEWでPDG2を使わずに割り込みを使った時と同様に、割り込み関数を書き、#pragma interruptでその関数をベクタ番号と共に指定する、だけで良い筈です。今思うに、PDG2(というかRPDL)が提供している周辺機能の割り込み関数と共存させる為に従うべき約束事のような割り込み関数の書き方があるのでは?と考えての質問だったのかも?という気がしていますが、そういった共存させる為に従うべき約束事は存在していないようです。ただし、RX63Nのハードウェアマニュアルを見たところ、CANのエラー割り込みがCANだけで纏まっているとは言え、グループ0に割り当てられていましたので、このグループ割り込み処理に関してはR_INTC_CreateGroup()関数で割り込み処理関数をPDG2(というかRPDL)に登録することになります。

    あと、intprg.cが無くなったことで困惑されているようですので、以下、それについて書きます。intprg.cは、vect.hに羅列されている#pragma interrupt指定の関数の実体(とは言っても、実際の割り込み処理が記述された関数を呼び出す為の器というか入れ物というか、そういう役割の関数)が羅列されているソースですが、vect.hの対となる箇所と合わせて切り出して別ソースに分離しても構わないものです。CANに関してならば、vect.hとintprg.cの以下の部分を両方合わせて別ソースに貼り付けて、後は割り込み処理の中身を書けば良いです。なお、そのソースはInterrupt_CAN.cという名前である必要は特に無いです(その名前でも構わないです)。また、AddFromPDG内やi_src内である必要も無いです(というか、そうしようとすると、厄介なことになってしまいます)。

    vect.h



    // CAN0 RXF0
    #pragma interrupt (Excep_CAN0_RXF0(vect=48))
    void Excep_CAN0_RXF0(void);

    // CAN0 TXF0
    #pragma interrupt (Excep_CAN0_TXF0(vect=49))
    void Excep_CAN0_TXF0(void);

    // CAN0 RXM0
    #pragma interrupt (Excep_CAN0_RXM0(vect=50))
    void Excep_CAN0_RXM0(void);

    // CAN0 TXM0
    #pragma interrupt (Excep_CAN0_TXM0(vect=51))
    void Excep_CAN0_TXM0(void);

    // CAN1 RXF1
    #pragma interrupt (Excep_CAN1_RXF1(vect=52))
    void Excep_CAN1_RXF1(void);

    // CAN1 TXF1
    #pragma interrupt (Excep_CAN1_TXF1(vect=53))
    void Excep_CAN1_TXF1(void);

    // CAN1 RXM1
    #pragma interrupt (Excep_CAN1_RXM1(vect=54))
    void Excep_CAN1_RXM1(void);

    // CAN1 TXM1
    #pragma interrupt (Excep_CAN1_TXM1(vect=55))
    void Excep_CAN1_TXM1(void);

    // CAN2 RXF2
    #pragma interrupt (Excep_CAN2_RXF2(vect=56))
    void Excep_CAN2_RXF2(void);

    // CAN2 TXF2
    #pragma interrupt (Excep_CAN2_TXF2(vect=57))
    void Excep_CAN2_TXF2(void);

    // CAN2 RXM2
    #pragma interrupt (Excep_CAN2_RXM2(vect=58))
    void Excep_CAN2_RXM2(void);

    // CAN2 TXM2
    #pragma interrupt (Excep_CAN2_TXM2(vect=59))
    void Excep_CAN2_TXM2(void);

    intprg.c



    // CAN0 RXF0
    void Excep_CAN0_RXF0(void){ }

    // CAN0 TXF0
    void Excep_CAN0_TXF0(void){ }

    // CAN0 RXM0
    void Excep_CAN0_RXM0(void){ }

    // CAN0 TXM0
    void Excep_CAN0_TXM0(void){ }

    // CAN1 RXF1
    void Excep_CAN1_RXF1(void){ }

    // CAN1 TXF1
    void Excep_CAN1_TXF1(void){ }

    // CAN1 RXM1
    void Excep_CAN1_RXM1(void){ }

    // CAN1 TXM1
    void Excep_CAN1_TXM1(void){ }

    // CAN2 RXF2
    void Excep_CAN2_RXF2(void){ }

    // CAN2 TXF2
    void Excep_CAN2_TXF2(void){ }

    // CAN2 RXM2
    void Excep_CAN2_RXM2(void){ }

    // CAN2 TXM2
    void Excep_CAN2_TXM2(void){ }

     

  • NoMaYさん 早々のご返信 ありがとうございます。
    NoMaYさんがおっしゃるように下手に追加するとPDG2(というかRPDL)が提供している周辺機能の割り込み関数を邪魔するか、壊してしまうのではないかと思っていました。心配しなくていいんですね。
    通常の#pragma interruptでその関数をベクタ番号と共に指定するで追加できるようです。
    トライせずに質問してしまいました。試してみます。
    また、グループ割り込みに関しては、ハードウェアーマニュアルをよく読んで理解したいと思います。
    ありがとうございました。
Reply
  • NoMaYさん 早々のご返信 ありがとうございます。
    NoMaYさんがおっしゃるように下手に追加するとPDG2(というかRPDL)が提供している周辺機能の割り込み関数を邪魔するか、壊してしまうのではないかと思っていました。心配しなくていいんですね。
    通常の#pragma interruptでその関数をベクタ番号と共に指定するで追加できるようです。
    トライせずに質問してしまいました。試してみます。
    また、グループ割り込みに関しては、ハードウェアーマニュアルをよく読んで理解したいと思います。
    ありがとうございました。
Children
No Data