ADSP-BF561のメモリー間DMAです。BF533のMDMAを書き換えただけですので説明は省きます。
#include <cdefBF53x.h> #include <sys/exception.h> char srcBuf[20] = "Chiba City Blues"; char dstBuf[20]; // DMA descriptor struct { void * ndp; // next descriptor void * sa; // start address unsigned short config; unsigned short xcnt; short xmod; }src, dst; EX_INTERRUPT_HANDLER(intHandler); main(void) { *pSICA_IMASK0 = 0xffffffff; *pSICA_IMASK1 = 0xffffffff; register_handler( ik_ivg8, intHandler ); // デスクリプタ・アドレス指定 *pMDMA1_D0_NEXT_DESC_PTR = &dst; *pMDMA1_S0_NEXT_DESC_PTR = &src; // デスティネーション // 転送後、DMAを終了 dst.ndp = 0; dst.sa = dstBuf; dst.xcnt = 20; dst.xmod = 1; dst.config = DI_EN | DMAEN | WNR | WDSIZE_8; // ソース // 転送後DMAを終了 src.ndp = 0; src.sa = srcBuf; src.xcnt = 20; src.xmod = 1; src.config = DMAEN | WDSIZE_8; // キックスタート // ラージ・デスクリプタ・リンク&デスクリプタサイズ=7 *pMDMA1_S0_CONFIG = DMAEN | WDSIZE_8 | 0x7700; *pMDMA1_D0_CONFIG = DMAEN | WNR | WDSIZE_8 | 0x7700; while(1) ; } // 割り込みハンドラ EX_INTERRUPT_HANDLER(intHandler) { *pMDMA1_D0_IRQ_STATUS = DMA_DONE; // 割り込みクリア }