【MSP430趣谈】MSP430第十三讲之DMA的应用
本系列教程应该来说也已经基本接近尾声了,还会有几讲的内容,最后如果可以的话还回附上一个具体的案例让我们来看下具体该如何应用430这款产品。也将更加深入的探讨他的低功耗特性。
今天我们还是继续讨论430的外设的使用。今天我们说的是DMA这个模块。首先一点我们需要知道,DMA是什么东西?
DMA的全称是Direct Memory Access,翻译过来是直接内存存取。那么具体是什么意思呢?我们解释一下。
比如说我们需要读取一个数据,简单的说比如从一个IO口读取一个电平的高低,然后存储到一个变量里头,那么在没有DMA的情况下,一般要分成这几个步骤来完成:
1.首先有CPU执行读取操作,将IO的输入寄存器的内容读取到内存当中
2.然后通过CPU将内存的内容写入到变量中
也就是说在这种情况下,对于一个寄存器的读取,需要CPU的参与,占用了CPU的运行时间,当我们加入了DMA这个模块之后,我们将实现一个什么功能呢?
也就是说利用DMA这个模块,我们无需涉及到CPU的使用,只要将DMA通道设置好,那么这些数据将直接通过寄存器传传输到指定的存储单元,从而节省了CPU的运行时间,从而大大的提高效率。
举个比较实际的例子,比如说你要卖东西,比如说卖书吧,那么你是不是得需要去一个书籍的经销商那边拿货,然后自己弄一个店铺,然后再把书卖给别人。整个一个这样的过程,那么现在如果你有了“DMA”这个功能的话,那你就不用开店了,你就直接打电话给经销商,让他把书送到客户那里就可以了,不用你自己开店来卖了。那么打电话这个过程就跟我们的DMA的配置一样,在使用之前我们要先经过一个配置的过程才可以。
很直接的看出来如果能够使用了DMA通道,对运行速度的提高有着非常大的帮助。
接下来我们来看下FR5969的DMA介绍:
FR5969的DMA特性包括以下几点:
1.最多能够达到8个独立的传输通道
2.可配置的DMA通道优先级
3.仅需要两个MCLK时钟周期来进行一次转换
4.一个字节,两个个字节或者是混合的字节和字的转换都是支持的
5.最多可以存储65535个字节或字
6.可配置转换触发方式
7.四种地址模式
8.单次,块,或者是多块的传输模式
这里我们添加解释一个东西就是word和byte的区别:
Byte就是我们所说的字节,这个毫无疑问,就是8个二进制位代表一个字节。那么对于字(word)而言是和我们的CPU架构有关联的,对于16位的架构来说一个字就是2两个字节,32位的呢就是4个字节,64位就是8个字节,所以很容易的看出来,一个字就是一个CPU架构的总线一次能够传输的最大数据量就是一个字,所以这里我们就可以很好的理解一个字。对于MSP430FR5969是一款发16位的单片机,所以它的字代表的就是两个字节。
那么我们现在先大概了解一下这些特点,接下来我们会详细讨论整个配置的过程。
首先我们看下DMA通道的地址模式,430的话有四种模式,具体如下:
从图上我们可以很容易看出这四种地址模式的区别,第一个是单地址到单地址,第二个是单地址到块地址,第三个是块地址到单地址,第四个是块地址到块地址。
那么接下来就是我们的传输模式:
前面是控制位的信息(DMADT控制位,这个位一定是在DMA某个控制寄存器之中)。总共是这6种传输模式。
单次传输模式,需要每次进行触发传输。
块传输模式,那么这个是一个块的数据在单次触发的时候同时传输。
突发块传输模式,此时CPU就处于间接工作状态,交叉工作在块传输模式上。
重复单次传输模式,也就是自动进行传输。
重复块传输模式,同样也是实现自动传输,其他的同上面一样。
重复突发块传输方式,同上面一样,只是能够自动重复实现,不用软件触发。
那么上面是对于DMA模块的一个基本介绍,了解相关的特性,以及它能够支持的一些传输方式,那么手册当中给出了每个传输方式具体的操作方法,但是由于篇幅太长,我们这里没有办法说一个一个给大家说明,这里如果大家有需要用到的时候可以具体参考手册的内容,我们这里只介绍一种方法进行说明。
我们假定两个数组,一个数组中存放字符串hello world!另一个字符串为空。那么我们利用DMA的方式,Data1的数据送到Data2中,这中间我们需要使用的是块传输的方式,因为我们的字符串总共有着11个字节,使用单次传输模式的话我们最多只能传输2个字节一个字(word)。这个应该比较好理解,另外我们使用软件触发数据传输,之后我们进行对比两个字符串是否相同,相同就点亮板子上面的LED2。
整个代码的思路就是这样,具体代码如下:
在判断两个字符串是否相等我们用到了一个函数,strcmp这个是C语言自身库里面的函数,用来判断字符串相等,形参直接输入两个字符串的首地址就可以,返回值为0的话就代表两着相等。两者比较的是之间的ASCII的值,当Data1<Data2的时候返回的是负数,反之则是正数。关于该函数的实现方式,大家具体参考我们的百度百科中的介绍。
http://baike.baidu.com/link?url=doE09oASDZPFpJ5iachmEj2rWNx7DJZ0cAWTUW5-rguGpIphvDL7WL4BM5Tas66zpDCVk6A9WEQnkT39DvZUEK
好了,到此我们就介绍完了我们的DMA,那么他对于数据传输方面是非常方便的,特别是在图像数据传输上面,因为图像数据量是比较大的,通过CPU进行搬运的话太费时费力了。当然DMA不局限于这样的一个应用还有其他的应用。
同时我们也需要明白一点,当我们使用DMA的时候,是不需要CPU来干涉数据的传输,但是我们需要明白,在CPU中的数据总线就那么多,DMA传输数据的时候回占用数据总线,所以如果CPU需要读写数据的话就没有办法同时进行,这个是我们需要明确的一点,此时CPU可以进行相应的运算工作,但是数据传输必须和DMA之间相互协调,因为毕竟数据总线就那么多。
今天就聊到这里了哈。