19.6
DMAC和DTC关键特性对比
FSP库里边的传输API可以由DMAC或者DTC实现,因此理论上来说我们可以在DMAC和DTC之间切换使用。但是DMAC和DTC还是有一些不同的,因此在它们之间进行选择时,请考虑以下因素:
表2: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属性的设置上,根据所选模式的不同,其具体行为也略有不同。
表3:正常模式(Normal Mode)
| 中断模式 | DMAC | DTC |
| TRANSFER_IRQ_EACH | N/A | 每次传输后中断 |
| TRANSFER_IRQ_END | 完成最后一次传输后中断 | 完成最后一次传输后中断 |
表4:重复模式(Repeat Mode)
| 中断模式 | DMAC | DTC |
| TRANSFER_IRQ_EACH | 每次传输后中断 | 每次传输后中断 |
| TRANSFER_IRQ_END | 完成最后一次传输后中断 | 每次传输后中断 |
表5:块模式(Block Mode)
| 中断模式 | DMAC | DTC |
| TRANSFER_IRQ_EACH | 每次传输后中断 | 每次传输后中断 |
| TRANSFER_IRQ_END | 完成最后一次传输后中断 | 完成最后一次传输后中断 |
表6:重复-块模式(Repeat-block Mode)
| 中断模式 | DMAC | DTC |
| TRANSFER_IRQ_EACH | N/A | N/A |
| TRANSFER_IRQ_END | 完成最后一次传输后中断 | N/A |
19.7
实验1:DMAC存储器到存储器传输
19.7.1
软件设计
19.7.1.1
新建工程
因为本实验需要用到LED,也会用到串口打印调试信息,因此我们在上一章的“实验1:UART收发回显”例程的基础上修改程序。
对于e2 studio开发环境:拷贝一份我们之前的e2s工程“19_UART_Receive_Send”,然后将工程文件夹重命名为“20_DMAC_Memory_To_Memory”,最后再将它导入到我们的e2 studio工作空间中。
对于Keil开发环境: 拷贝一份我们之前的Keil工程“19_UART_Receive_Send”,然后将工程文件夹重命名为 “20_DMAC_Memory_To_Memory”,并进入该文件夹里面双击Keil工程文件,打开该工程。
工程新建好之后,在工程根目录的“src”文件夹下面新建“dmac”文件夹,再进入“dmac”文件夹里面新建源文件和头文件:“bsp_dmac_m2m.c”和“bsp_dmac_m2m.h”。工程文件结构如下。
列表1:文件结构
左右滑动查看完整内容
20_DMAC_Memory_To_Memory ├─ ...... └─ src ├─ led│ │ ├─ bsp_led.c │ └─ bsp_led.h ├─ debug_uart │ ├─ bsp_debug_uart.c │ └─ bsp_debug_uart.h ├─ dmac │ ├─ bsp_dmac_m2m.c │ └─ bsp_dmac_m2m.h └─ hal_entry.c
19.7.1.2
FSP配置
打开该工程的FSP配置界面。然后按如图步骤加入DMAC。

加入DMAC后如下图所示。

我们单击上图中新添加的r_dmac框,然后在左下角的“属性”窗口配置DMAC模块的各个属性参数。按照如下图所示来配置即可。

在上图中,实际上只需配置框中的那部分属性,其他的属性均按照默认即可。
DMAC的配置项(与上图相对应):
表7:DMAC配置属性描述
| 属性 | 描述 |
| Name |
名字。上图配置为 g_transfer_dmac0, 按照自己命名习惯设置、并且与代码中的对应即可。 |
| Channel |
通道:DMA传输通道选择。这里选择通道0, 通道0也是优先级最高的通道。 RA6M5有8个通道,0~7可选。其他MCU型号可能不同。 |
| Mode | 模式:DMA传输模式选择。默认选择正常模式即可。 |
| Transfer Size | 传输大小:传输数据单元的大小。默认设置为2字节即可。 |
| Destination Address Mode | 目标地址模式:默认设置为固定。 |
| Source Address Mode | 源地址模式:默认设置为固定。 |
| Repeat Area(Unused in Normal Mode) | 重复区域(正常模式下不使用):源地址。 |
| Destination Pointer | 目标指针:NULL(在这里不方便确定传输地址,后续在代码部分配置)。 |
| Source Pointer | 源指针:NULL(在这里不方便确定传输地址,后续在代码部分配置)。 |
| Number of Transfers | 传输次数:指定正常和重复模式的传输次数或重复-块传输模式的块大小。 |
|
Number of Blocks (Valid only in Repeat, Block or Repeat-Block Mode) |
块数量:指定要在重复、块或重复-块模式下传输的块数。 |
| Activation Source |
触发源:选择DMAC传输开始事件。 如果未选择ELC事件,则可以使用软件启动。 |
| Callback |
回调函数:触发DMAC中断时调用的回调函数。 此处设置为 dmac0_callback。 |
| Context | 上下文:指向通过回调函数传递的上下文结构的指针。 |
| Transfer End Interrupt Priority | 传输结束中断优先级:传输结束中断的优先级设置。 |
配置完成后,点击生成代码,然后开始我们的代码编写。
全部0条评论
快来发表一下你的评论吧 !