文章目录
- 一、DMAC和DTC模块简介
- 1. DMAC 特性
- 2. DTC 特性
- 二、DMAC 模块框图分析
- 三、DMAC 传输模式
- 1. 正常传输模式
- 2. 重复传输模式
- 3. 块传输模式
- 4. 重复-块传输模式
- 四、DTC 模块框图分析
- 五、DTC 传输模式
- 1. 正常传输模式
- 2. 重复传输模式
- 3. 块传输模式
- 六、DMAC和DTC关键特性对比
一、DMAC和DTC模块简介
DMAC(Direct Memory Access Controller)为直接存储器访问控制器或者直接内存访问控制器, 可以在不占用 CPU 的情况下将数据从一个内存位置传输到另一个内存位置。
DTC(Data Transfer Controller)为数据传输控制器,用于在被中断请求激活时传输数据。 DTC 也可以在不占用 CPU 的情况下将数据传输,它的功能与 DMAC 的功能其实是相似的。
DMAC 和 DTC 它们的主要功能都是用来搬数据,但是却不需要占用 CPU, 即在传输数据的时候,不需要 CPU 去读取数据,在此期间 CPU 完全可以干其他的事情,类似于多线程一样。 数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是 SRAM 或者 FLASH。 实际上,我们前面有讲过,外设寄存器也是一种存储器。
DMAC 和 DTC 实际上还是会有区别的,正因为有所区别,在不同的情况下需要考虑是使用 DMAC 还是 DTC 更加合适。 下面就让我们来了解一下 DMAC 和 DTC 这两个模块的一些特性。
1. DMAC 特性
RA6M5 包括一个 8 通道的直接内存访问控制器(DMAC),可以在不需要CPU干预的情况下传输数据。 当产生 DMA 传输请求时,DMAC 将存储在传输源地址的数据传输到传输目标地址。
DMAC 外设模块特性如下:
-
通道数: 8 个通道(Channel 0 通道的优先级最高)
-
传输可寻址空间: 4 GB(0x00000000 ~ 0xFFFFFFFF,不包含保留区域)
-
最大传输量: 64 M 数据 (块传输模式下的最大传输数:1024×65536 个块)
-
DMAC 激活源 (每个通道单独可选):
① 软件触发
② 来自外设模块或者外部中断输入引脚的中断请求 -
传输数据:
① 单个数据单元:1 字节 (8 bits),2 字节 (16 bits),4 字节 (32 bits)
② 单个块的大小(Block size):1 ~ 1024 个数据单元 -
传输模式:
1.正常传输模式(Normal Transfer Mode)
(1)触发一次 DMA 传输请求时传输 1 个数据单元
(2)可选的自由运行功能(Free-running function)
2.重复传输模式(Repeat Transfer Mode)
(1)触发一次 DMA 传输请求时传输 1 个数据单元
(2)当指定重复大小的数据传输完成后,程序重置传输起始地址从而实现重复传输。
(3)最大可设置重复大小:1024 个数据单元(同块大小)
(4)可选的自由运行功能(Free-running function)
3.块传输模式(Block Transfer Mode)
(1)触发一次 DMA 传输请求时传输 1 个块数据
(2)最大可设置块大小:1024 个数据单元
(3)可选的自由运行功能(Free-running function)
4.重复-块传输模式(Repeat-block Transfer Mode)
(1)触发一次 DMA 传输请求时传输 1 个块数据
(2)最大可设置块大小:1024 个数据单元
(3)块传输可以重复
(4)最大可设置重复大小:65536 个块
(5)可选的自由运行功能(Free-running function) -
扩展重复区域功能 (可选功能):
① 可以通过重复指定范围内的地址值来传输数据的功能,其中传输地址寄存器中的高位值是固定的
② 2 字节至 128M 字节的区域可单独设置为传输源和目标的扩展重复区域 -
中断 (中断频率):
1.全部传输完成后中断(传输结束中断):
(1)传输计数器指定的传输数据量完成时产生
2.每次传输完成都产生中断(传输转义结束中断):
(1)当重复大小的数据传输完成时产生
(2)当源地址扩展重复区域溢出时产生
(3)当目标地址扩展重复区域溢出时产生
3.错误响应检测中断:
(1)DMAC 传输发生错误时产生 -
事件链接激活:
每次数据传输后都会生成一个事件链接请求(对于块传输,在每个块传输后)
2. DTC 特性
数据传输控制器(DTC)模块用于在被中断请求激活时传输数据。
DTC 外设模块特性如下:
-
传输模式:
1.正常传输模式(Normal Transfer Mode)
(1)单次激活时触发单个数据单元的传输
2.重复传输模式(Repeat Transfer Mode)
(1)单次激活时触发单个数据单元的传输
(2)数据传输次数达到指定的重复大小后,传输地址重置回起始地址
(3)最大重复传输次数为 256,最大数据传输大小为 256 × 32 位(1024字节)
3.块传输模式(Block Transfer Mode)
(1)单次激活时触发单个块的传输
(2)最大的块大小为 256 × 32 位(1024字节) -
传输通道:
① 传输通道与中断源相关联(通过来自 ICU 的 DTC 激活请求传输)
② 可以在单个激活源上传输多个数据单元(链式传输)
③ 链传输可以选择在计数器为 0 时执行,也可以选择始终执行 -
传输可寻址空间: 4 GB(0x00000000 ~ 0xFFFFFFFF,不包含保留区域)
-
传输数据:
① 单个数据单元:1 字节 (8 bits),1 半字 (16 bits),1 字 (32 bits)
② 单个块的大小(Block size):1 ~ 256 个数据单元 -
CPU 中断源:
① 可以在触发 DTC 激活的中断向 CPU 生成中断请求
② 可以在单次数据传输之后向 CPU 生成中断请求
③ 可以在指定量的数据传输之后向 CPU 生成中断请求 -
错误响应检测中断:
发生 DTC 传输错误时生成 -
事件链接激活:
每次数据传输后都会生成一个事件链接请求(对于块传输,在每个块传输后)
二、DMAC 模块框图分析
1. DMAC 激活源
软件触发、来自外设模块的中断请求和外部中断请求都可以指定为 DMAC 激活源。 DMAC 激活源是在 DMTMD 寄存器的 DCTG[1:0] 位进行设置。
① 通过软件激活DMAC
可以选择通过软件启动 DMA 进行传输,也就是不使用片上外设模块和外部中断的中断请求进行激活 DMAC, 而是手动地激活 DMA 进行传输。
② 通过来自片上外设模块或外部中断的中断请求激活DMAC
除了通过软件手动激活DMAC,还可以通过片上外设模块的中断请求或外部中断请求激活DMAC。
可以将片上外设模块的中断请求和外部中断请求设置为 DMAC 的激活源。 可以通过 ICU 的 DELSRn 寄存器的 DELS[8:0]位 (n = 0~7) 为每个通道单独选择激活源。
2. 中断优先级
当存在多个DMA传输请求时,DMAC确定具有DMA传输请求的通道的优先级。 通道优先级固定如下: 通道 0 > 通道 1 > 通道 2 > 通道 3… > 通道 7 (通道 0: 优先级最高)
当在数据传输期间产生DMA传输请求时,在最终数据已传输之后开始通道仲裁, 并且开始优先级较高的通道的DMA传输。
3. 事件链接
每个DMAC通道在每次完成数据传输或块传输模式下的块传输时,都会输出一个事件链接请求信号(DMACn_INT)。 当传输目的地是外部总线时,在写入缓冲区操作被接受时会产生一个事件链接请求信号。 有关详细信息,可以查看 事件链接控制器(ELC) 章节。 如果写入传输的最后数据时发生总线错误,则会发生传输结束事件和错误响应检测中断(DMA_TRANSERR)。
三、DMAC 传输模式
DMAC 有 4 种传输模式:
正常模式 (Normal Mode): 在正常模式下,DMAC通道每次接收到配置的激活源时都会传输单个数据单元。 数据单元可以是1字节、2字节或4字节。 在每次传输之后,源地址和目的地址可以是固定、递增、递减,或者向下一个数据单元添加偏移量。 16位计数器在每次传输后递减。 当计数器达到0时,传输将不再由激活源触发,并且可以发出所有传输已完成的信号以中断CPU。
重复模式 (Repeat Mode): 重复模式的工作方式与正常模式相同,但长度限制为范围 [1, 1024] 内的整数。 当传输计数器达到0时,计数器被重置为其配置值,重复区域(源或目的地址)被重置到其起始地址,剩余的块计数将递减1。 当块计数达到0时,传输将不再由激活源触发,并且可配置传输完成中断。
块模式 (Block Mode): 在块模式下,每个中断传输的数据单元量可以设置为范围 [1, 1024] 内的整数。 还可以将要传输的块数配置为16位数字。 每次块传输后,重复区域(源或目的地址)将重置为原始地址,而另一个地址将递增或递减到下一个块。
重复-块模式 (Repeat-Block Mode): 在重复-块模式下,每个中断传输的数据单元量可以设置为范围[1, 1024]内的整数。 可以将要传输的块的数量配置为16位数字(最大可设置重复大小为64K,即65536)。
如果目标地址模式为偏移模式,则数据传输大小为字节的块大小(长度)的最大可配置块数为0xFFFF, 数据传输大小为半字的块大小为0x7FFF,数据大小为字的块大小为0x3FFF。 在每个块传输之后,源地址和目的地址将递增或递减到下一个块地址。
对于源地址的偏移地址模式,源地址大小是源缓冲区的总大小,之后源区域被翻转,块大小可以小于源缓冲区大小。 对于源地址模式作为偏移模式,最大可配置的源缓冲区大小为0xFFFF用于一个字节的传输数据大小, 0x7FFF用于半字的传输数据大小和0x3FFF用于字的传输数据大小。
采用重复-块模式可以实现单环形缓冲区到多环形缓冲区的传输类型设计。
1. 正常传输模式
在正常传输模式(Normal Transfer Mode)下,一个传输请求传输一个数据。 使用DMCRAL寄存器可以将最大65535设置为传输操作数。 当这些位设置为0x0000时,不设置特定数量的传输操作; 在传输计数器停止的情况下执行数据传输(自由运行功能)。 在正常传输模式下,设置DMCRB寄存器无效。除自由运行功能外, 在完成指定数量的传输操作后,可以生成传输结束中断请求。
2. 重复传输模式
在重复传输模式(Repeat Transfer Mode)下,发起一次传输请求,传输一个数据。
通过设置DMCRA寄存器,最多可以将1K数据设置为总重复传输大小;通过设置DMCRB寄存器可以将最大64K设置为重复传输操作次数。
所以,我们可以将最大64M数据(1K数据×64K重复传输操作计数)设置为总数据传输大小。
可以将传输源地址或传输目的地址设置为重复区域。当指定重复大小数据的传输完成时, DMAC将会把重复区域的地址重新设置为传输开始地址,也就是一个循环的过程。
当完成指定的重复传输次数后,可以产生传输完成中断;当每完成一次循环的过程都可以产生一次中断。
通过将DMCNT寄存器的DTE位置1,可以恢复DMA传输。
在完成指定数量的重复传输操作后,可以生成传输结束中断请求。
3. 块传输模式
在块传输模式下(Block Transfer Mode),单个块数据通过一个传输请求传输。
使用DMCRA寄存器,最多可以将1K数据设置为总块传输大小。
使用DMCRB寄存器可以将最大64K设置为块传输操作数; 因此,可以将最大64M数据(1K数据×64K块传输操作计数)设置为总数据传输大小。
可以将传送源或传送目的地指定为块区域。 当单个块数据的传输完成时,指定块区域(DMSAR或DMDAR)的地址返回到传输开始地址。 当单块数据在块传输模式下全部传输完毕时,可停止DMA传输,并可请求重复大小结束中断。 通过将1写入重复大小结束中断处理中的DMCNT.DTE位,可以恢复DMA传输。
传输结束中断请求可以在完成指定数量的块传输操作后生成。
4. 重复-块传输模式
重复-块传输模式(Repeat-Block Transfer Mode),主要在块模式基础上增加了一些功能:
重复功能:添加功能(环形缓冲区)以重复指定的地址区域。
偏移功能:可以在一个块传输中指定具有偏移的多个区域。
重复功能和偏移功能可用于重复块传输的传输源和传输目的地。
在重复块传输模式下,单个块数据通过一个传输请求传输。
使用DMACn的DMCRA可以将最多1K数据设置为总的块传输大小。 使用DMACn的DMCRB的块传输操作的数量可以设置为最大64K; 因此,可以将最大64M数据(1K数据×64K块传输操作计数)设置为总数据传输大小。
下图是在重复-块传输模式下的示例
下图是在重复-块传输模式下,带偏移增加的示例
四、DTC 模块框图分析
1. DTC 内部寄存器
MRA、MRB、SAR、DAR、CRA 和 CRB 这些都是属于 DTC 内部的寄存器,它们是无法通过 CPU 直接访问的。 这些 DTC 内部寄存器中设置的值作为传输信息放置在 SRAM 区域中。 当生成激活请求时,DTC 从 SRAM 区域读取传输信息,并将其设置在其内部寄存器中。 数据传输结束后,内部寄存器内容作为传输信息写回 SRAM 区域。
我们在使用 DTC 时,是通过配置传输信息来间接配置这些 DTC 内部寄存器的。
2. 事件链接
DTC 可以在完成一个传输请求时产生事件链接请求。 然而,当传输目的地是外部总线时,事件链接请求将在写入缓冲器完成之后发出, 而不是在写入实际传输目的地完成之后发出。
五、DTC 传输模式
DTC 模块支持三种操作模式,相对于 DMAC,少了重复-块传输模式。
正常模式: 在正常模式下,DTC每次接收到中断触发时都会传输单个数据单元。数据单元可以是1、2、4字节。 传输的长度(length)可以设置为[0, 65535]。当长度设置为0时,DTC将执行65536传输,而不是0。 在每次传输之后,源地址和目的地址可以单独设置为固定、递增或递减。 每次传输后,16位计数器递减。 当计数器达到 0 时,DTC传输将不再会被中断源触发,CPU可以被中断以通知所有传输已完成。
重复模式: 重复模式的工作方式与正常模式相同,但长度(length)限制为范围 [1, 256] 内的整数。 当传输计数器达到 0 时,计数器被重置为其配置值(length), 重复区域(源或目的地址)被重置为其起始地址,并且传输仍将会被中断触发。
块模式: 在块模式下,每个中断传输的数据单元量可以设置为范围 [1, 256] 内的整数。 还可以将要传输的块数量(num_blocks)配置为16位数字, 即可以设置为[0, 65535]。当长度设置为0时,DTC将执行65536传输,而不是0。 每次块传输后,重复区域(源或目的地址)将重置为原始地址,而另一个地址将递增或递减到下一个块。
1. 正常传输模式
正常传输模式(Normal Transfer Mode)允许在单个激活源上进行1字节(8位)、1半字(16位)、1字(32位)数据传输。 传输计数可以设置为 1 到 65536 (0x10000)。 传送源地址和目的地址也可以独立设置为递增、递减或固定。 该模式允许在指定的计数传输结束时生成对CPU的中断请求。
正常传输模式的内存映射如下图所示:
2. 重复传输模式
重复传输模式(Repeat Transfer Mode)允许在单个激活源上进行1字节(8位)、1半字(16位)或1字(32位)数据传输。 重复区域的传输源或传输目的地必须在MRB.DTS位中指定。 传输计数可以设置为从1到256。 当指定的传输计数完成时,恢复重复区域中指定的地址寄存器的初始值,恢复传输计数器的初始值,并重复传输。 另一地址寄存器连续递增或递减或保持不变。 在重复传输模式下,当传输计数器CRAL递减到0x00时,CRAL值更新为CRAH寄存器中设置的值。 因此,传输计数器不会清0,当MRB.DISEL位设置为0时,将禁用对CPU的中断请求。 当指定的数据传输完成时,会生成对CPU的中断请求。
当传输源为重复区域时,重复传输模式的内存映射如下图所示:
3. 块传输模式
块传输模式(Block Transfer Mode)允许在单个激活源上进行单块数据传输。 数据块区域的传输源或传输目的地必须在MRB.DTS位中指定。 块大小可以设置为1至256字节、1至256半字(2至512字节)或1至256字(4至1024字节)。 当指定块的传输完成时,恢复块区域中指定的块大小计数器CRAL和地址寄存器 (当MRB.DTS=1时为SAR寄存器或当DTS=0时为DAR寄存器)的初始值。 另一地址寄存器连续递增或递减或保持不变。 传输计数(块计数)可以设置为从 1 到 65536。 该模式允许在指定计数块传输结束时生成对CPU的中断请求。
块传输模式的内存映射如下图所示:
六、DMAC和DTC关键特性对比
FSP 库里边的传输 API 可以由 DMAC 或者 DTC 实现, 因此理论上来说我们可以在 DMAC 和 DTC 之间切换使用。 但是 DMAC 和 DTC 还是有一些不同的,因此在它们之间进行选择时,请考虑以下因素:
中断
DTC 和 DMAC 的中断行为不同:
-
DTC 使用配置的 IELSR 事件 IRQ 作为中断源
-
而每个 DMAC 通道都有自己的 IRQ
其他注意事项:
-
DTC 需要一定的 RAM。
-
DTC 将传输信息存储在RAM中,并在每次传输后写回RAM,而 DMAC 将所有传输信息存储在寄存器中。
-
当为多个激活源配置传输时,DTC 必须在每次中断时从RAM获取传输信息。这可能会导致传输之间的延迟更高。
-
DTC 使用激活源的IRQ中断CPU。每个 DMAC 通道都有自己的IRQ。
另外在传输信息的 transfer_info_t::irq 属性的设置上,根据所选模式的不同,其具体行为也略有不同。