RX62N 周辺機能紹介 DMAC Direct Memory Access Controller ルネサスエレクトロニクス株式会社ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ DMACの概要 転送モード 起動要因 その他の機能 プログラムサンプル 2
DMAC の概要 3
機能概要 項目 内容 最大転送数起動要因チャネル優先順位 1データ転送データブロックサイズノーマル 1023K データ ( ブロック転送時最大転送数 :1023 データ 1024 ブロック ) ソフトウェアトリガ外部端子割り込み (IRQ0 3) 内蔵周辺機能の割り込み要求 (CMT A/D MTU2 SCI RIIC USB RSPI) チャネル 0 > チャネル 1 > チャネル 2 > チャネル 3 ビット長 :8ビット 16ビット 32ビットデータ数 :1 1023データ 1 回の DMA 転送要求で 1 データを転送総データ転送数を指定しない設定 ( フリーランニングモード ) が可能 転送方式 リピート ブロック 1 回の DMA 転送要求で 1 データを転送転送元または転送先で設定したリピートサイズ分のデータを転送すると 転送開始時のアドレスに復帰リピートサイズは最大 1024 データを設定可能 1 回の DMA 転送要求で 1 ブロックのデータを転送ブロックサイズは最大 1023 データを設定可能 拡張リピートエリア機能 転送アドレスレジスタの上位ビットの値を固定して特定範囲のアドレスを繰り返す設定が可能拡張リピートエリアは 2 バイト 128M バイトを転送元 / 転送先別に設定可能 4
ブロック図と動作概要 DMAC 起動制御 SFR DMAC レジスタ (CH0~CH3) 割り込みコントローラ 4 DMA 起動要求 DMAC 応答 4 DMA 要求調停 DMSAR DMDAR DMCRA DMCRB DMOFR DMTMD DMAMD DMSTS DMCNT 割込み要求 4 DMAC 応答制御 レジスタ制御 STPCNT DMAC 応答 バスアクセス受付抑止要求 DMACコア転送元アドレス転送先アドレス転送カウンタブロックカウンタ転送モード DMAC 制御回路 バスインターフェース 外部バス 外部バスインタフェース 内蔵 SRAM 周辺バスインタフェース 内部メインバス 2 5
転送モード 6
ノーマルモード 7
リピートモード 8
リピートエリア 9
ブロック転送モード 転送元データ領域 転送先データ領域 ( ブロック領域に設定 ) DMSAR 第 1 ブロック : 転送 ブロック領域 DMDAR 第 N ブロック 10
ブロックエリア 転送元データ領域 転送先データ領域 ( ブロック領域に設定 ) DMSAR 第 1 ブロック : 転送 第 1 ブロック ブロック領域 DMDAR 第 N ブロック 11
転送モードの設定 DMA 転送モードレジスタ (DMTMD) 12
起動要因 13
転送要求の設定 DMACn.DMTMD(n=0~3) b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 MD DTS ーー SZ ーーーーーー DCTG 初期値 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W 転送モード設定 0 0 ノーマル 0 1 リピート 1 0 ブロック 1 1 設定禁止 データ転送サイズ 0 0 8ビット 0 1 16ビット 1 0 32ビット 1 1 設定禁止 転送要求選択 0 0 ソフトウェア 0 1 周辺モジュールおよび外部割り込み 1 0 設定禁止 1 1 設定禁止 リピートエリア選択 0 0 転送先がリピート / ブロック領域 0 1 転送元がリピート / ブロック領域 1 0 リピート / ブロック領域を指定しない 1 1 設定禁止 14
ソフトウェア起動 15
周辺モジュールまたは外部割り込み DMACn.DMTMD(n=0~3) b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 MD DTS ーー SZ ーーーーーー DCTG 初期値 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W R/W 転送モード設定 0 0 ノーマル 0 1 リピート 1 0 ブロック 1 1 設定禁止 データ転送サイズ 0 0 8ビット 0 1 16ビット 1 0 32ビット 1 1 設定禁止 転送要求選択 0 0 ソフトウェア 0 1 周辺モジュールおよび外部割り込み 1 0 設定禁止 1 1 設定禁止 リピートエリア選択 0 0 転送先がリピート / ブロック領域 0 1 転送元がリピート / ブロック領域 1 0 リピート / ブロック領域を指定しない 1 1 設定禁止 16
起動要因の詳細設定 17
その他の機能 18
オフセット加算機能 < 転送元 > < 転送先 > 転送 オフセット値 データ 1 アドレス A1 データ1 データ2 データ3 データ4 データ5 アドレス B1 アドレス B2 = アドレス B1 + 4 アドレス B3 = アドレス B2 + 4 アドレス B4 = アドレス B3 + 4 アドレス B5 = アドレス B4 + 4 オフセット値 データ 2 アドレス A2 = アドレス A1 + オフセット値 オフセット値 データ 3 アドレス A3 = アドレス A2 + オフセット値 オフセット値 データ 4 データ 5 アドレス A4 = アドレス A3 + オフセット値 アドレス A5 = アドレス A4 + オフセット値 転送元 : オフセット加算転送先 : インクリメントデータサイズ :32bit 19
オフセット加算の使用例 転送元 1 6 11 2 7 12 3 8 13 4 9 14 5 10 15 転送先 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 DMAC でコピーすると 90 度回転している 20
オフセット加算の設定 21
拡張リピートエリア機能 転送元アドレスの下位 3 ビット (8 バイト ) を拡張リピートエリアに設定した場合 メモリ領域 00013FFEh 00013FFFh 00014000h 00014001h 00014002h 00014003h 00014004h 00014005h 00014006h 00014007h 00014008h 00014009h DMSAR の値の範囲 00014000h 00014001h 00014002h 00014003h 00014004h 00014005h 00014006h 00014007h 繰り返す 拡張リピートエリアオーバフロー割り込み要求の発生が可能 22
拡張リピートエリアの設定 1 23
拡張リピートアリアの設定 2 SARA/DARAの値 00000b 00001b 00010b 00011b 00100b 00101b 00110b 00111b 01000b 01001b 01010b 01011b 01100b 01101b 01110b 01111b 10000b 10001b 10010b 10011b 10100b 10101b 10110b 10111b 拡張リピートエリアの範囲拡張リピートエリアを設定しない当該アドレスの下位 1ビット (2バイト) を拡張リピートエリアに設定する当該アドレスの下位 2ビット (4バイト) を拡張リピートエリアに設定する当該アドレスの下位 3ビット (8バイト) を拡張リピートエリアに設定する当該アドレスの下位 4ビット (16バイト) を拡張リピートエリアに設定する当該アドレスの下位 5ビット (32バイト) を拡張リピートエリアに設定する当該アドレスの下位 6ビット (64バイト) を拡張リピートエリアに設定する当該アドレスの下位 7ビット (128バイト) を拡張リピートエリアに設定する当該アドレスの下位 8ビット (256バイト) を拡張リピートエリアに設定する当該アドレスの下位 9ビット (512バイト) を拡張リピートエリアに設定する当該アドレスの下位 10ビット (1Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 11ビット (2Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 12ビット (4Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 13ビット (8Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 14ビット (16Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 15ビット (32Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 16ビット (64Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 17ビット (128Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 18ビット (256Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 19ビット (512Kバイト) を拡張リピートエリアに設定する当該アドレスの下位 20ビット (1Mバイト) を拡張リピートエリアに設定する当該アドレスの下位 21ビット (2Mバイト) を拡張リピートエリアに設定する当該アドレスの下位 22ビット (4Mバイト) を拡張リピートエリアに設定する当該アドレスの下位 23ビット (8Mバイト) を拡張リピートエリアに設定する 24
プログラムサンプル 25
サンプル (1) 仕様 26
サンプル (1)DMAC の初期化 1: #include "iodefine.h" 2: #include <machine.h> 3: #include "vect.h" 4: 5: void main(void); 6: void initdmac(void) ; 7: void initsci(void) ; 8: 9: unsigned char buf[100] ; 10: 11: // 12: // メイン関数 13: // 14: void main(void) 15: { 16: SYSTEM.SCKCR.LONG = 0x00020200; // ICLK=96MHz,PCLK=24MHz,BCLK=24MHz 17: 18: initdmac() ; // DMAC 初期設定関数呼び出し 19: initsci() ; 20: // set_psw(0x00010000); // 割り込み許可 (I=1,U=0) 21: while(1) ; 22: } 23: 24: // 25: // DMAコントローラ初期設定 26: // 27: void initdmac(void) 28: { 29: MSTP(DMACA) = 0 ; // Wakeup DMAC 30: 31: ICU.DMRSR0 = 239 ; // 起動要因 = SCI6 32: DMAC0.DMAMD.WORD = 0x0080; // Sorce 固定,D inc 33: DMAC0.DMTMD.WORD = 0x0001 ; // ノーマル,8ビット転送, 周辺モジュール 34: DMAC0.DMSAR = &SCI6.RDR ; // 転送元アドレス設定 35: DMAC0.DMDAR = &buf[0] ; // 転送先アドレス設定 36: DMAC0.DMCRA = 100 ; // 転送バイト数 =100バイト 37: // DMAC0.DMCSL.BYTE = 1 ; // 起動要因の割り込み要求をCPUに伝達する 38: DMAC.DMAST.BYTE = 1 ; // DMA 転送許可 39: DMAC0.DMCNT.BYTE = 1 ; // DMA 転送許可 40: } 41: 27
サンプル (1) マスタ許可設定 28
サンプル (1) チャネル許可設定 29
サンプル (1)SCI の初期化 42: // 43: // SCI 初期設定 44: // 45: void initsci(void) 46: { 47: int i ; 48: 49: MSTP(SCI6) = 0 ; // Wakeup SCI6 50: PORT0.ICR.BYTE = 0x02 ; // RxD6(P01) 入力バッファON 51: 52: SCI6.SCR.BYTE = 0 ; // 内部クロック選択 53: SCI6.SMR.BYTE = 0 ; // 調歩同期,8ビット長, パリティなし 54: SCI6.BRR = 38 ; // 19200bps 55: for(i=0; i<1250; i++) ; // 1ビット期間待ち 56: SCI6.SCR.BYTE = 0xf0 ; // 送受信許可, 送受信割り込み許可 57: 58: // IPR(SCI6, ) = 7 ; // SCI6 割り込み優先レベル =7 59: // IEN(SCI6,ERI6) = 1 ; // ERI6 受信エラー割り込み許可 60: IEN(SCI6,RXI6) = 1 ; // SCI6 受信割り込み許可 61: } 62: 63: // SCI6_ERI6 64: //#pragma interrupt (Excep_SCI6_ERI6(vect=238)) 65: //void Excep_SCI6_ERI6(void) 66: //{ 67: // unsigned char err_sts; 68: // err_sts = SCI6.SSR.BYTE & 0x30; 69: // : 70: // SCI6.SSR.BYTE = 0xc0 ; // 受信エラーフラグ ( オーバラン フレーミング ) クリア 71: // while((sci6.ssr.byte & 0x30)); // 受信エラーフラグの0クリアを確認 72: // while( IR(SCI6,ERI6) ); // 受信エラーの割り込みステータスビットが0か確認 30
サンプル (2) 仕様 動作概要 メモリ内容をリピート機能でコピーします コピーは500ms 毎 (CMT0 割り込み要求 ) に実行され リピートエリアの4つのデータをリピート回数 16 回分を転送します 全ての転送が終了すると転送設定を再初期化し 繰り返し転送します プログラム構造 main 関数 周辺機能レジスタを初期化後 CPUは転送元領域に擬 似データ作成を繰り返し DMACI0 割り込み DMAC0 を再初期化 DMAC 動作モードリピート転送モード 転送元転送先転送数起動 src_ad_data[4]) dest_result[16][4]) リピートエリア (4) リピート回数 (16)=64 CMI0 割り込み CMT0 動作モード 2Hz(500ms) のインターバルタイマに設定 31
サンプル (2) フローチャート リセット スタート スタートアップルーチン CPU 内部レジスタ クロックレート およびメモリ内の静的変数領域はスタートアップ ルーチン内で初期化されます main init_dmac0 DMAC0 初期化 init_cmt0 CMT0 初期化 start_cmt0 CMT0 カウントスタート setpsw_i( 組み込み関数 ) 割り込み許可 転送元の擬似データを作成 DMAC0 割り込み関数 (Excep_DMACA_DMAC0) CMT0 割り込み要求を禁止 転送元アドレスを再設定 転送先アドレスを再設定 転送数 リピート回数を再設定 DMA 転送を許可 CMT0 割り込みを許可 RTE 32
サンプル (2) 転送領域 /*****************************************************************************/ /* Function prototype declaration */ /*****************************************************************************/ void main(void); // main function void init_dmac0(void); // initialize for DMAC void init_cmt0(void); // Initialize for timer (CMT) void start_cmt0(void); // CMT0 count start void start_dac(void); // D-A convert start /*****************************************************************************/ /* Global variable definition */ /*****************************************************************************/ static uint16_t src_ad_data[4] = { 62, 600, 221, 465, }; static uint16_t dest_result[16][4]; /*****************************************************************************/ /* Outline : Main */ /* Description : Hardware setting and endless loop with non operation. */ /*****************************************************************************/ void main(void) { int i; } init_dmac0(); init_cmt0(); start_cmt0(); setpsw_i(); while(1){ } } // initialize for DMAC // Initialize for timer (CMT) // CMT0 count start // Interrupt enable (CPU) 33
サンプル (2)DMAC の初期化 /*****************************************************************************/ /* Outline : initialize for DMAC */ /* Description : Data transfer to DAC. (Repeat mode) */ /*****************************************************************************/ void init_dmac0(void){ DMAC0.DMSAR = (void *)src_ad_data; // Source address is the beginning of the array on ROM. DMAC0.DMDAR = (void *)dest_result; // Destination addres is the array on RAM. DMAC0.DMCRA = 0x0404; // Transfer count is 4 times. (backup) DMAC0.DMCRB = 16; // 16 times repeat. DMAC0.DMTMD.BIT.DCTG = 1; // Transfer start by peripheral or external signal DMAC0.DMTMD.BIT.SZ = 1; // Transfer data size is 16bit DMAC0.DMTMD.BIT.DTS = 1; // Transfer repeat area : source. DMAC0.DMTMD.BIT.MD = 1; // Transfer mode : repeat transfer DMAC0.DMINT.BIT.DTIE = 1; // Transfer end interrupt is enable DMAC0.DMAMD.BIT.DM = 2; // Destination address increase by data transfer DMAC0.DMAMD.BIT.SM = 2; // Sourse address increase by data transfer DMAC0.DMCNT.BIT.DTE = 1; // Transfer of DMAC channel 0 is enbale DMAC.DMAST.BIT.DMST = 1; // Transfer of DMACA is enable } ICU.DMRSR0 = VECT(CMT0,CMI0); // Interrupt request of CMI0 transmit to DMAC0 IPR(DMAC,DMAC0I) = 1; // DMAC0I priority is 1. IEN(DMAC,DMAC0I) = 1; // Interrupt request of DMAC0I is enable. 34
サンプル (2) 転送終了割り込み処理 /*****************************************************************************/ /* Outline : DMAC0 transfer end interrupt */ /* Description : Register of DMAC0 reset */ /*****************************************************************************/ void Excep_DMACA_DMAC0(void){ IEN(CMT0,CMI0) = 0; // Interrput request of CMI0 is disable DMAC0.DMSAR = (void *)src_ad_data; // Source address is the beginning of the array on ROM. DMAC0.DMDAR = (void *)dest_result; // Destination addres is the array on RAM. DMAC0.DMCRA = 0x0404; // Transfer count is 4 times. (backup) DMAC0.DMCRB = 16; // 16 times repeat. DMAC0.DMCNT.BIT.DTE = 1; // Transfer of DMAC channel 0 is enbale IR(CMT0,CMI0) = 0; // Interrput request of CMI0 clear IEN(CMT0,CMI0) = 1; // Interrput request of CMI0 is enable } 35
サンプル (2)CMT の初期化 /*****************************************************************************/ /* Outline : CMT0 initialize */ /* Description : The register of CMT0 is initialized. */ /*****************************************************************************/ void init_cmt0(void){ MSTP(CMT0) = 0; // Wakeup CMT0,CMT1 CMT0.CMCR.BIT.CKS = 3; // CKS is PCLK/512 CMT0.CMCR.BIT.CMIE = 1; // CMIE is enable CMT0.CMCOR = 46874; // CMCOR is 500ms@48MHz IEN(CMT0,CMI0) = 1; // CMI0 enable } /*****************************************************************************/ /* Outline : CMT0 start */ /* Description : CMT0 count start. */ /*****************************************************************************/ void start_cmt0(void){ CMT.CMSTR0.BIT.STR0 = 1; // Start CMT0 } 36
まとめ データ転送機能比較 DMAC 転送情報は内部のレジスタに記憶 転送要求を受け付けると直ぐにデータ転送を開始 ( 転送のオーバーヘッドなし ) チャネル数分の転送情報を保持 (RX62Nでは4チャネル) 転送パフォーマンス優先 DTC 転送情報はRAMに記憶 転送情報をDTCベクタテーブルを使って読み込む ( 転送のオーバーヘッドあり ) 多くの転送情報を保持できる 起動要因数を優先 37
END ルネサスエレクトロニクス株式会社