Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

DMAブロック転送時の割り込みについて

RX210にて、

DMA(DMAC0)にてブロック転送を行っています。

1ブロックの転送はできたのですが、

2ブロック目以降が割り込みで転送できません。

メインループ内で定期的にチェックして、再開すると転送できました。

 

わりこみについて、

リピートサイズ割り込み許可ビットを立て、割り込み設定をしているのですが、

割り込みコントローラ側の設定がわかりません。

どのような設定が必要でしょうか。

(CPU割り込みの設定方法がわかりません。)

ご教授いただけると幸いです。

よろしくお願いいします。

  • にゃあ少佐さん
    お疲れ様です、
    DMA(DMAC0)の転送完了割込みがどんな働きをするのか調べてみてはと思います、
    「CPU割り込みの設定方法」もドキュメントの割込みコントローラに説明があります、
    サンプルソフトもダウンロードして調べてみてはどうでしょうか。
  • In reply to IKUZO:

    IKUZOさん
    お疲れさまです。

    ドキュメントとにらめっこしながら、書いてみたのですが
    動きません。。

    DMAC0のブロック転送について、
    1ブロック転送が完了した段階で、DMACから「リピートサイズ終了割り込み」が発生。
    この割り込みを許可&割り込みコントローラについても、DMACからの割り込みを許可することによって割り込み要求を処理できるという認識です。
    この時に、DTCorDMAC起動割り込みを設定をしない場合、
    CPU割り込みとして処理されるのではないのでしょうか。


    指摘いただけると幸いでございます。
    よろしくお願いいたします。


    /*########### main.c ###############*/

    /*割り込み初期化部*/

    // 割込停止
    IEN(DMAC, DMAC0I) = 0;
    //フラグクリア
    IR(DMAC,DMAC0I) = 0;
    // 割込優先度10
    IPR(DMAC,DMAC0I) = 10;
    // 割込許可
    IEN(DMAC, DMAC0I) = 1;

    setpsw_i();


    /*DMAC初期設定部*/

    DMAC0.DMSAR = /*転送元Address*/;
    DMAC0.DMDAR = /*転送先Address*/;
    DMAC0.DMCRA = (0x0286 << 16) + 0x0286;//転送ブロックサイズカウンター ブロックサイズカウンター
    DMAC0.DMCRB = 0x00005; //ブロック転送回数counter 5回
    DMAC0.DMTMD.WORD = 0x8000; //ブロック転送、転送先がブロック領域 8ビット転送 ソフトウェア呼び出し
    DMAC0.DMINT.BYTE = 0x0;//割り込みを禁止
    DMAC0.DMINT.BIT.RPTIE = 1;//リピートサイズ割り込み有効のみ有効
    DMAC0.DMAMD.WORD = 0x8000;//転送元アドレスインクリメント、転送元拡張リピートエリア設定なし、転送先アドレス固定、転送先拡張リピートエリア設定なし
    DMAC0.DMOFR = 0x00;//オフセットincrement、使用せず
    *DMAC= 0x01; //DMAC起動を許可
    DMAC0.DMCNT.BIT.DTE = 1;//DMA転送許可
    DMAC0.DMREQ.BYTE = 0x01;//DMAソフトウェア起動レジスタ 1に設定すると起動


    /*########### interrupt_handlers.c ###############*/

    #include "iodefine.h"を追記

    // DMAC DMAC0I
    #pragma interrupt (Excep_DMAC_DMAC0I(vect=198))
    void Excep_DMAC_DMAC0I(void){
    //追記ここから
    DMAC0.DMCNT.BIT.DTE = 1;//DMA転送許可ビットb0
    DMAC0.DMREQ.BYTE = 0x01;//DMAソフトウェア起動レジスタ b0を1に設定すると起動
    //追記ここまで
    }
  • In reply to にゃあ少佐:

    にゃあ少佐さん
    お疲れさまです、
    ICUの設定は必要なかったですかね、
    こういうのも必要ではないですかね、
    DMAC0.DMINT.BIT.DTIE=1; //転送終了割り込み(許可)
  • In reply to IKUZO:

    IKUZOさん
    ありがとうございます。

    ICUの設定は、IRレジスタ・IERレジスタ・IPRレジスタ以外に設定が必要とのことでしょうか。
    怪しそうな、ICU.DMRSR(DMAC起動要求選択レジスタ)は、
    DMAC割り込みからは呼び出せないことになっているのですが。。

    DMAC0の割り込み許可については、リピートサイズ割り込みのほかに転送終了割り込みも必要とのことですか。

    よろしくお願いいたします。
  • In reply to にゃあ少佐:

    おはようございます
    にゃあ少佐さん
    DMAC DMAC0I 198 0318h エッジ○ ○ × × × IER18.IEN6 IPR198 DTCER198
    これを設定する必要があると思います、
    例ですが、
    //D0FIFO0 33 0084h エッジ○ ○ ○ × × IER04.IEN1 IPR033 DTCER033
    ICU.DMRSR1=33;//ベクタ番号セット
    ICUの設定は面倒くさいです、
    「DMAC割り込みからは呼び出せない」
    最初に一度のみの設定なので、
    再度呼び出す必要はないと思います。
  • In reply to IKUZO:

    IKUZOさん
    おはようございます。

    無事、割り込み処理ができました。

    DMACの割り込み許可ビットについて、よく見直したところ
    DMAC0.DMINT.RPTIEビットとDMAC0.DMINT.ESIEビット両方を許可する必要があることに気づきました

    DMAC0.DMINT.RPTIEビット(リピートサイズ終了割り込み許可ビット)はセットしていたのですが、
    DMAC0.DMINT.ESIEビット(転送エスケープ終了割り込み許可ビット)もセットしないと、
    そもそもリピートサイズ終了割り込みが許可されませんでした。

    しっかりと、ドキュメントを確認しないといけませんね。。。

    ご教授いただき、ありがとうございました!

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page