PSoC5是Cypress可编程片上系统PSoC(Programmable System on Chip)家族中功能最强大的一个产品系列;采用工作频率高达 80 MHz 的 32 位三段流水线式 ARM Cortex-M3 处理器构建, 提供业界广泛采用的0.5V至5.5V宽电压范围和低至200nA的休眠电流。此外,PSoC5片内提供了极其丰富和业内独一无二的高性能可编程模拟和数字外设子系统,允许将任何模拟或数字信号(包括可编程时钟)分配到任何通用I/O引脚,这为使用者提供了真正的“系统级”可编程能力。DMA(直接存储器存储:Direct Memory Access)就是其中一种功能强大的外设模块。
本文以PSoC5平台为例,介绍了DMA的主要原理,配置过程方法及具体的典型工程设计。
PSoC5外设架构及DMA简介
PSoC5芯片内部集成了丰富的模拟与数字外设子系统,如图1所示,由外设集线器PHUB(Peripheral Hub)负责将不同的外设子系统之间以及外设子系统与CPU连接起来。PHUB内的连接数据总线共有8条,称之为spoke, 有16位和32位两种数据宽度。每个spoke都可以通过PHUB连接至不同的外设子系统或CPU。PHUB内包含的DMAC(DMA控制器:DMA Controller)能够使不同的外设子系统间通过spoke传递数据而不需要CPU的介入,可以极大的节省CPU资源,提高处理速度。
PSoC片内通过PHUB的数据传递可以分为两种:CPU与外设子系统之间的数据传递;不同的外设子系统之间的数据传递,这类传递可以在DMAC的控制下直接通过spoke进行,不需要CPU的主动介入。因此,CPU与DMAC可以在同一时刻访问不同的spoke;如果二者在同一时刻访问同一spoke,将会产生一个spoke仲裁(arbitration)。
P1.JPG
DMAC主要通过24个DMA通道(Channel)和128个任务描述符TD(Transaction Descriptor)来实现外设子系统间数据直接存储任务的设定与管理。
DMA通道:每个DMA通道定义一个DMA传输类型,包括数据源和目的外设子系统的类型及高16位地址,每次传输的字节数等。
任务描述符TD:在DMA通道配置定义的基础上,TD进一步定义了一个DMA传输的总字节数(或重复传输的次数),传输过程中及结束时需要执行的动作。此外,每个TD配置中还定义了在本TD任务结束后指向的下一个TD的指针。
由上述定义不难看出,DMA通道配置主要在大的范围内限定了数据源和目的外设子系统的类型,以及所传输数据的长度。DMA传输任务的具体细节主要由任务描述符TD进行配置。每个DMA通道可以有多个TD,构成一个TD链表来完成比较复杂的多数据DMA传输。
图2所示为一个比较简单的DMA通道与其TD链表的示意图。对于一个特定的任务,如何确定需要几个DMA通道,以及每个DMA通道需要几个任务描述符TD将在下面的章节中进行论述。
P2.JPG
DMA配置原理与方法说明
由上一节简介可知,外设子系统间数据的DMA传输任务配置应该分为DMA通道配置与任务描述符TD配置两个方面。
① DMA通道配置
图3-1所示为DMA通道配置的主要内容和参数。
P3-1.JPG
P3-2.JPG
Burst Count(1 to 255):DMA传输一次数据称为一个burst。此参数定义了DMA每次待传输数据的宽度,单位为字节。传输开始后,DMA应将此参数定义的所有字节全部传输完,才能释放相应的spoke.
Request Per Burst (0 or 1): 若一个DMA任务需要传输的总数据量超过一个burst时,应分成多次发送。当此参数设为0时,所有后续的burst将会在其前一个burst完成后自动进行而不再需要单独的request请求。因此只有在第一个burst开始时需要唯一的request请求。当此参数设为1时,每个burst传输时都需要独立的request请求。
First TD of Channel: 每个DMA通道拥有1个TD或由多个TD构成的链表,此参数为指向单个TD,或多TD链表首个TD的指针。
Preserve TD (0 or 1): 在一个request请求完成后,下一个request请求开始时可能会需要其TD的一些信息。此参数为0不保存TD的实时信息,为1则在每request请求结束后保存TD的所有中间状态及配置信息。
② 任务描述符TD配置
图3-2所示为任务描述符TD配置的主要内容和参数。
Transfer Count(1 to 4095):此参数定义了一个DMA任务需要传输数据包含的总字节数。若待传输单个数据的宽度(由 Burst Count定义)为N,需要传输的数据个数(即burst数量)为M,那么Transfer Count参数应当为M * N。
TD Property:此参数包含多个配置项,如下所示:
Increment Source Address: 在每个burst传输结束后递增源数据地址。
Increment Destination Address: 在每个burst传输结束后递增目的数据地址。在DMA传输任务的源数据或目的数据地址超过1个时,这两个命令项必须被配置。
Swap Enable:此选项只针对PSoC3应用。由于PSoC3的外设寄存器采用小端(Little Endian)格式,而PSoC3应用程序的Keil编译器对存储器内的变量采用大端(Big Endian)格式。因此当DMA在外设寄存器与存储器间传输2字节或4字节数据时,DMA必须交换传输数据的高低字节。
Swap Size:当Swap Enable配置为1时,此选项有效。0表示2字节,1表示4字节。
Auto Executive Next TD:当DMA通道含有多个TD时,须配置此选项。1表示当前TD完成后,指针指向的下一个TD自动执行;0表示当前TD完成后,下一个TD的执行需要另外的独立request请求。
DMA Completion Event:当DMA通道含有多个TD时,须配置此选项。1表示当前TD完成后,指针指向的下一个TD自动执行;0表示当前TD完成后,下一个TD的执行需要另外的独立request请求。
Next TD:指向TD链表中相邻的后续TD的指针。
③ 具体配置方法
DMA通道与任务描述符TD的各项参数配置共有两种方法,一是通过菜单栏的DMA向导(Wizard)提供的选项进行设置,另一种是通过Creator提供的应用程序接口API函数来进行配置。关于PSoC Creator集成开发环境的使用与编程方法,请参考本文的参考文献和登陆Cypress网站。
1)DMA向导配置法
首先将DMA器件( component)放入Creator 2.2 的原理图界面中,并完成系统原理图后,点击菜单栏 Tools -》 DMA Wizard,打开配置对话框,点击 Next,出现如图4所示界面。在此界面中可以配置数据源及目的地址等参数;
P4.JPG
点击 Next后出现图5所示界面,根据工程实际要求进一步配置其余参数,然后点击Next,进入图6所示界面,自动生成DMA配置代码,将此代码拷入主程序中即可。
P5.JPG
P5-1.JPG
2)API配置法
在Creator中完成原理图绘制后,首先编译原理图,DMA器件将会产生两个API源程序文件,DmaInstanceName_dma.c和DmaInstanceName_dma.h。其中的c文件中包含有DMA初始化与配置的函数。配置过程主要步骤如下:
1、启动(Start)DMA通道
Channel_Handle = DMA_DmaInitialize(DMA_BYTES_PER_BURST, DMA_REQUEST_PER_BURST, HI16(Source Address), HI16(Destination Address))
2、创建一个 TD实例
TD_Handle = CyDmaTdAllocate();
3、设定 TD传输配置项
CyDmaTdSetConfiguration(TD_Handle,Transfer_Count,Next_TD,TD_Property);
4、设定TD传输数据源及目的地址
CyDmaTdSetAddress(TD_Handle, LO16(Source Address), LO16(Destination Address))
5、设定DMA通道的初始TD指针
CyDmaChSetInitialTd(Channel_Handle , TD_Handle)
6、允许(Enable)DMA通道
CyDmaChEnable(Channel_Handle, preserve_TD)
PSoC5平台上的ADC转换数据的DMA传输实例
对于参数缓慢变化且有干扰伴随的ADC应用来说,并不需要在每个转换周期完成后实时读取转换结果。比较好的解决方法是将一段时间内的采样结果自动存放在某个地方,然后再由CPU一次性读取,这样既可以节约CPU的资源,又可以进行一些滤波处理。DMA正好可以扮演自动将一组采样结果存放到RAM中的角色,示意图如图6所示。
P6.JPG
ADC转换完成产生EOC信号时,DMA将2字节的ADC转换结果从ADC寄存器 搬至片内RAM的缓冲数组中,达到设定的数量时,DMA产生一个nrq完成信号触发中断,由CPU读取并处理这一组信号。相应的Creator原理图如图7所示。
P7.JPG
可以采用上述两种DMA配置方法的任意一种。图8为DMA通道配置示意。由于ADC转换结果为10位,所以Burst Count为2;本实例设定为一次按键DMA搬运一个数据后即关闭,故Request Per Burst 为1;而后续burst传输必须和当前burst连续,所以Preserve TD为1。
P8.JPG
图9为任务描述符TD配置示意。Transfer Count设定为N × Burst Count;在每个burst完成后,需要Increment Destination Address;且传输数量达到Transfer Count后,将会Generate DMA done event来触发中断程序。
值得注意的是,在这里只需要1个TD就可以完成任务了。如果DMA需要将ADC结果搬入RAM中两个独立的缓冲区,如图10所示意,由于两个缓冲区间的距离超过一个Burst Count,所以需要两个TD来完成任务。而这两个缓冲区的地址高16位都是相同的,所以共享一个DMA通道就可以了。
P9.JPG
P10.JPG