00000-A
ルネサス半導体トレーニングセンター
Rev. 1.00
ルネサス エレクトロニクス株式会社
© 2013 Renesas Electronics Corporation. All rights reserved.
2013/08/02
RX62N 周辺機能紹介 DMAC
© 2013 Renesas Electronics Corporation. All rights reserved.
コンテンツ
DMACの概要
転送モード
起動要因
その他の機能
プログラムサンプル
2© 2013 Renesas Electronics Corporation. All rights reserved.
DMACの概要
© 2013 Renesas Electronics Corporation. All rights reserved.
機能概要
4 内容 1023Kデータ(ブロック転送時最大転送数:1023データ×1024ブロック) 最大転送数 ソフトウェアトリガ 外部端子割り込み(IRQ0〜3) 内蔵周辺機能の割り込み要求(CMT、A/D、MTU2、SCI、RIIC、USB、RSPI) 起動要因 チャネル0 > チャネル1 > チャネル2 > チャネル3 チャネル優先順位 ビット長:8ビット、16ビット、32ビット 転送データ データ数:1〜1023データ ブロックサイズ 転送方式 ノーマル 項目 1データ 1回のDMA転送要求で、1データを転送 総データ転送数を指定しない設定(フリーランニングモード)が可能 1回のDMA転送要求で、1データを転送 転送元または転送先で設定したリピートサイズ分のデータを転送すると、 転送開始時のアドレスに復帰 リピートサイズは最大1024データを設定可能 1回のDMA転送要求で、1ブロックのデータを転送 ブロックサイズは最大1023データを設定可能 ブロック リピート 転送アドレスレジスタの上位ビットの値を固定して特定範囲のアドレスを 繰り返す設定が可能 拡張リピートエリアは2バイト〜128Mバイトを転送元/転送先別に設定可能 拡張リピートエリア機能© 2013 Renesas Electronics Corporation. All rights reserved. DMAC DMACコア DMAC 制御回路 DMA要求 調停 内部メインバス2 周辺バスインタフェース 割り込み コントローラ DMA起動要求 DMAC応答 起動制御 転送元アドレス 転送先アドレス 転送カウンタ ブロックカウンタ 転送モード 4 バスインターフェース 外部バスインタフェース 内蔵SRAM STPCNT DMSAR DMDAR DMCRA DMCRB DMOFR DMTMD DMAMD DMCNT DMSTS DMACレジスタ (CH0~CH3) SFR レジスタ制御 DMAC応答 外部バス DMAC応答制御 バスアクセス 受付抑止要求 4 4 割込み要求
ブロック図と動作概要
5© 2013 Renesas Electronics Corporation. All rights reserved.
転送モード
© 2013 Renesas Electronics Corporation. All rights reserved.
ノーマルモード
© 2013 Renesas Electronics Corporation. All rights reserved.
リピートモード
© 2013 Renesas Electronics Corporation. All rights reserved.
リピートエリア
© 2013 Renesas Electronics Corporation. All rights reserved.
ブロック転送モード
10転送元データ領域
転送先データ領域
(ブロック領域に設定)
ブロック領域
DMDAR
DMSAR
:
:
:
転送
第Nブロック
第1ブロック© 2013 Renesas Electronics Corporation. All rights reserved.
ブロックエリア
11 第1ブロック 第1ブロック転送元データ領域
転送先データ領域
(ブロック領域に設定)
ブロック領域
DMDAR
DMSAR
:
:
:
転送
第Nブロック
© 2013 Renesas Electronics Corporation. All rights reserved.
転送モードの設定
DMA 転送モードレジスタ(DMTMD)
© 2013 Renesas Electronics Corporation. All rights reserved.
起動要因
© 2013 Renesas Electronics Corporation. All rights reserved.
転送要求の設定
14 DMACn.DMTMD(n=0~3) 初期値 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 ノーマル 転送モード設定 b4 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b3 b2 b1 b0 ー ー ー ー ー ー DCTG ー ー SZ MD DTS 0 1 リピート 1 0 ブロック 1 1 設定禁止 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 設定禁止© 2013 Renesas Electronics Corporation. All rights reserved.
ソフトウェア起動
© 2013 Renesas Electronics Corporation. All rights reserved.
周辺モジュールまたは外部割り込み
16 DMACn.DMTMD(n=0~3) 初期値 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 ノーマル 転送モード設定 b4 b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b3 b2 b1 b0 ー ー ー ー ー ー DCTG ー ー SZ MD DTS 0 1 リピート 1 0 ブロック 1 1 設定禁止 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 設定禁止© 2013 Renesas Electronics Corporation. All rights reserved.
起動要因の詳細設定
© 2013 Renesas Electronics Corporation. All rights reserved.
その他の機能
© 2013 Renesas Electronics Corporation. All rights reserved.
オフセット加算機能
アドレスA1 アドレスA2 =アドレスA1 + オフセット値 アドレスA3 =アドレスA2 + オフセット値 アドレスA4 =アドレスA3 + オフセット値 アドレスA5 =アドレスA4 + オフセット値 オフセット値 オフセット値 オフセット値 オフセット値 データ① データ② データ③ データ④ 転送 データ⑤ データ① データ② データ③ データ④ データ⑤ アドレスB1 アドレスB2 = アドレスB1 + 4 アドレスB3 = アドレスB2 + 4 アドレスB4 = アドレスB3 + 4 アドレスB5 = アドレスB4 + 4 転送元:オフセット加算 転送先:インクリメント データサイズ:32bit <転送元> <転送先> 19© 2013 Renesas Electronics Corporation. All rights reserved. ① ⑥ ⑪ ② ⑦ ⑫ ③ ⑧ ⑬ ④ ⑨ ⑭ ⑤ ⑩ ⑮ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮
転送元
転送先
DMACでコピー
すると90度回転
している
オフセット加算の使用例
20© 2013 Renesas Electronics Corporation. All rights reserved.
オフセット加算の設定
© 2013 Renesas Electronics Corporation. All rights reserved.
メモリ領域
繰り返す
00013FFEh
00013FFFh
00014000h
00014001h
00014002h
00014003h
00014004h
00014005h
00014006h
00014007h
00014008h
00014009h
00014000h
00014001h
00014002h
00014003h
00014004h
00014005h
00014006h
00014007h
拡張リピートエリアオーバフロー
割り込み要求の発生が可能
DMSARの
値の範囲
転送元アドレスの下位
3ビット(8バイト)を拡張リピートエリアに設定した場合
拡張リピートエリア機能
22© 2013 Renesas Electronics Corporation. All rights reserved.
拡張リピートエリアの設定1
© 2013 Renesas Electronics Corporation. All rights reserved.
拡張リピートアリアの設定2
拡張リピートエリアの範囲 拡張リピートエリアを設定しない 00000b 当該アドレスの下位1ビット(2バイト)を拡張リピートエリアに設定する 00001b 当該アドレスの下位2ビット(4バイト)を拡張リピートエリアに設定する 00010b 当該アドレスの下位3ビット(8バイト)を拡張リピートエリアに設定する 00011b 当該アドレスの下位4ビット(16バイト)を拡張リピートエリアに設定する 00100b 当該アドレスの下位5ビット(32バイト)を拡張リピートエリアに設定する 00101b 当該アドレスの下位6ビット(64バイト)を拡張リピートエリアに設定する 00110b 当該アドレスの下位7ビット(128バイト)を拡張リピートエリアに設定する 00111b 当該アドレスの下位8ビット(256バイト)を拡張リピートエリアに設定する 01000b 当該アドレスの下位9ビット(512バイト)を拡張リピートエリアに設定する 01001b 当該アドレスの下位10ビット(1Kバイト)を拡張リピートエリアに設定する 01010b 当該アドレスの下位11ビット(2Kバイト)を拡張リピートエリアに設定する 01011b 当該アドレスの下位12ビット(4Kバイト)を拡張リピートエリアに設定する 01100b 当該アドレスの下位13ビット(8Kバイト)を拡張リピートエリアに設定する 01101b 当該アドレスの下位14ビット(16Kバイト)を拡張リピートエリアに設定する 01110b 当該アドレスの下位15ビット(32Kバイト)を拡張リピートエリアに設定する 01111b 当該アドレスの下位16ビット(64Kバイト)を拡張リピートエリアに設定する 10000b 当該アドレスの下位17ビット(128Kバイト)を拡張リピートエリアに設定する 10001b 当該アドレスの下位18ビット(256Kバイト)を拡張リピートエリアに設定する 10010b 当該アドレスの下位19ビット(512Kバイト)を拡張リピートエリアに設定する 10011b 当該アドレスの下位20ビット(1Mバイト)を拡張リピートエリアに設定する 10100b 当該アドレスの下位21ビット(2Mバイト)を拡張リピートエリアに設定する 10101b 当該アドレスの下位22ビット(4Mバイト)を拡張リピートエリアに設定する 10110b 当該アドレスの下位23ビット(8Mバイト)を拡張リピートエリアに設定する 10111b SARA/DARAの値 24© 2013 Renesas Electronics Corporation. All rights reserved.
プログラムサンプル
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(1)仕様
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(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
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(1)マスタ許可設定
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(1)チャネル許可設定
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(1)SCIの初期化
30 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クリアを確認
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(2)仕様
31動作概要
メモリ内容をリピート機能でコピーします。コピーは500ms毎(CMT0割り込み
要求)に実行され、リピートエリアの4つのデータをリピート回数16回分を転送
します。全ての転送が終了すると転送設定を再初期化し、繰り返し転送しま
す。
プログラム構造
main関数
周辺機能レジスタを初期化後、CPUは転送元領域に擬
似データ作成を繰り返し。
DMACI0割り込み
DMAC0を再初期化
DMAC
動作モード
リピート転送モード
転送元
src_ad_data[4])
転送先
dest_result[16][4])
転送数
リピートエリア(4)×リピート回数(16)=64
起動
CMI0割り込み
CMT0
動作モード
2Hz(500ms)のインターバルタイマに設定。
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(2)フローチャート
setpsw_i(組み込み関数) 割り込み許可 ※CPU内部レジスタ、クロック レート、およびメモリ内の静的 変数領域はスタートアップ・ ルーチン内で初期化されます。 start_CMT0 CMT0 カウントスタート init_DMAC0 DMAC0 初期化 リセット・スタート スタートアップルーチン main init_CMT0 CMT0 初期化 CMT0割り込み要求を禁止 RTE DMAC0割り込み関数 (Excep_DMACA_DMAC0) 転送元アドレスを再設定 転送数、リピート回数を再設定 CMT0割り込みを許可 DMA転送を許可 転送先アドレスを再設定 転送元の擬似データを作成 32© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(2)転送領域
33
/*****************************************************************************/ /* 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(); // initialize for DMAC init_CMT0(); // Initialize for timer (CMT) start_CMT0(); // CMT0 count start setpsw_i(); // Interrupt enable (CPU) while(1){
} }
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(2)DMACの初期化
34
/*****************************************************************************/ /* 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. }
© 2013 Renesas Electronics Corporation. All rights reserved.
サンプル(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 }
© 2013 Renesas Electronics Corporation. All rights reserved.
/*****************************************************************************/ /* 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 }
サンプル(2)CMTの初期化
36© 2013 Renesas Electronics Corporation. All rights reserved.
まとめ、データ転送機能比較
転送パフォーマンス優先
起動要因数を優先
DMAC
転送情報は内部のレジスタに記憶
– 転送要求を受け付けると直ぐにデータ転送を開始
(転送のオーバーヘッドなし)
– チャネル数分の転送情報を保持(RX62Nでは4チャネル)
DTC
転送情報はRAMに記憶
– 転送情報をDTCベクタテーブルを使って読み込む
(転送のオーバーヘッドあり)
– 多くの転送情報を保持できる
37ルネサス エレクトロニクス株式会社
© 2013 Renesas Electronics Corporation. All rights reserved.