DMA(直接内存控制),DMA可以在外设之间传递数据而不要CPU的干预,节约了大量的CPU时间,并且减轻了CPU的负担,是一种快速高效的通信方式,在CC2430中集成了DMA控制器,提供5个DMA通道,并且官方推荐使用DMA方式传送RF寄存器中的数据,而且为了方便DMA对数据进行传输CC2430中对RF寄存器,硬件寄存器等进行了映射,全部映射到了XDATA区域,这样就可以用DMA来读取寄存器的数据,给操作带来了很大的方便。下面我们就对CC2430中集成的DMA进行试验。
关于DMA的寄存器并不多,但是DMA的操作和其他单片机寄存器的操作有一些不同的地方,就是DMA市通过读配置的方式来实现DMA的初始化的,所有的配置信息都存放在一个固定的地址中,当药启动DMA时只要先读入配置的地址然后启动相应地通道就可以了。
关于DMA的传输方式,在CC2430中集成的DMA控制器有四种传输模式:单模式:触发一次只能传送一个字节(字),直到传送完指定的长度后通知CPU,并且解除DMA通道工作状态;块模式:当触发一到就传输指定的长度,直到完成后就通知CPU;重复单一模式和重复块模式和非重复模式的区别在于当完成指定长度数据的传输并通知CPU后并不解除DMA通道的工作状态,而是DMA通道重新进入工作状态。
关于DMA的触发时个很灵活的东西,比如我可以用某个特定的触发条件,那么在程序中我就要确保这个触发条件在一定的情况下能够得到满足,否则得话DMA永远也不能进行传输,不过通过手动来第一次的启动DMA好像也是个不错的方法哦,呵呵!
DMA处理流程:
1、DMA初始化。
清除DMAARM、DMAREQ、DMAIRQ寄存器。
将DMAIF 中断标志清0.开启DMAIE中断使能。
2、设置通道配置数据结构地址。
对于每个DMA通道,需要有它自己的DMA配置 数据结构。DMA配置数据结构由8字节构成,DMA配置数据结构可以存放在由用户软件设定的任何位置,而地址通过DMAxCFGH:DMAxCFGL送到 DMA控制器,一旦DMA通道进入工作状态,DMA控制器就会读取由DMAxCFGH: DMAxCFGL地址里给定的该通道的配置数据结构。
需要注意的是,指定DMA配置数据结构开始地址的方法十分重要。这些地址对于DMA
通道0和DMA通道1~4是不同的:
DMA0CFGH:DMA0CFGL给出DMA通道0配置数据结构的开始地址;
DMA1CFGH:DMA1CFGL给出DMA通道1配置数据结构的开始地址,其后跟着通道 写DMA配置参数数据结构。
3、为要发送或者接收的数据分配相应的通道。设置该通道的配置数据结构。特别是数据的源地址和接收地址。
4、启动相应的通道;
INT_ENABLE(INUM_DMA, INT_ON); if (inum==INUM_DMA) { DMAIE = on; }
5、等待触发条件触发DMA。
6、传输数据
1)设置RFD的相应寄存器:中断标志RFIF、中断屏蔽RFIM。
2)如果需要设置发送数据的结构,关闭中断,设置数据结构
DMA_ABORT_CHANNEL(dmaNumberRx); #define DMA_ABORT_CHANNEL(ch) DMAARM = (0x80 | ((0x01 << ch) & 0x1F))
3)设置DMAARM相应的通道位。
DMA_ARM_CHANNEL(dmaNumberTx); #define DMA_ARM_CHANNEL(ch) / do{ / DMAARM = ((0x01 << ch) & 0x1F); / } while(0)
4)手动触发触发源。
DMA_START_CHANNEL(dmaNumberTx); #define DMA_MAN_TRIGGER(ch) DMAREQ = (0x01 << ch)
总而言之,整个DMA过程中需要设置的寄存器有:
DMAARM、DMAREQ、DMAIRQ
中断标志:DMAIF
中断使能:DMAIE
全局使能:AE
通道选择:DMAARM
通道中断禁止DMAARM.ABORT