虽然在DMA模式下,不使用CPU就能进行不同地址之间的数据传输,但是并不意味着进行DMA传输的时候CPU可以继续做其他的事情,实际情况是,DMA传输的时候CPU会被挂起,也就是说它什么也干不了;等DMA结束了,CPU就会继续之前的工作。
如果数据很少,挂起了也无所谓,但是如果数据量很大或者不间断,有可能就会出问题了,好在除了之前所说的Single Transfer模式和Block Transfers模式之外,MSP430还提供一种Burst-Block Transfers模式。在此模式下,DMA每传输4个byte/word就回来执行两个MCLK指令,每个DMA的byte/word传输需要2个MCLK时间,就是说,CPU挂起8个MCLK再运行2个MCLK。
/************************************************/
uint16_t dma_temp_A[256];
uint16_t dma_temp_B[256];
int main (void)
{
uint16_t i = 0;
WDTCTL = WDTPW + WDTHOLD;
led_init();
// 传输64个字节
// 源地址是dma_temp_A
// 目标地址是dma_temp_B
DMA0SZ = 256;
DMA0SA = dma_temp_A;
DMA0DA = dma_temp_B;
// 使用Burst-block transfer模式,源地址和目标地址都递增
DMA0CTL = DMADT_2 | DMADSTINCR_3 | DMASRCINCR_3;
while (1) {
for (i = 0; i < 256; i++) {
dma_temp_A = 0xAABB;
dma_temp_B = 0xCCDD;
}
DMA0CTL |= DMAEN;
DMA0CTL |= DMAREQ;
led0_off();
DMA0CTL &= ~DMAEN;
if (dma_temp_A[255] == dma_temp_B[255])
led0_on();
while (1);
}
return 0;
}
/************************************************/
这段程序执行结束之后,led2并不会被点亮;而如果初始化为Block Transfers模式,led2就会亮起。
DiracFatCat 2014-3-24 17:05
用户343153 2014-3-24 09:37
DiracFatCat 2014-3-4 00:55
用户377235 2014-3-3 18:51
303643087_377645774 2014-3-1 09:08