当前位置:首页 > 智能硬件 > 智能硬件
[导读] 引言 PSoC5是Cypress可编程片上系统PSoC(Programmable System on Chip)家族中功能最强大的一个产品系列;采用工作频率高达 80 MHz 的 32 位三段流水线式 ARM Cortex-M3 处理器构建, 提供业界广泛采用的0.5V至5

 引言

 

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)。

 

 

 

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将在下面的章节中进行论述。

 

 

 

DMA配置原理与方法说明

 

由上一节简介可知,外设子系统间数据的DMA传输任务配置应该分为DMA通道配置与任务描述符TD配置两个方面。

 

① DMA通道配置

 

图3-1所示为DMA通道配置的主要内容和参数。

 

 

 

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所示界面。在此界面中可以配置数据源及目的地址等参数;

 

 

 

点击 Next后出现图5所示界面,根据工程实际要求进一步配置其余参数,然后点击Next,进入图6所示界面,自动生成DMA配置代码,将此代码拷入主程序中即可。

 

 

 

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所示。

 

 

 

ADC转换完成产生EOC信号时,DMA将2字节的ADC转换结果从ADC寄存器 搬至片内RAM的缓冲数组中,达到设定的数量时,DMA产生一个nrq完成信号触发中断,由CPU读取并处理这一组信号。相应的Creator原理图如图7所示。

 

 

 

可以采用上述两种DMA配置方法的任意一种。图8为DMA通道配置示意。由于ADC转换结果为10位,所以Burst Count为2;本实例设定为一次按键DMA搬运一个数据后即关闭,故Request Per Burst 为1;而后续burst传输必须和当前burst连续,所以Preserve TD为1。

 

 

 

图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通道就可以了。

 

 

 

 

 

小结

 

本文主要介绍了PSoC5片内DMA的主要原理,配置过程与方法,以及如何使用DMA进行具体的工程设计。采用DMA进行数据直接传输与存储,可以不占用CPU的处理时间,极大地提高PSoC5的处理速度和效率。DMA可以在数据通讯与大规模现场数据采样应用中发挥关键作用,帮助用户使用PSoC5设计出简洁高效的产品。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

从我们的直观感受来说,DMA并不是一个复杂的东西,要做的事情也很单纯直白。因此Linux kernel对它的抽象和实现,也应该简洁、易懂才是。不过现实却不甚乐观(个人感觉),Linux kernel dmaengine...

关键字: Linux dma

  吉利dma项目进展   为进一步扩大市场份额和开拓大客户市场,吉利汽车拟在梅山岛新建整车生产工业园,本项目总用地面积约1888亩,项目位于宁波市北仑区东南海滨的梅山岛。地块北侧为七星

关键字: dma 吉利

  吉利品牌包含BMA乘用车在内的三大项目此前已宣布落户成都,预计整车总产能将达60万台。近日网通社从成都市发改委获悉,吉利正推进成都BMA/PMA、宁波梅山DMA基地建设项目,未来将投产多款吉

关键字: dma 吉利

什么是8位微控制器STM8L050?它有什么作用?2019年1月16日 - 意法半导体推出了全新的8位微控制器STM8L050的推出,以提升低成本、低功耗8位微控制器(MCU)的功能集成度。作为超高能效的STM8L系列的...

关键字: dma MCU stm8l050

这是一篇指导驱动工程师如何使用DMA API的文档。

关键字: CPU dma

本文从计算机组成原理的层面详细介绍了DMA,以及Linux网络子系统的DMA机制是如何实现的。

关键字: dma Linux 编程

你知道嵌入式驱动程序关于设计层面的技术吗?无论学习什么都有需要掌握的要点与窍门,本文我们一起深入了解关于嵌入式驱动程序关于设计层面的窍门。每一个嵌入式应用软件都会在某些时候访问最底层的固件和进行一些硬件控制。 驱动的设计...

关键字: dma 嵌入式设计 usart驱动程序

今天,我将带您了解Linux内存管理。 对于精通CURD的学生,内存管理似乎离我们还很远,但是尽管这一知识点并不热门(据估计,很多人在学习后不会再使用它),但这无疑是基础。 虽然学完后没有看到即时的效果,但是它将对您将来...

关键字: dma Linux zone
关闭
关闭