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;
     
}