AN52705 PSoC 3 and PSoC 5LP - Getting Started with DMA (Chinese).pdf

AN52705
PSoC® 3 和 PSoC 5LP — DMA 入门手册
作者: Anu M D、Lakshmi Natarajan
相关项目:有
相关器件系列:所有 PSoC ® 3 和 PSoC 5LP 器件
软件版本:PSoC ® Creator™ 3.0 SP1 以及更高版本
相关应用笔记:AN61102,AN84810
摘要
AN52705 提供了 PSoC® 3 和 PSoC 5LP 上的直接储存器访问(DMA)模块简介。PSoC DMA 可以在片上外设和存储器
之间传输数据,无需 CPU 的干预。应用笔记通过使用示例项目来介绍如何配置 DMA 来实现简单数据传输,包括外设到存
储器、存储器到外设、各外设间以及各存储器间的数据传输。
目录
简介 ................................................................................... 1
附录 A:DMA 配置步骤 ................................................... 19
DMA 配置 .......................................................................... 4
其他重要的 DMA API 函数 .......................................... 21
通道配置 ....................................................................... 4
附录 B:DMA 向导配置 ................................................... 21
TD 配置......................................................................... 4
附录 C:设置 DMA 通道的优先级.................................... 23
DMA 组件概述 ................................................................... 6
附录 D:示例项目 — 测试设置 ........................................ 24
DMA 组件的硬件连接.................................................... 6
示例 2:DMA 配置 ...................................................... 12
示例 1:外设至外设的传输 —
Eg1_ADC_DMA_DAC ............................................... 24
示例 2:外设至存储器的传输 —
Eg2_ADC_DMA_Mem .............................................. 24
示例 3:存储器至外设的传输 —
Eg3_Mem_DMA_DAC ............................................... 25
示例 4:存储器至存储器的传输 —
Eg4_Mem_DMA_Mem ............................................... 25
示例 5:TD 链路 — Eg5_TD_Chaining ...................... 26
示例 2:项目文件 ....................................................... 12
附录 E:常见问题: ........................................................ 27
DMA 的固件配置................................................................ 7
示例 1:外设至外设的传输 ................................................ 8
示例 1:DMA 配置 ........................................................ 9
示例 1:项目文件 ......................................................... 9
示例 1:DMA 配置代码 ............................................... 10
示例 2:外设至存储器的传输 .......................................... 11
示例 3:存储器至外设的传输 .......................................... 13
示例 3:DMA 配置 ...................................................... 14
示例 3:项目文件 ....................................................... 14
示例 4:存储器至存储器的传输 ....................................... 15
示例 4:DMA 配置 ...................................................... 16
示例 4:项目文件 ....................................................... 16
示例 5:TD 链路 .............................................................. 17
示例 5:DMA 配置 ...................................................... 18
示例 5:项目文件 ....................................................... 18
简介
PSoC 3 和 PSoC 5LP 的 DMA 控制器(DMAC)可以将数
据从一个数据源传输到一个目标地址,并且无需 CPU 的干
预。因此在 DMA 传输数据时,CPU 仍能够处理其他任务,
从而获得‘多处理’环境。
PSoC DMA 控制器(DMAC)是高度灵活的器件 — 它可
以在存储器和片上外设(包括 ADC、DAC、滤波器、USB、
UART 和 SPI)间无缝传输数据。具有 24 个独立的 DMA
通道。
总结 ................................................................................. 18
关于作者 .......................................................................... 18
www.cypress.com
文档编号:001-93054 版本*A
1
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
该应用笔记描述了如何将 DMA 配置给简单的数据传输。它
包括显示下面各种不同类型 DMA 传输的项目:




本应用笔记假定您已经熟悉使用 PSoC Creator 进行
PSoC 3 或 PSoC 5LP 的开发应用。如果您刚刚接触
PSoC 3 或 PSoC 5LP,则可以通过 AN54181 — PSoC 3
入门手册和 AN77759 — PSoC 5 入门手册加深对该产品的
了解。有关 DMA 的应用的高级主题,请参考 AN84810 应
用笔记。如果您尚未了解 PSoC Creator,请参考 PSoC
Creator 主页中的内容
外设到存储器
存储器到外设
各外设之间
各存储器之间
DMA 的基本概念
PSoC 3 和 PSoC 5LP 上的 DMAC 是连接片上外设的中央集线器(被称为外设集线器(PHUB))的一部分,如图 1 所示。
DMAC 是 PHUB 的两个总线主器件中的一个。
图 1. 外设集线器
USB
CAN
固定功能
I2C
32位
轮辐
仲裁
外部存储器
接口(EMIF)
16位
ADCs
DACs
32位
数字滤波器
模块(DFB)
轮辐7
轮辐3
16位
IO接口
www.cypress.com
16位
16位
PHUB
轮辐1
DMAC
通用数字摸块
(UDB)
轮辐6
轮辐4
32位
EEPROM
轮辐5
CPU
轮辐0
SRAM
固定功能
定时器
轮辐2
系统资源
16位
通用数字模块
(UDB)
其他模拟外设
文档编号:001-93054 版本*A
2
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
PHUB 具有八个被称为轮辐的数据总线。每个轮辐将 CPU
和 DMAC 连接到一个或多个外设。轮辐的数据宽度是 16 位
或 32 位。连接到轮辐的外设有 8 位、16 位或 32 位的数据
宽度。
外设的数据宽度通常不大于外设连接到的轮辐的数据宽度。
如果外设的数据宽度大于所连接的轮辐的数据宽度,则
PHUB 会以轮辐的宽度与外设进行数据传输。
PHUB 有两个总线主器件,即 CPU 和 DMAC。CPU 和
DMAC 可以同时访问不同的 PHUB 轮辐。如果 CPU 和
DMAC 同时尝试对同一个轮辐进行访问,将发生总线仲裁。
有关详细信息,请参见《PSoC 3 和 PSoC 5LP 技术参考手
册》。
24 DMA 通道中的每一个都可以独立进行数据传输。每个通
道都具有一个数据操作描述符(TD)链,如图 2 所示。TD
包括以下信息:源地址、目标地址、传输次数以及链中的下
一个 TD。有多达 128 个 TD。通道和 TD 的结合显示了完
整的 DMA 传输。
图 2. DMA 通道
DMA通道
源地址
目标地址
读
写
DRQ
NRQ
DMA完成信号 — 通常连接至中断
DMA请求信号
TD指针
TD0
源地址
目标地址
TD1
传输值
下一个TD
每个 DMA 通道都有启动数据操作的单独 DMA 请求输入。
一个 DMA 请求可以由 CPU 或外设启动。当收到 DMA 请求
www.cypress.com
源地址
目标地址
传输值
下一个TD
时,DMAC 将访问连接到源和目标地址的轮辐,并传输数
据(如通道和有关 TD 的配置)。
文档编号:001-93054 版本*A
3
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
DMA 配置

每次突发请求(0 或 1)
完成 DMA 数据传输需要进行多次突发传输时,该位可
确定突发的性质。
通过使用通道和 TD 配置寄存器对 DMA 传输进行配置。图
3 显示了通道和 TD 的配置参数。
0:表示第一次突发后的所有后续突发可自动完成,无
需单独的 DMA 请求。只要 求第一次突发 传输具有
DMA 请求。
图 3. DMA 配置
通道
配置
TD
配置
源地址(高16位)
源地址
(低16位)
目标地址(高16位)
目标地址(低16位)
突发计数
(1-127)
传输计数(0到4095)
每次突发请求
(真或假)
TD的属性
通道的第一个TD
下一个TD
1:每次突发传输都需要一个单独的请求。

初始 TD
定义与通道相关联的第一个 TD。第一个 TD 的指针被
存储在通道配置存储器中。后续 TD 指针被存储在 TD
配置存储器中,如链表所示。

保留 TD(0 或 1)
确定是否要保存原始的 TD 配置以重新使用,以用于后
续 DMA 传输。保留典型的 TD 配置。
0:不保留 TD 配置。
1:保留 TD 配置。
如果 TD 被保留,则通道使用一个单独 TD 存储器(与
通道编号相应)以跟踪正在运行的数据操作;否则将原
始 TD 配置寄存器作为工作寄存器使用,以跟踪正在运
行的数据操作。
保留TD
(真或假)
通道配置
TD 配置
下述内容解释了 DMA 通道配置参数:
以下的内容显示的是 TD 配置参数:


源地址中的高 16 位
在通道配置寄存器中对 32 位源地址的高 16 位进行配
置。

目标地址的高 16 位
在 TD 配置寄存器上对源地址的低 16 位进行配置


传输计数(0 至 4095 个字节)
从源地址到目标地址传输的字节总数量。
突发计数(1 至 127)
DMA 通道释放轮辐前,需要定义它要从源地址传输到
目标地址的字节数量。DMAC 获取轮辐,并将指定的
字节数从源地址传输到目标地址,然后释放轮辐。在下
一个突发传输中,它会再次获取轮辐。
限制内部轮辐 DMA 传输的突发计数不大于 16。
www.cypress.com
目标地址的低 16 位:
32 位目标地址的低 16 位
在该通道配置寄存器中对 32 位目标地址的高 16 位进
行配置。

源地址的低 16 位
传输计数与突发计数参数同时设置。比如,如果您要将
50 个大小为 2 字节的数据字从 16 位外设传输到存储器
缓冲区,突发计数和传输计数分别被设置为 2 和 100。

下一个 TD
下一个 TD,如链表所示。
文档编号:001-93054 版本*A
4
®
PSoC 3 和 PSoC 5LP — DMA 入门手册

TD 属性
表 1 显示的是由 TD 属性配置寄存器中的位字段定义的 TD 属性。
表 1. TD 的属性
属性
说明
递增源地址
如果设置该位,进行 DMA 数据操作时,将递增源地址。
递增目标地址
如果设置该位,进行 DMA 数据操作时,将递增目标地址。
交换使能
如果设置,DMA 将数据从源地址传输到目标地址时,它会交换数据字节。
交换大小
如果交换使能位被设置,可确定交换操作的大小。
0:在 DMA 传输过程中,对每两个字节执行字节序交换。
1:在 DMA 传输过程中,对每四个字节执行字节序交换。
自动执行下一个 TD
0:仅在执行下一个 DMA 请求后,才会执行链中的下一个 TD。
1:当前一个 TD 传输完成后,会自动执行链中的下一个 TD。
DMA 完成事件
如果设置,则数据传输完成后,将生成一个 DMA“完成信号”。数据传输完成后,通常通过该
属性创建一个中断。
允许 TD 终止
如果设置,通过使用硬件信号可以终止正在运行的数据操作。
PSoC 3 Keil 编译器使用高位优先格式存储 16 位和 32 位变量。但 PSoC 3 外设寄存器使用低位优先格式。 因此,当 DMA 将多
字节数据在 PSoC 3 的外设寄存器和存储器之间进行传输时,必须配置 DMA 以执行字节交换。对于 PSoC 5LP,不需要配置
DMA,因为外设和存储器都使用了相同的字节序格式。
现在让我们了解如何使用 PSoC Creator 配置 DMA。
www.cypress.com
文档编号:001-93054 版本*A
5
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
DMA 组件的硬件连接
DMA 组件概述
图 4 显示了 PSoC Creator 的 DMA 通道组件。可以在
Component(组件)目录中的 Systems(系统)选项卡中
找到该组件。
您可以在“组件配置”窗口上设置以下参数,如图 5 显示。
图 5. DMA 组件配置
图 4. DMA 通道组件
可选
终端
使用 DMA 通道组件和一个相关的 API 进行配置 DMA 以传
输数据。
硬件请求(drq):该设置可定义用于触发 DMA 通道的信
号类型(上升沿/电平)。除“禁用”外,该参数的其他选
项会将 drq 终端添加到组件内。可以将 drq 连接至任何硬件
信号,以触发 DMA 通道。
如果不存在 drq 终端,那么只有 CPU 会触发 DMA 数据操
作。
该参数被设置为“派生”(derived)时,DMA 触发类型
(边沿/电平)由 DMA 触发源决定。更多信息,请参考
DMA 组件数据手册。
硬件终端( trq ): 当该选项被设置为真(true)时,其他
输入终端(trq)将显示在组件中。如果使能了 TD 终止,则
该终端上的上升沿将停止正在运行的 DMA 数据操作。请注
意:仅当一个 DMA 突发数据操作正在运行时,trq 才会终
止 TD 链。有关详细信息,请参考“组件数据手册”中的内
容。
传输完成(nrq):为了指出 DMA 传输已经完成,当完成
传输时,可以配置 TD 以便在 DMA 通道的 NRQ 终端上创
建一个宽度为 2 个总线时钟的脉冲。可以将 nrq 终端连接至
一个中断或者其他组件以便执行其他操作。
设置 TD 属性以确定是否在 nrq 终端上生成一个信号,以及
是否用 trq 来允许 TD 终止。
www.cypress.com
文档编号:001-93054 版本*A
6
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
DMA 的固件配置
在编译项目过程中,DMA 组件为每个 DMA 实例生成一个源文件和相应的头文件。例如,如果在您的设计中 DMA 组件实例的名
称为“DMA_1”,则在编译过程中,将创建 DMA_1_dma.c 和 DMA_1_dma.h 文件。这些文件包含了用于初始化 DMA 通道的
“DmaInitialize”API。Generated Source 文件夹中的 CyDmac.c 和 CyDmac.h 文件包含了其他通道和 TD 配置功能。
按照下述步骤进行配置 DMA 的固件:
1.
启动 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.
设置通道的初始 TD。
CyDmaChSetInitialTd(Channel_Handle, TD_Handle)
6.
启用 DMA 通道
CyDmaChEnable(Channel_Handle, preserve_TD)
有关固件配置步骤的详细信息,请参考第 19 页上的附录 A:DMA 配置步骤。可以使用 DMA 向导自动生成代码,以配置 DMA
通道;有关详细信息,请参考第 21 页上的附录 B:DMA 向导配置。
请注意:DMA 向导仅在有限的 PSoC 外设集中支持 DMA 数据操作。如果 DMA 向导不支持外设,您需要使用附录 A 所详细描
述的函数来手动配置 DMA。
下面是一组(四个)示例,通过它们详细描述了如何在存储器和外设之间进行 DMA 传输。第五个示例介绍的是如何构建多 TD
链。
www.cypress.com
文档编号:001-93054 版本*A
7
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 1:外设至外设的传输
该示例介绍了如何使用 DMA 在各外设之间进行简单传输,具体内容是从 ADC 数据输出寄存器传输到 DAC 数据输入寄存器,如
图 6 显示。
图 6. 框图,外设至外设的传输
Source – ADC
Destination – DAC
DMA Channel
ADC
1 Byte
Read
Write
1Byte
DAC
EoC
DMA
Request
(DRQ)
TD
Pointer
DMA
Done
(NRQ)
TD[0]
Source
Destination
Transfer
Count
Next TD
TD Property: None
如图 7 显示,配置 ADC 使其在 8 位单端模式下运行,以符
合 VDAC 的数据格式(其格式为单端 8 位电压 DAC)的要
求 。 DMA 通 道 的 硬 件 请 求( DRQ ) 被 使 能 , 并 连 接 至
ADC EoC 信号,以便在 ADC 结果可用时,ADC 可以发出
数据传输的请求。
收到请求后,DMA 通道从 ADC 输出寄存器读取一个数据
字节,并将其写入到 DAC 数据寄存器内。
图 7. 顶层设计,外设至外设的传输
www.cypress.com
文档编号:001-93054 版本*A
8
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 1:DMA 配置
表 2 和表 4 分别显示的是关于该项目的 DMA 通道和 TD 配
置。
表 2. 通道配置设置
表 4. TD[0]配置设置
参数
参数
项目设置
低位源地址
高位源地址
HI16(CYDEV_PERIPH_BASE)
高位目标地址
HI16(CYDEV_PERIPH_BASE)
突发计数
1(一个字节)
每次突发请求
1(真)
初始 TD
TD[0]
保留 TD
1(真)
项目设置
LO16
(ADC_Delsig_DEC_OUTSAMP_PTR)
低位目标地址
LO16(VDAC8_DATA_PTR)
传输计数
1(一个字节)
TD 的属性
无(0)
下一个 TD
TD[0](回送相同的 TD)
LO16 宏返回 32 位数值的低 16 位。
对于源地址和目标地址,通道配置都具有 32 位地址中的高
16 位。
CYDEV_PERIPH_BASE(属于 PSoC Creator 自动生成的
cydevice.h 文件)确定了所有 PSoC 外设的基本地址,包
括 ADC 和 DAC。
HI16 是一个 PSoC Creator 宏,它会返回 32 位数值的高 16
位。使用该宏可获取源地址和目标地址的高 16 位数值。
作为一种替代方法,您可以分配有关组件寄存器的高位源地
址和高位目标地址,如表 3 所示。可以在 ADC_DelSig.h 和
VDAC8.h 组件文件中分别找到地址定义。
表 3. 代替高地址
参数
可以将 TD 视为链接 TD 的数组;这样我们仅需要一个元素
数组 TD[0]。
对于每个 DMA 请求,DMA 通道都要传输一个字节,因此
突发计数被设置为 1 字节,并将每次突发的请求设置为真。
所执行的下一个 TD 被设置为相同的 TD(回送),因此在
每 DMA 请求中,重复同样的数据操作。保留 TD 的参数被
设置为真。
示例 1:项目文件
AN52705.zip 文 件 ( 本 应 用 笔 记 随 附 的 ) 中 的
Eg1_ADC_DMA_DAC 项目演示了该示例。请参考附录 D:
示例项目 — 测试设置,了解如何测试该项目。
下述内容显示的是该示例的 DMA 配置代码请参考附录 B:
DMA 向导配置,了解如何通过使用 DMA 向导生成该配置
代码。
项目设置
高位源地址
HI16(ADC_Delsig_DEC_OUTSAMP_PTR)
高位目标地址
HI16(VDAC8_DATA_PTR)
www.cypress.com
文档编号:001-93054 版本*A
9
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 1:DMA 配置代码
/* Define for DMA Configuration */
#define DMA_BYTES_PER_BURST
1
#define DMA_REQUEST_PER_BURST 1
#define DMA_SRC_BASE (CYDEV_PERIPH_BASE)
#define DMA_DST_BASE (CYDEV_PERIPH_BASE)
/* Variable declarations for the
* DMA_Chan is used to store the
uint8 DMA_Chan;
/* DMA_TD array is used to store
* Since there is only one TD in
uint8 DMA_TD[1];
DMA channel.
DMA channel */
all of the TDs associated with the channel
this example, DMA_TD array contains only one element */
/* DMA Configuration steps */
/* Step 1 */
/* DMA Initializations done for both the DMA Channels
* Burst count = 1, (8 bit data transferred to VDAC one at a time)
* Request per burst = 1 (transfer burst only on new request)
* High byte of source address = Upper 16 bits of ADC data register
* High byte of destination address = Upper bytes of the VDAC8 data register
* DMA_Chan holds the channel handle returned by the ‘DmaInitialize’ function. This is
* used for all further references of the channel */
DMA_Chan = DMA_DmaInitialize(DMA_BYTES_PER_BURST, DMA_REQUEST_PER_BURST,
HI16(DMA_SRC_BASE), HI16(DMA_DST_BASE));
/* Step 2 */
/* Allocate TD for DMA Channel
* DMA_TD[0] is a variable that holds the TD handle returned by the TD allocate function.
* This is used for all further references of the TD */
DMA_TD[0] = CyDmaTdAllocate();
/* Step 3 */
/* Configure TD[0]
* Transfer count = 1 (total number of bytes to transfer from the ADC to DAC)
* Next Td = DMA_TD[0]. The same td has to repeat itself for every ADC EoC.
* Configuration = No special TD configurations required */
CyDmaTdSetConfiguration(DMA_TD[0], 1, DMA_TD[0], 0);
/* Step 4 */
/* Configure the td addres
* Source address = Lower 16 bits of ADC data register
* Destination address = Lower 16 bits of VDAC8 data register */
CyDmaTdSetAddress(DMA_TD[0], LO16((uint32)ADC_DelSig_DEC_SAMP_PTR),
LO16((uint32)VDAC8_Data_PTR));
/* Step 5 */
/* Map the TD to the DMA Channel */
CyDmaChSetInitialTd(DMA_Chan, DMA_TD[0]);
/* Step 6 */
/* Enable the channel
* The Channel is enabled with Preserve TD parameter set to 1. This preserves the
* original TD configuration and reload it after the transfer is complete so that the TD
* can be repeated */
CyDmaChEnable(DMA_Chan, 1);
www.cypress.com
文档编号:001-93054 版本*A
10
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 2:外设至存储器的传输
该示例显示的是如何执行从 ADC 数据输出寄存器到 16 位存储器阵列的外设至存储器的传输,如图 8 所示。
图 8. 框图,外设至存储器的传输
目标地址:RAM缓冲区
(adc_sampleArray)
16位
源地址:ADC
样本1
1
突发
发
突 2
DMA通道
ADC
2个字节
样本2
写
读
...
EoC
突
DMA
请求
DMA
完成
(DRQ) (NRQ)
递增目标地
址
...
发
‘
N’
….
中断
(ISR)
样本‘N’
DMA数据操作
完成
TD指针
TD[0]
源地址
目标地址
传输计数
下一个TD
DMA_DISABLE_TD
TD属性:递增目标地址,
:生成传输完成的信号
图 9 显示的是项目的顶层设计。每次按下 Pin_Switch,
ISR_Switch 便被触发,并且在 isr 上设置一个标志以便使能
DMA 通道。一旦 DMA 通道被使能,ADC 的 EoC 信号将激
活 DMA 通道请求。
每个 DMA 请求中,DMA 从源地址(ADC 输出寄存器)提
取 2 个字节,并将其写入目标 RAM 缓冲器,并且目标地址
的值增加 2。每次突发传输后,传输计数将减去 2。重复进
行该操作,直到传输计数为 0,这时会在 DMA 组件的 NRQ
终端上生成“传输结束”信号(其激活 ISR_DMA_Done 中
断)。
在中断服务子程序中,设置标志以指出数据操作已经完成。
数据操作完成时 DMA 通道被禁用,再次按下开关时它重新
被使能。
图 9. 顶层设计,外设至存储器的传输
www.cypress.com
文档编号:001-93054 版本*A
11
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
表 6. TD[0]配置设置
示例 2:DMA 配置
表 5 和表 6 分别显示的是关于该项目的 DMA 通道和 TD 配
置。
表 5. 通道配置设置
参数
参数
项目设置
低位源地址
LO16(ADC_Delsig_DEC_OUTSAMP_PTR)
低位目标地址
LO16(&adc_sampleArray)
项目设置
传输计数
200 x 2
(样本数量 × 每个样本的字节数量)
高位源地址
HI16(CYDEV_PERIPH_BASE)
高位目标地址
HI16(CYDEV_SRAM_BASE)
突发计数
2(两个字节)
每次突发请求
1(真)
初始 TD
TD[0]
(TD_INC_DST_PTR |
DMA__TD_TERMOUT_EN |
保留 TD
1(真)
TD_SWAP_EN)
递增目标地址,
生成 DMA 完成事件,
TD 的属性
下一个 TD
对于源地址和目标地址,通道配置都具有 32 位地址中的高
16 位。源地址与示例 1 中所示的相同。
CYDEV_SRAM_BASE(属于 PSoC Creator 自动生成的
cydevice.h 文件)确定了 SRAM 基本地址。与 HI16 宏一起
使用,以指出目标地址的高 16 位数值。
如果使用另一种代替方法,可以同时使用 RAM 阵列指针和
HI16 宏,以便指出 PSoC 5LP 源地址的高 16 位,但不适
用于 PSoC 3。这是因为在 PSoC 3 中 RAM 变量地址的高
16 位为零,但 Keil 编译器会将 Keil 指定信息存储在变量地
址 的 高 16 位 中 。 因 此 , HI16 ( &adc_sampleArray 与
PSoC3 — Keil 编译器一起使用时,将返回错误地址。
该示例中,每个 DMA 请求都要将 2 字节 ADC 结果从 ADC
传输到 RAM 阵列,并将突发计数设置为 2,将每次突发请
求设置为真。
保留 TD 被设置为 1(TRUE),使原始的 TD 设置(即源
地址、目标地址和传输计数)得以保留,且能够重复数据操
作。
源 地 址 和 目 标 地 址 的 低 16 位 数 据 由 数 据 操 作 描 述 符
(TD[0])配置指定,如表 5 所示。
www.cypress.com
只有 PSoC 3 需要交换使能。
DMA_DISABLE_TD
传输计数被设置为‘400’,它是被缓冲的样本数量和每个
采样字节数值的乘积。
设置 TD 属性,以便在每次突发传输后递增目标地址,并且
指定的样本数量被缓冲时,将生成“传输结束”信号。在
PSoC 3 项目中,也会配置 TD,以便在数据从 ADC 传输到
存储器时可以 交换字节(如 “ TD 属性 ”一节 所示)。
PSoC Creator 自动生成的 CyDmac.h 文件定义了与每个
TD 属性相应的位。将所需属性的位字段进行“或”运算以
设置 TD 属性的值。
为了在缓冲样本的指定数量后停止 DMA 传输,需要将
TD[0]连接至用于禁用 DMA 通道的
‘DMA_DISABLE_TD’。
示例 2:项目文件
AN52705.zip 文 件 ( 本 应 用 笔 记 随 附 的 ) 中 的
Eg2_ADC_DMA_Mem 项目演示了该示例。该示例的 DMA
配置代码类似于示例 1 所展示的。通道和上述 TD 配置表已
经显示了传递给函数的各个参数。请参考附录 D:示例项目
— 测试设置,了解如何测试该项目。
文档编号:001-93054 版本*A
12
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 3:存储器至外设的传输
该示例介绍了存储器至外设的传输如何使用 DMA。该示例演示了如何通过使用 DAC 生成方波,如图 10 所示。
图 10. 框图,存储器至外设的传输
源地址 : 存储器查询表
8位
目标地址 : DAC
递增
源地址
位置 1
突发1
位置 2
突发 2
DMA 通道
读
...
写
1 字节
DAC
...
….
突发 N
位置‘N’
DMA
请求
(DRQ)
DMA 触发时钟
DMA
完成
(NRQ )
TD 指针
TD[ 0]
源地址
TD 属性
具有 128 点的正弦查询表被存储在闪存存储器中。通过使
用 DMA 将这些值依次发送到 DAC 来创建正弦波。图 11 显
示的是项目的顶层设计。
使用时钟组件来定期生成 DMA 请求(drq)。收到请求时,
DMA 通道会从查询表读取一个数据字节,并将它写入 DAC
目标地址
传输
计数
下一个 TD
返回到
相同的 TD
: 递增源地址
数据寄存器。每次突发传输后,源地址的值增加 1,传输计
数的值减 1。持续该情况,直到表中所有值被发送到 DAC。
传输结束时,保留和重新加载 TD 配置,以便生成一个连续
正弦波。正弦波的频率等于 DMA 触发时钟频率除以查询表
中的点数所得到的结果。
图 11. 顶层设计,存储器至外设的传输
www.cypress.com
文档编号:001-93054 版本*A
13
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 3:DMA 配置
表 7 和表 8 分别显示的是关于该项目的 DMA 通道和 TD 配
置。
表 7. 通道配置
使用表 8 所示的 LO16 宏来设置源地址和目标地址的低 16
位。
表 8. TD[0]配置
参数
参数
项目设置
项目设置
低位源地址
LO16(&sineTable)
PSoC 3 的 HI16(CYDEV_FLS_BASE)
低位目标地址
LO16(VDAC8_DATA_PTR)
PSoC 5LP 的 HI16(&sineTable)
传输计数
128(在正弦波查询表中的字节数量)
高位目标地址
HI16(CYDEV_PERIPH_BASE)
TD 属性
递增源地址(TD_INC_SRC_ADR)
突发计数
1(一个字节)
下一个 TD
TD[0] — 重新回送同样的 TD
每次突发请求
1(真)
传输计数被设为正弦波查询表中的总字节数量。
初始 TD
TD[0]
保留 TD
1(真)
每次突发传输后,都会对 TD 进行配置,以便递增源地址
(即查询表指针)。
高位源地址
DMA 传输的源是保持在闪存存储器中的 sineTable 阵列。
HI16(&sineTable)设置了 PSoC 5LP 源地址的高 16 位,而
HI16(CYDEV_FLS_BASE)被用于识别 PSoC 3 源地址的高
16 位(前面的示例已提到原因)。
对于每一个 DMA 请求,DMA 通道需要将一个字节从查询
表阵列传输到 DAC。因此,突发计数被设置为 1 字节,并
且每次突发请求被设置为真。
原始的 TD 配置被保留,以便重新使用。
www.cypress.com
传输结束后,将在 DAC 输出上生成一个完整周期的正弦波
形。TD 被保留并回环给自己,以便生成连续的波形。
示例 3:项目文件
AN52705.zip 文件(本应用笔记随附的)上的
Eg3_Mem_DMA_DAC 项目演示的是该示例。该示例的
DMA 配置代码类似于示例 1 所展示的。通道和上述 TD 配
置表已经显示了传递到函数的各个参数。请参考第 24 页上
的附录 D:示例项目 — 测试设置,了解如何测试该项目。
文档编号:001-93054 版本*A
14
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 4:存储器至存储器的传输
该示例显示了如何使用 DMA 执行存储器至存储器的传输。它还演示了如何使用 CPU 来触发 DMA。在该示例中,CPU 请求时,
8 字节闪存阵列被复制到 8 字节的 RAM 阵列中,如图 12 所示。
图 12. 框图,存储器至存储器的传输
源地址 — 8位闪存阵列
目标地址 — 8位RAM阵列
8位
8位
DMA通道
1字节
源阵列[0]
1字节
源阵列[1]
递增源地址
读
目标阵列[0]
目标阵列[1]
写
...
递增目标地址
...
...
….
…
…
...
…
…
….
源阵列[N-1]
目标阵列[N-1]
CPU请求
DMA数据传输完成
DMA 完成
(NRQ)
DMA请求
中断
(ISR)
TD指针
TD[0]
So源地址
urce
目标地址
传输计数
下一个TD
DMA_DISABLE_TD
TD属性:递增源地址,
:递增目标地址,
:生成传输完成的信号
图 13 显示的是项目的顶层设计。使用
CyDmaChSetRequest 函数,以便在器件上电大约一秒后
激活 DMA 传输。
传输完成时,将在 DMA 的 nrq 信号终端生成一个脉冲。这
样会激活 ISR_DMADone 中断,以设置标志来指出传输已
经完成。然后,在 LCD 上会显示新的 RAM 内容。
当收到 CPU 的请求时,DMA 将 8 字节数据从闪存阵列传
输到 RAM 阵列(如通道和 TD 配置寄存器所配置的)。执
行传输时,TD 源地址和目标地址的值被递增。
图 13. 顶层设计:存储器至存储器的传输
www.cypress.com
文档编号:001-93054 版本*A
15
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
表 10. TD[0]配置
示例 4:DMA 配置
表 9 和表 10 分别显示的是关于该项目的 DMA 通道和 TD
配置。
表 9. 通道配置
参数
高位源地址
项目设置
LO16(&sourceArray)
目标地址
LO16(&destinationArray)
传输计数
8(字节)
递增源地址
PSoC 5LP 的 HI16(&sourceArray)
HI16(CYDEV_SRAM_BASE)
突发计数
1(一个字节)
每次突发请求
0(假)
初始 TD
TD[0]
保留 TD
0(假)
项目设置
源地址
PSoC 3 的 HI16(CYDEV_FLS_BASE)
高位目标地址
递增目标地址
TD 的属性
生成“DMA 完成”信号
(TD_INC_SRC_ADR | TD_INC_DST_ADR
| DMA__TD_TERMOUT_EN)
下一个 TD
DMA_DISABLE_TD(0xFE)
对于 TD 配置,源地址和目标地址的低 16 位由 LO16 宏识
别。
DMA 传 输 的 源 地 址 是 闪 存 存 储 器 所 定 义 的
‘ sourceArrray ’ 。 其 目 标 地 址 是 RAM 的
‘destinationArray’。在 PSoC 5LP 和 PSoC 3 上,闪存
中源地址的高 16 位分别被设置为 HI16(&sourceArray)和
HI16(CYDEV_FLS_BASE),如上述示例所示。同样,使用
宏 HI16(CYDEV_SRAM_BASE)来设置 SRAM 中目标地
址的高 16 位。
突发计数被设置为 1 字节,以便 DMA 从闪存上读取每个字
节,并将它们写到 RAM 阵列。您可以将突发计数设置为 8
个字节,以提高数据传输的速度。但是,平常您应该将突发
计数设置为低数值,以便其他 DMA 通道共用轮辐。
每次突发请求的参数被设置为“假”,以便使每一个突发传
输不再需要单独的请求。
www.cypress.com
参数
传输计数被设置为 8,以便将共计 8 个字节数据从源地址传
输到目标地址。
每次突发传输后,都要配置 TD,以便递增源地址(即闪存
阵列指针)和目标地址(即 RAM 阵列指针)。从闪存中将
所有 8 个字节传输到 RAM 阵列后,将对 TD 进行配置,以
在 nrq 线路上生成 termout 脉冲。该脉冲用于触发 ISR,以
指出传输已经完成。传输完成后,下一个 TD 将被设置为
DMA_DISABLE_TD(0xFE)以禁用 DMA 通道。
因为数据操作仅发生一次,所以无需保留 TD 配置。
示例 4:项目文件
AN52705.zip 文件(本应用笔记随附的)的
Eg4_Mem_DMA_Mem 项目演示了该示例。该示例的 DMA
配置代码类似于示例 1 所展示的。通道和上述 TD 配置表已
经显示了传递到函数的各个参数。请参考附录 D:示例项目
— 测试设置以详细了解如何测试该项目。
文档编号:001-93054 版本*A
16
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 5:TD 链路
该示例显示了如何使用多 TD 和一个通道,并将各 TD 互相
链接起来。在该示例中,通过使用单 DMA 通道和两个 TD,
ADC 数据依次被发送到两个单独的 RAM 缓冲器内。
通过使用两个单独的数据操作描述符(TD[0]和 TD[1])配
置这两个数据操作,并且使用 DMA 的 TD 链路特性将这两
个数据操作互相链接起来,如图 14 显示。
配置 DMA 通道以执行下面两个数据操作:


第一个数据操作:ADC 至 RAM 缓冲器 1
第二个数据操作:ADC 至 RAM 缓冲器 2
图 14. 框图,TD 链路
目标地址1:RAM缓冲区1
16位
样本1
样本2
1
发
2
突 突发
源地址:ADC
...
...
DMA通道
….
ADC
2个字节
写
读
突发N1
突发
(N
1+1
EoC
样本N1
)
TD1àTD0
递增目标
地址
样本1
发
(
N1
样本 2
2
+N
)
中断
(ISR)
TD0àTD1
16位
突
DMA
DMA
完成
请求
(DRQ)(NRQ)
目标地址2:RAM
缓冲区2
...
...
….
TD指针
DMA数据操作完成信号
样本N2
TD[1]
TD[0]
Source
目标地址
传输计数
TD0属性:递增目标地址
下一个TD
源地址
目标地址
传输计数
下一个TD
TD1属性:递增目标地址,
:生成传输完成信号
可以使用这种 TD 配置形式来克服单一 TD 最大传输计数的限制(对于每一个 DMA 通道,它被限制为 4096 个字节)。注意:对
于链路上的所有 TD,源地址和目标地址的高 16 位必须相同。
项目的顶层设计类似于示例 2 所示的内容。
www.cypress.com
文档编号:001-93054 版本*A
17
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
表 13. TD[1]配置
示例 5:DMA 配置
表 11、表 12 和表 13 分别显示的是关于该项目的通道
和 TD 配置。
低位源地址
表 11. 通道配置
参数
低位目标地址
设置
高位源地址
HI16(CYDEV_PERIPH_BASE)
高位目标地址
HI16(CYDEV_SRAM_BASE)
突发计数
2(两个字节)
每次突发请求
1(真)
初始 TD
TD[0]
保留 TD
1(真)
低位目标地址
传输计数
项目设置
LO16
(ADC_Delsig_DEC_OUTSAMP_PTR)
LO16(adc_sampleArray1)
N1×2
(样本数量 × 每个样本的字节数量)
生成“DMA 完成”事件:
DMA__TD_TERMOUT_EN
PSoC 3 所需的交换被使能:
TD_SWAP_EN
下一个 TD
TD[1]
LO16
(ADC_Delsig_DEC_OUTSAMP_PTR)
LO16(adc_sampleArray2)
N2×2
(样本数量 × 每个样本的字节数)
递增目标地址:TD_INC_DST_ADR
下一个 TD
递增目标地址:TD_INC_DST_ADR
TD 的属性
项目设置
生成“DMA 完成”事件:
DMA__TD_TERMOUT_EN
PSoC 3 所需的交换被使能:
TD_SWAP_EN
表 12. TD[0]配置
参数
传输计数
TD 的属性
通道和 TD 配置与示例 2 的相同。TD[0]的下一个 TD
参数被设置为 TD[1](反之亦然)以便链接各个数据操
作。
低位源地址
参数
TD[0]
示例 5:项目文件
AN52705.zip 文 件 ( 本 应 用 笔 记 随 附 的 ) 的
Eg5_TD_Chaining 演示了该示例。该示例的 DMA 配
置代码类似于示例 1 所展示的。通道和上面的 TD 配置
表已经显示了传递到函数的各个参数。请参考第 24 页
上的附录 D:示例项目 — 测试设置,了解如何测试该
项目。
总结
应用笔记对 PSoC 3 和 PSoC 5LP 的 DMA 控制器进行
描述。通过使用简单的 PSoC Creator 示例项目,应用
笔记还显示了对不同数据传输类型如何进行 DMA 的配
置。 更多高级信息,请参考 PSoC 3 和 PSoC 5LP 技
术参考手册和 PSoC Creator DMA 组件数据手册。
关于作者
姓名:Anu M D
职衔:高级应用工程师
背景:获得柯钦市模范工程学院(Model Engineering
College)的电子通信学学士学位。
联系方式:[email protected]
www.cypress.com
文档编号:001-93054 版本*A
18
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
附录 A:DMA 配置步骤
第一步:DMA 通道初始化
第二步:TD 分配
Channel_Handle = DMA_DmaInitialize(
DMA_BYTES_PER_BURST,
DMA_REQUEST_PER_BURST,
HI16(Source Address),
HI16(Destination Address))
TD_Handle = CyDmaTdAllocate();
API 函数 DmaInitialize()对以下几个 DMA 通道参数进
行配置:

DMA_BYTES_PER_BURST:由 DMA 通道在一
个突发中所读取和写入的字节数量。
例如,如果您要定义 DMA 来收集 8 位 ADC 数据,
将该参数设置为 1,因为 DMA 通道每次发送请求
时都要将 1 字节从源地址传输到目标地址。或者,
如果您要收集 16 位 ADC 数据,请将该参数设置
为 2。

DMA_REQUEST_PER_BURST : 每 次 突 发 是 否
必须单独请求。
如果将其设置为 1,则必须单独请求每次突发传输。
如果将其设置为 0,则第一个突发后自动执行所有
后续突发,不需要单独请求。(只有第一个突发传
输具有 DMA 请求。)

HI16(源地址): 源地址的高 16 位。HI16 是由
PSoC Creator 所创建的宏,以指定 32 位值或 32
位地址的高 16 位。

HI16(目标地址):目标地址的高 16 位。在
PSoC 3 中,使用上表所提供的宏来识别源地址和
目标地址的高 16 位。
PSoC 3Keil 编译器将 Keil 指定信息存储于变量地
址的高 16 位。因此,使用表 14 所显示的常量。
在 CyDevice.h 文件中对它们和 HI16 宏进行了定
义,以便配置 PSoC 3 的源地址或目标地址高 16
位(DMA 传输的源地址和目标地址是 RAM 或闪
存存储器时)
API 函数 CyDmaTdAllocate()创建 TD 的实例,并将句
柄返回到原来那个 TD。其他 API 使用 TD 句柄配置
TD。多次调用函数以创建多个 TD。
第三步:TD 配置
CyDmaTdSetConfiguration(TD_Handle,
Transfer_Count,
Next_TD,
TD_Property);
API 函数 CyDmaTdSetConfiguration()通过使用以下参
数配置 TD:

TD_Handle:CyDmaTdAllocate()函数先前返回的
句柄

Transfer_Count : 从源地址传输到目标地址的字
节总数。

Next_TD:TD 链中下一个 TD 索引。如果它是链
中 最 后 一 个 TD , 则 TD 传 输 成 功 后 , 将 使 用
DMA_DISABLE_TD 宏(0xFE)来禁用 DMA 通
道。

TD_Property:使用第 20 页上表 15 中显示的 TD
配置寄存器标志进行设置 DMA 数据操作的属性。
对标志进行“或”运算,这样能够配置 TD 属性。
比如,在数据传输过程中,为了配置 TD 以交换 4
个字节,请使用:
(TD_SWAP_EN | TD_SWAP_SIZE4)
表 14. 高 16 位地址宏
源
DMA_SRC_BASE
外设
CYDEV_PERIPH_BASE
RAM
CYDEV_SRAM_BASE
闪存
CYDEV_FLS_BASE
www.cypress.com
文档编号:001-93054 版本*A
19
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
表 15. TD 的属性
配置标志
函数
TD_SWAP_EN
执行字节序交换;当将数据从源地址传输到目标地址时,将交换字节。
TD_SWAP_SIZE4
将交换大小设置为 4 个字节。交换大小的默认值为 2 个字节。
TD_AUTO_EXEC_NEXT
完成当前 TD 后,链中的下一个 TD 会自动被激活。
TD_TERMIN_EN
如果 trq 输入线上产生一个上升沿,则结束该 TD。在一次突发过程中必须发生上升沿。只有
这时 DMAC 才会对其进行侦听。
DMA__TD_TERMOUT_EN
如果使用该标志,TD 传输完成时,将在 nrq 线上生成一个脉冲。该标志是 DMA 组件实例的
特例,并由组件实例头文件定义。比如,在顶层设计中,如果 DMA 组件实例名称是
DMA_1,则实例的 termout 宏是包含在 DMA_1_dma.h.内的
‘DMA_1__TD_TERMOUT_EN’。
TD_INC_DST_ADR
根据突发中每个数据操作的大小而定的目标地址增量。
TD_INC_SRC_ADR
根据突发中每个数据操作的大小而定的源地址增量。
第四步:配置 TD 源地址和目标地址
第五步:将 TD 连接到通道
CyDmaTdSetAddress(TD_Handle,
LO16(source),
LO16(destination))
CyDmaChSetInitialTd(Channel_Handle,
TD_Handle)
API 函数 CyDmaTdSetAddress()通过使用以下函数设
置 TD 的源地址和目标地址:

TD_Handle : 由 CyDmaTdAllocate()函数先前返
回的句柄


LO16(source):源地址的低 16 位
API 函数 CyDmaChSetInitialTD()设置 DMA 通道的第
一个 TD:

Channel_Handle:DMA_DmaInitialize()函数返回
的 DMA 实例句柄

TD_Handle:CyDmaTdAllocate()函数先前返回的
句柄
LO16(destination):目标地址的低 16 位
PSoC 是高度可编程器件,许多组件由可编程数字和模
拟模块创建,并且外设的物理位置可根据设计制定。因
此,传统的寄存器映射无法列出所有源地址和目标地址。
但在编译过程中,每组件的寄存器均由 PSoC Creator
所生成的组件 API 头文件定义。您应该查看这些头文
件,以识别组件的寄存器地址。
www.cypress.com
第六步:使能 DMA 通道
CyDmaChEnable(Channel_Handle,
Preserve_TD)
API 函数 CyDmaChEnable()使能 DMA 通道:

Channel_Handle:DMA_DmaInitialize()函数返回
的 DMA 实例句柄

Preserve_TD:如果为真(TRUE),则 DMA 通
道将保留 TD 配置(源、目标以及传输计数),从
而能够重复 TD
文档编号:001-93054 版本*A
20
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
其他重要的 DMA API 函数
为通过 CPU 请求激活 DMA 通道,需要使用以下函数:
CyDmaChSetRequest(Channel_Handle, CPU_REQ);
为了禁用 DMA 通道,需要使用以下函数:
CyDmaChDisable(Channel_Handle);
附录 B:DMA 向导配置
可能作为附录 A 所描述各步骤的代替方法,通过 DMA
向导,对 DMA 通道和 TD 的固件配置进行定义变得非
常容易。但是,该向导仅支持某些外设(如 DMA 源地
址或目标地址)。如果某个外设不受支持,请按照附录
A 中所描述的配置步骤执行。
第二步:选择全局设置
选择 DMA 传输全局设置,如图 16 显示:
图 16. 全局设置
为了启动 DMA 向导,跳转至 PSoC Creator > Tools
> DMA Wizard。
第一步:选择 DMA 通道(DMA 组件实例)
选择需要配置的 DMA 通道,如图 15 显示:
图 15. 选择 DMA 通道
在该对话框内选择 DMA 通道配置参数:
DMA 组件实例名
称
根据下面的内容选择对话框参数:


Project(项目):PSoC Creator 项目的名称
DMA:项目的 DMA 组件实例名称
该操作完成后,请点击 Next。
Source (源)和 Destination (目标): 源地址和目
标地址的高 16 位
Bytes per Burst(每突发的字节):在单一的突发中
所传输的字节数量
Each Burst Requires a Request(每突发需要一个请
求):每个突发是否需要单独的请求
Number of TDs(TD 数量):有关 DMA 通道的数据
操作描述符数量(1 至 128)。
Single Chain(单链接)或 Loop(循环):该函数为
链中最后 TD 确定的‘下一个 TD’。如果是单链接,
则下一个 TD 为 DMA_DISABLE_TD(0xFE)。如果
是循环,它是第一个 TD。
该操作完成后,请点击 Next。
www.cypress.com
文档编号:001-93054 版本*A
21
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
第三步:定义通道的数据传输描述符。
选择 DMA 传输全局设置,如图 17 显示。表 16 介绍了每个 TD 配置参数。
图 17. 添加数据操作描述符
表 16. TD 配置详细信息
字段
说明
TD#
显示了数据操作描述符的逻辑编号。
Endian
允许按 2 或 4 字节的 Endian 字节进行交换。当数据从源地址传输到目标地址时,该字段会交换字节。必须将
每个突发字节设置为 Endian 选择的整数倍。由于字节序存在差异,所以通常将该字段用在 PSoC 3 存储器与
外设之间的 DMA 传输。
Term In
允许在 TERMIN(trq)信号的上升沿上结束 TD 数据传输。
Term Out
当 TD 完成时,允许创建 TERMOUT(nrq)信号。
Length
该字段指定了 TD 的传输计数(单位为字节,从 0 至 4095)。这是 DMA 需要传输的字节总数,以完成数据传
输。
Source
DMA 传输所需要的低 16 位源地址。如果选定的源地址是一个组件(而不是存储器),则 DMA 向导将提供源
地址的下拉列表。您可以手动编辑或进入源地址。
Inc (Source)
当 DMA 执行数据传输时,允许增加源地址。如果该字段被使能,则每次 DMA 读取源中的数据,源地址会以
DMA 所读取的字节数量递增。DMA 增加源地址,直到整个数据操作(传输计数)完成为止。
Destination
DMA 传输所需的低 16 位源地址。如果选定的目标地址是一个组件(而不是存储器),则 DMA 向导会提供目
标地址的下拉列表。此外,您还可以手动编辑或进入目标地址。
Inc(Destination)
当 DMA 执行数据传输时,允许增加目标地址。DMA 增加目标地址,直到整个数据操作(传输计数)完成为
止。
Auto Next
自动执行下一个 TD,无需其他 DMA 请求。
Next TD
在 TD 链中的下一个逻辑 TD。如果该 TD 链结束于这个 TD,请将该字段设置为 END。
该操作完成后,请点击 Next。然后会生成所需的代码。
www.cypress.com
文档编号:001-93054 版本*A
22
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
图 18. 生成代码
第四步:复制 DMA 向导所创建的代码
完成 DMA 通道和 TD 的配置后,向导将为 DMA 通道创建
代码。该代码包含 DMA 通道和 TD 的配置,代码在“DMA
向导”对话框的窗口中生成,如图 18 显示。要使用代码,
请选择窗口内的所有内容,然后复制它们,并将这些内容粘
贴在 main.c 中。
有关向导的详细信息,请参考 PSoC Creator 帮助文件。
附录 C:设置 DMA 通道的优先级
当激活多个 DMA 通道请求时,根据通道优先级设置,DMA 通道由 DMAC 处理。可以将某个 DMA 通道分配为八个不同优先级
中的某一级。在 PSoC Creator 窗口中设计范围资源(*.cydwr) > DMA 选项卡下可以设置 DMA 通道的优先级,如图 19 显示。
图 19. 设置 DMA 通道的优先级
当 CPU 和 DMAC 同时请求访问 PHUB 上的同一个轮辐时,默认为 CPU 的优先级。PHUB 管理着 DMA 和 CPU 间、各个 DMA
通道间的仲裁。 有关更多信息,请参考《PSoC® 3、PSoC® 5LP 架构 TRM》。
www.cypress.com
文档编号:001-93054 版本*A
23
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
附录 D:示例项目 — 测试设置
示例 1:外设至外设的传输 — Eg1_ADC_DMA_DAC
在该示例项目中,ADC 采样频率(fs)为 384 kHz。如果输入的频率不大于~84 kHz,则最好重建输出,因为 delta sigma ADC
有低通特性(频率为 0.22 fs 时信号会消减-3dB)。按照以下步骤可实现测试设置:
1.
将功能生成器和输入分别连接到 P0[2]引脚和 ADC。
2.
设置功能生成器以使正弦波的频率为 100 Hz。
3.
将示波器探头分别连接至 P0[0]引脚和 VDAC 输出。
4.
编译项目并编程器件。
5.
从示波器上的引脚 P0[0]查看输出。输出端是一个频率为 100 Hz 的正弦波,与输入端相同。
示例 2:外设至存储器的传输 — Eg2_ADC_DMA_Mem
按照以下步骤可实现测试设置:
1.
将输入信号和输入分别连接到 P0[2]引脚和 ADC。确保输入电压位于 ADC 范围内(从 VSSA 至 2.048 V)。
2.
将 P6[1]连接至 DVK 上的开关(SW1)。
3.
编译项目。
4.
按 F5 或点击调试图标,如图 20 显示,以下载该程序并开始调试。
图 20. 调试按键
5.
将 adc_sampleArray 作为观看变量,如图 21 显示:
图 21. 观看变量
www.cypress.com
文档编号:001-93054 版本*A
24
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
6.
将断点放置在 if(DMADone_flag)循环内,如图 22 显示:
图 22. 添加断点
7.
按下 F5 以运行程序。按住连接至 P6[1]的开关(SW1),以允许 DMA 启动 ADC 采样缓冲。DMA 将指定的样本数量从
ADC 传输到存储器后,执行数据操作将在断点上停止。通过监视窗口上的 adc_sampleArray 可以验证结果,如图 23 显示:
图 23. 在监视窗口中进行 ADC 采样
示例 3:存储器至外设的传输 — Eg3_Mem_DMA_DAC
按照以下步骤可实现测试设置:
1.
将示波器探头分别连接至 P0[0]引脚和 VDAC 输出。
2.
编译项目并编程器件。
3.
在示波器上观察频率为 7.8 kHz 的正弦波。
示例 4:存储器至存储器的传输 — Eg4_Mem_DMA_Mem
按照以下步骤可实现测试设置:
1.
将字符 LCD 模块连接至 CY8CKIT-001 PSoC 开发套件的 P18 头(LCD 模块 — 端口 2)。
2.
确保 J12 跳线处于打开(ON)位置,以为 LCD 供电。
3.
编译项目并编程器件。
4.
查看 LCD 显示屏。第一行显示的是目标阵列的内容。最初所有值为零。经过一秒后,第一行显示从 00 到 07 各数值,指出
DMA 已经成功将数据从闪存传输到 RAM。第二行显示的是 TRANSFERRED 信息。图 24 显示的是一个 LCD 显示屏示例:
图 24. DMA 传输的 LCD 显示屏
0 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7
T R A N S F E R R E D
www.cypress.com
文档编号:001-93054 版本*A
25
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
示例 5:TD 链路 — Eg5_TD_Chaining
该示例的测试设置与示例2的相同。按照以下步骤可实现测试设置:
1.
将输入信号和输入分别连接到 P0[2]引脚和 ADC。确保输入电压位于 ADC 范围内(从 VSSA 至 2.048 V)。
2.
将 P6[1]连接至 DVK 上的开关(SW1)。
3.
编译项目。
4.
按 F5 或点击调试图标,如图 25 显示,以便下载该程序并开始调试。
图 25. 调试按键
5.
将 adc_samplearray1 和 adc_samplearray2 作为观看变量,如图 26 所示。
图 26. 观看变量
6.
将断点放在 if(DMADone_flag)循环中,如图 27 所示。
图 27. 添加断点
www.cypress.com
文档编号:001-93054 版本*A
26
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
7.
按下 F5,以运行程序。按住连接至 P6[1]的开关(SW1),以允许 DMA 启动 ADC 采样缓冲。DMA 将指定的样本数量从
ADC 传 输 到 存 储 器 后 , 执 行 数 据 操 作 将 停 止 在 断 点 上 。 为 了 验 证 结 果 , 在 监 视 窗 口 中 监 控 adc_sampleArray1 和
adc_sampleAv rray2,如图 28 所示。
图 28. 在监视窗口中进行 ADC 采样
附录 E:常见问题:
1.
通过使用 DMA,如何缓冲大于 4095 个字节?
TD 的最大传输计数被限制为 4095 个字节。如果您需要通过使用单 DMA 通道传输多于 4095 个字节,请使用多个 TD 并互
相链接它们,如示例 5 所示。
2.
在 DMA 数据传输中,如何找到外设的源地址和目标地址?
PSoC 是高度可编程的器件,许多组件都是由可编程数字和模拟模块创建的,并且一个外设的物理位置可根据设计而变更。
因此,传统的寄存器映射无法列出所有源地址和目标地址。
但在编译过程中,每组件的寄存器均由 PSoC Creator 所生成的组件 API 头文件定义。您应该查看这些头文件,以识别组件
的寄存器地址。
3.
如何联合使用 DMA 和通信协议(UART、SPI 等)?
当联合使用通信协议(如 UART、SPI)和 DMA 时,将缓冲区大小被设置为不大于 4,以便在数据传输中不会触发内部中
断。将硬件 FIFO 指针作为 DMA 的读写数据地址,并通过使用配置为中断的 FIFO 级别状态来触发 DMA。将 DMA 通道的
硬件请求配置为电平触发,以便联合使用它和 FIFO 级别。
4.
DMA 传输的时序详细信息?
可以在 PSoC 3,PSoC 5LP 技术参考手册中找到有关 DMA 传输的时序详细信息。关于 DMA 时序的详情,超出了该应用笔
记讨论的范围。
www.cypress.com
文档编号:001-93054 版本*A
27
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
文档修订记录
文档标题:PSoC® 3 和 PSoC 5LP — DMA 入门手册 — AN52705
文档编号:001-93054
版本
ECN
原始变更
提交日期
**
4477365
MSON
08/18/2014
本文档版本号为 Rev**,译自英文版 001-52705 Rev*H。
*A
4908666
XZNG
09/04/2015
本文档版本号为 Rev*A,译自英文版 001-52705 Rev*I。
www.cypress.com
变更说明
文档编号:001-93054 版本*A
28
®
PSoC 3 和 PSoC 5LP — DMA 入门手册
全球销售和设计支持
赛普拉斯公司拥有一个由办事处、解决方案中心、工厂代表和经销商组成的全球性网络。如果想要查找离您最近的办事处,请访
问赛普拉斯所在地。
PSoC®解决方案
产品
汽车
cypress.com/go/automotive
psoc.cypress.com/solutions
时钟与缓冲区
cypress.com/go/clocks
PSoC 1 | PSoC 3 | PSoC 5LP
接口
cypress.com/go/interface
照明和电源控制
cypress.com/go/powerpsoc
cypress.com/go/plc
赛普拉斯开发者社区
社区
| 论坛| 博客 | 视频 | 培训
cypress.com/go/memory
存储器
光学导航传感器
cypress.com/go/ons
PSoC
cypress.com/go/psoc
触摸感应
cypress.com/go/touch
USB 控制器
cypress.com/go/usb
无线/射频
cypress.com/go/wireless
PSoC 是赛普拉斯半导体公司的注册商标。此处引用的所有其他商标或注册商标归其各自所有者所有。
赛普拉斯半导体公司
198 Champion Court
San Jose, CA 95134-1709
电话
传真
网址
:408-943-2600
:408-943-4730
:www.cypress.com
©赛普拉斯半导体公司,2009-2015。此处所包含的信息可能会随时更改,恕不另行通知。除赛普拉斯产品内嵌的电路外,赛普拉斯半导体公司不对任何
其他电路的使用承担任何责任。也不会根据专利权或其他权利以明示或暗示的方式授予任何许可。除非与赛普拉斯签订明确的书面协议,否则赛普拉斯产
品不保证能够用于或适用于医疗、生命支持、救生、关键控制或安全应用领域。此外,对于可能发生运转异常和故障并对用户造成严重伤害的生命支持系
统,赛普拉斯不授权将其产品用作此类系统的关键组件。若将赛普拉斯产品用于生命支持系统,则表示制造商将承担因此类使用而招致的所有风险,并确
保赛普拉斯免于因此而受到任何指控。
该源代码(软件和/或固件)均归赛普拉斯半导体公司(赛普拉斯)所有,并受全球专利法规(美国和美国以外的专利法规)、美国版权法以及国际条约
规定的保护和约束。赛普拉斯据此向获许可者授予适用于个人的、非独占性、不可转让的许可,用以复制、使用、修改、创建赛普拉斯源代码的派生作
品、编译赛普拉斯源代码和派生作品,并且其目的只能是创建自定义软件和/或固件,以支持获许可者仅将其获得的产品依照适用协议规定的方式与赛普
拉斯集成电路配合使用。除上述指定的用途外,未经赛普拉斯的明确书面许可,不得对此类源代码进行任何复制、修改、转换、编译或演示。
免责声明:赛普拉斯不针对此材料提供任何类型的明示或暗示保证,包括(但不仅限于)针对特定用途的适销性和适用性的暗示保证。赛普拉斯保留在不
做出通知的情况下对此处所述材料进行更改的权利。赛普拉斯不对此处所述之任何产品或电路的应用或使用承担任何责任。对于合理预计可能发生运转异
常和故障,并对用户造成严重伤害的生命支持系统,赛普拉斯不授权将其产品用作此类系统的关键组件。若将赛普拉斯产品用于生命支持系统中,则表示
制造商将承担因此类使用而招致的所有风险,并确保赛普拉斯免于因此而受到任何指控。
产品使用可能受适用的赛普拉斯软件许可协议的限制。
www.cypress.com
文档编号:001-93054 版本*A
29