大学生电子设计竞赛
直播中

李永清

7年用户 189经验值
私信 关注
[问答]

请问RX23T单片机的DTC模块类似于DMA模块吗?

我想请问一下RX23T单片机的DTC模块是不是类似于DMA模块?怎么进行设置能使发送数据的时候不占用主机时间?

回帖(15)

李德鹏

2018-7-23 08:18:32
DTC是类似于DMA模块的,都是直接内存搬运,不经过CPU,所以不会占用主机时间。
使用默认的代码生成器的设置即可。
举报

李永清

2018-7-23 08:36:26
引用: szzjfyp 发表于 2018-7-23 08:18
DTC是类似于DMA模块的,都是直接内存搬运,不经过CPU,所以不会占用主机时间。
使用默认的代码生成器的设置即可。

能说一下怎么具体设置么?有没有什么参考资料
举报

李德鹏

2018-7-23 08:52:07
引用: 535夏花 发表于 2018-7-23 08:36
能说一下怎么具体设置么?有没有什么参考资料

1. 点击代码生成器的Data Transfer Controller,设置DTC, 下面的例子是设置了DTC0,触发条件(CMT0中断)
 
 
2.设置 DTC0 的源地址与目标地址,传输 的字节数目

3. 设置CMT中断,生成代码。

 
4. 程序里面定义DTC0的 源地址与目标地址的变量,并指向源地址、目标地址。
在程序里面给dtc_sar_addr赋初值0x12345678,打开DTC0,打开CMT0。
#pragma address dtc_sar_addr=0x00004000U
#pragma address dtc_dst_addr=0x00004100U
uint32_t dtc_sar_addr;
uint32_t dtc_dst_addr;


void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    dtc_sar_addr = 0x12345678;
    R_CMT0_Start();
    R_DTC0_Start();
    /* End user code. Do not edit comment generated here */
}
 
5 在CMT0中断设置断点,可以看到0x12345678 通过DTC,从dtc_sar_addr传到了 dtc_dst_addr。
举报

李林松

2018-7-23 08:58:50
引用: szzjfyp 发表于 2018-7-23 08:52
1. 点击代码生成器的Data Transfer Controller,设置DTC, 下面的例子是设置了DTC0,触发条件(CMT0中断)
 
 

照着做了一遍..并没有看到效果啊 TT
举报

李林松

2018-7-23 09:05:57
引用: JoyceChang 发表于 2018-7-23 08:58
照着做了一遍..并没有看到效果啊 TT

好了 找到问题了
举报

李林松

2018-7-23 09:14:54
引用: szzjfyp 发表于 2018-7-23 08:52
1. 点击代码生成器的Data Transfer Controller,设置DTC, 下面的例子是设置了DTC0,触发条件(CMT0中断)
 
 

麻烦写一下数组dtc如何操作 谢谢
举报

李德鹏

2018-7-23 09:26:35
引用: JoyceChang 发表于 2018-7-23 09:14
麻烦写一下数组dtc如何操作 谢谢

对于数组等多个数据的传输,如果是一次传输,可以使用DTC的BLOCK模式。
 
1>设定BLOCK模式, 传输第源地址,目的地址,另外要选择Address incremented
Count 为1, Block为块的大小,可以设定为数组的长度,例子的数组大小是256,所以这里是256, count为1

 
2>r_cg_dtc.c中定义传送的数组,以及地址,注意rx23t的RAM的地址范围。
#pragma address dtc_sar_addr=0x00004000U
#pragma address dtc_dst_addr=0x00004400U
uint32_t dtc_sar_addr[256];   // 可以定义为其它的数据结构
uint32_t dtc_dst_addr[256];
r_cg_main.c里面初始化数组。
void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
 uint16_t i;
 for(i=0; i<256; i++)
 {
  dtc_dst_addr = 0x00;
  dtc_sar_addr = 0x12345678;
 }
 R_CMT0_Start();
 R_DTC0_Start();
    /* End user code. Do not edit comment generated here */
}
 
3> 参考帖子上面的说明,
CMT0中断后可以看到dtc_sar_addr[256] 已经传输到dtc_dst_addr[256]。
 
举报

韩刚龙

2018-7-23 09:34:46
引用: JoyceChang 发表于 2018-7-23 09:05
好了 找到问题了

什么问题啊 我的也是没有数值
举报

韩刚龙

2018-7-23 09:46:17
引用: szzjfyp 发表于 2018-7-23 08:52
1. 点击代码生成器的Data Transfer Controller,设置DTC, 下面的例子是设置了DTC0,触发条件(CMT0中断)
 
 

怎么还是不行啊
举报

韩刚龙

2018-7-23 09:58:35
引用: szzjfyp 发表于 2018-7-23 08:52
1. 点击代码生成器的Data Transfer Controller,设置DTC, 下面的例子是设置了DTC0,触发条件(CMT0中断)
 
 

成了  没毛病
举报

李婧

2018-7-23 10:12:24
引用: szzjfyp 发表于 2018-7-23 08:52
1. 点击代码生成器的Data Transfer Controller,设置DTC, 下面的例子是设置了DTC0,触发条件(CMT0中断)
 
 

如果要串口通信配置成DTC模式的话,实在源地址或者目标地址写上RDR和TDR寄存器的地址吗?
举报

李玉兰

2018-7-23 10:31:20
引用: JoyceChang 发表于 2018-7-23 08:58
照着做了一遍..并没有看到效果啊 TT

我也照着做了一遍..也没有看到效果,请问你是怎么解决的呢
举报

李玉兰

2018-7-23 10:38:23
引用: szzjfyp 发表于 2018-7-23 09:26
对于数组等多个数据的传输,如果是一次传输,可以使用DTC的BLOCK模式。
 
1>设定BLOCK模式, 传输第源地址,目的地址,另外要选择Address incremented

请问为什么我按照你的操作数组之后,dtc_dst_addr[0]在中断进入前便显示0x12345678,之后运行也是dst_add[0]=0x1234678,dst_addr[1~255]=0
举报

李德鹏

2018-7-23 10:52:51
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

李玉兰

2018-7-23 11:00:58
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

×
20
完善资料,
赚取积分