【瑞萨RA_FSP】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 属性的设置上,根据所选模式的不同,其具体行为也略有不同。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Dustinthewine/article/details/130755204