原创 [博客大赛]MSP430F2616开发笔记(四)DMA的Burst-Block Transfers模式

2014-3-22 14:26 1478 17 22 分类: MCU/ 嵌入式 文集: MSP430

虽然在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就会亮起。

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

DiracFatCat 2014-3-24 17:05

哈哈,高手在这里啊~以后多多交流~

用户343153 2014-3-24 09:37

看评论确实有不少一瓶不满半瓶咣当的小子没有真正搞明白DAM这个词的起源和操作原理。望文生义是不少二货的通病。 DMA的实际原理是当外设或内存之间的数据传输不与CPU的存取内存的操作发生冲突时就直接传输,但如果遇到CPU和DMA要同时访问同一资源时则要按预定的优先级仲裁策略进行排队操作也就是此时一个工作,另一个等待。总线仲裁和周期窃取的概念你们听说过吗? 没有的先去学明白了再说!STM32 的实验也可以证明高密度的DMA操作确实会影响CPU的反应速度! 如果你不明白这点并且在软件设计时没有采取措施,遇到你的STM32要有快速实时响应中断请求服务的严苛场合,你可能死都不知道怎么死的。

DiracFatCat 2014-3-4 00:55

没错的,包括STM32单片机也是需要CPU挂起的,因为DMA传输时需要数据总线的控制权,所以DMA传输一定的字节之后就会释放总线,此时CPU才会继续运行,因为速度太快了,所以看起来就像是CPU从来没有停一样。MSP430不会自动释放总线,所以CPU会一直挂起,需要设置成Burst模式才行。

用户377235 2014-3-3 18:51

兄弟,不要误导别人了。先弄清什么是 dma吧。

303643087_377645774 2014-3-1 09:08

从理论上来讲这的观点是错误的,如果DMA时CPU要挂起,那还要DMA有什么用呢,还不如不要,DMA是数据的直接传输通道,一旦设定好就不需要CPU再干预,在传输完成后可以发送中断给CPU,或者直接不管,CPU的外设或内存中的值在不需要CPU操作的情况下直接发生改变。
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-07-19 15:09
对sed命令的练习
sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:https://www.gnu.org/software/sed/manual/sed.html学习Linux命令,当然要阅读官方手册,所...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
EE直播间
更多
我要评论
5
17
关闭 站长推荐上一条 /3 下一条