Block Transfers模式即:设置好源地址与目标地址,以及需要传输的byte/word数,全部传输完成之后DMAEN自动清零,而传输这么多数据只需要触发一次。
因为DMA不需要设置时钟,所以它的代码其实非常简单。
/*******************************************/
uint16_t dma_temp_A[64];
uint16_t dma_temp_B[64];
int main (void)
{
uint16_t i = 0;
WDTCTL = WDTPW + WDTHOLD;
// 传输64个字节
// 源地址是dma_temp_A
// 目标地址是dma_temp_B
DMA0SZ = 64;
DMA0SA = dma_temp_A;
DMA0DA = dma_temp_B;
// 使用Block transfer模式,源地址和目标地址都递增
DMA0CTL = DMADT_1 | DMADSTINCR_3 | DMASRCINCR_3;
while (1) {
for (i = 0; i < 8; i++) {
dma_temp_A = 0xA0 + i;
dma_temp_B = 0xB0 + i;
}
DMA0CTL |= DMAEN;
DMA0CTL |= DMAREQ;
while (1);
}
return 0;
}
/*******************************************/
结论一,置位DMAEN和DMAREQ就能启动一次DMA传输,而且会将指定的字节自动传输完;
结论二,只要传输完成,中断标志位DMAIFG就会被挂起,但是它的状态不影响DMA的寄存器操作;
结论三,成功的传输需要,DMAEN置位的情况下产生DMAREQ的上升沿(这个可以通过DMALEVEL来设置,默认为上升沿触发,HIGH LEVEL触发的话,DMAREQ在DMAEN为零时被置位也是有效的)。
文章评论(0条评论)
登录后参与讨论