系列文章目录
由于一些特殊原因:
系列文章链接:(其他系列文章,请点击链接,可以跳转到其他系列文章)
24.RA2E1的 DMAC——数据传输
文章目录
系列文章目录
前言
一、DTC是什么?
二、DTC内部寄存器
三、DTC 模块模式
四、正常传输模式
五、重复传输模式
六、块传输模式
七、DMAC和DTC关键特性对比
八、中断
风华正茂
前言
DTC(Data Transfer Controller)为数据传输控制器,用于在被中断请求激活时传输数据。 DTC 也可以在不占用 CPU 的情况下将数据传输,它的功能与 DMAC 的功能其实是相似的。
一、DTC是什么?
二、DTC内部寄存器
MRA、MRB、SAR、DAR、CRA 和 CRB 这些都是属于 DTC 内部的寄存器,它们是无法通过 CPU 直接访问的。 这些 DTC 内部寄存器中设置的值作为传输信息放置在 SRAM 区域中。 当生成激活请求时,DTC 从 SRAM 区域读取传输信息,并将其设置在其内部寄存器中。 数据传输结束后,内部寄存器内容作为传输信息写回 SRAM 区域。
三、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。 每次块传输后,重复区域(源或目的地址)将重置为原始地址,而另一个地址将递增或递减到下一个块。
四、正常传输模式
正常传输模式(Normal Transfer Mode)允许在单个激活源上进行1字节(8位)、1半字(16位)、1字(32位)数据传输。 传输计数可以设置为 1 到 65536 (0x10000)。 传送源地址和目的地址也可以独立设置为递增、递减或固定。 该模式允许在指定的计数传输结束时生成对CPU的中断请求。
五、重复传输模式
重复传输模式(Repeat Transfer Mode)允许在单个激活源上进行1字节(8位)、1半字(16位)或1字(32位)数据传输。 重复区域的传输源或传输目的地必须在MRB.DTS位中指定。 传输计数可以设置为从1到256。 当指定的传输计数完成时,恢复重复区域中指定的地址寄存器的初始值,恢复传输计数器的初始值,并重复传输。 另一地址寄存器连续递增或递减或保持不变。 在重复传输模式下,当传输计数器CRAL递减到0x00时,CRAL值更新为CRAH寄存器中设置的值。 因此,传输计数器不会清0,当MRB.DISEL位设置为0时,将禁用对CPU的中断请求。 当指定的数据传输完成时,会生成对CPU的中断请求。
六、块传输模式
块传输模式(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 还是有一些不同的,因此在它们之间进行选择时,请考虑以下因素:
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 属性的设置上,根据所选模式的不同,其具体行为也略有不同。
正常模式 (Normal Mode) 中断模式
DMAC
DTC
TRANSFER_IRQ_EACH
N/A
每次传输后中断
TRANSFER_IRQ_END
完成最后一次传输后中断
完成最后一次传输后中断
重复模式 (Repeat Mode) 中断模式
DMAC
DTC
TRANSFER_IRQ_EACH
每次传输后中断
每次传输后中断
TRANSFER_IRQ_END
完成最后一次传输后中断
每次传输后中断
块模式 (Block Mode) 中断模式
DMAC
DTC
TRANSFER_IRQ_EACH
每次传输后中断
每次传输后中断
TRANSFER_IRQ_END
完成最后一次传输后中断
完成最后一次传输后中断
重复-块模式 (Repeat-block Mode) 中断模式
DMAC
DTC
TRANSFER_IRQ_EACH
N/A
N/A
TRANSFER_IRQ_END
完成最后一次传输后中断
N/A