DMAコピー
レジスタ設定でワンショットのDMAをおこなうサンプル・プログラムです。idleで待っていますがHRMにはIRQ_STATUSをポーリングしても性能低下はないとかかれてあります。
// DMAによる汎用コピープログラム void dmaCopy( void * dst, void * src, int count) { // デスティネーション // 転送後、DMAを終了 *pMDMA_D0_START_ADDR = dst; *pMDMA_D0_X_COUNT = count; *pMDMA_D0_X_MODIFY = 1; // ソース // 転送後DMAを終了 *pMDMA_S0_START_ADDR = src; *pMDMA_S0_X_COUNT = count; *pMDMA_S0_X_MODIFY = 1; // MDMA割り込みを禁止 *pSIC_IMASK &= ~ MDMA0_INT; // MDMA終了でウェイクアップ *pSIC_IWR |= MDMA0_INT; csync(); // キックスタート // ワンショットDMA *pMDMA_S0_CONFIG = DMAEN | WDSIZE_8 ; *pMDMA_D0_CONFIG = DMAEN | DI_EN | WNR | WDSIZE_8 ; do { // ウエイクアップ待ち csync(); idle(); csync(); } while( ! (*pMDMA_D0_IRQ_STATUS & DMA_DONE) ); // ウエイクアップクリア *pMDMA_D0_IRQ_STATUS = DMA_DONE; }