查看: 4439|回复: 8

[求助] KL25 DMA模块的一些问题

[复制链接]

该用户从未签到

12

主题

50

帖子

0

注册会员

Rank: 2

积分
117
最后登录
1970-1-1
发表于 2013-12-2 18:54:13 | 显示全部楼层 |阅读模式
1、DMA模块根据芯片描述,是可以做到由模块到模块的传输,但是这个在选DMA源的时候DMAMUX_CHCFG_SOURCE如何配置呢,比如我要把AD0通道采集的结果通过DMA的方式传输到UART0模块(8位精度),应该如何写呢?
2、下面是我AD0通道采集,通过DMA将结果存到内存中,DMA部分的程序是根据官方例程改的,但是无法进行额,能帮我看看原因是什么吗,谢谢了!

void dma_init(void)
{
    int j = 0; 
     // Enable Clock gating for the DMA and DMA MUX
    SIM_SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
    SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;
   
   
      // 禁止DMA0 Mux通道以进行寄存器的配置
    DMAMUX0_CHCFG0 = 0x00;
          
      // 清除寄存器的相应标志位
    if (((DMA_DSR_BCR0 & DMA_DSR_BCR_DONE_MASK) == DMA_DSR_BCR_DONE_MASK)                     //DMA传递已完成已经 可通过写1清除
           | ((DMA_DSR_BCR0 & DMA_DSR_BCR_BES_MASK) == DMA_DSR_BCR_BES_MASK)                  //源地址总线出错
           | ((DMA_DSR_BCR0 & DMA_DSR_BCR_BED_MASK) == DMA_DSR_BCR_BED_MASK)                  //目的地址总线出错
           | ((DMA_DSR_BCR0 & DMA_DSR_BCR_CE_MASK) == DMA_DSR_BCR_CE_MASK))                   //某些配置出错 主要可能是一些寄存器写的值超过其可配置范围
      DMA_DSR_BCR0 |= DMA_DSR_BCR_DONE_MASK;                                                  //该位写1可以清除上述错误标志
     
      // 设置源地址
    DMA_SAR0 = SOURCE_ADDRESS;
     
      //设置要传递的数的个数   为24位的寄存器 写入的数必须
我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

10

主题

459

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2024-10-24
发表于 2013-12-3 09:18:23 | 显示全部楼层

回复:KL25 DMA模块的一些问题

 如果你要把AD0通道采集的结果通过DMA的方式传输到UART0模块,你需要指定目标地址为UART_D的地址,不过需要注意的是,AD采样的结果为16位,UART_D为8位,所以你UART的偏移地址要为2,在PE里面可以看得很清楚。
Capture.PNG
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
1
最后登录
1970-1-1
发表于 2013-12-3 09:51:04 | 显示全部楼层

RE:KL25 DMA模块的一些问题

多谢分享
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

50

帖子

0

注册会员

Rank: 2

积分
117
最后登录
1970-1-1
 楼主| 发表于 2013-12-3 15:08:59 | 显示全部楼层

回复:KL25 DMA模块的一些问题

回复第 2 楼 于2013-12-03 09:18:23发表:
 如果你要把AD0通道采集的结果通过DMA的方式传输到UART0模块,你需要指定目标地址为UART_D的地址,不过需要注意的是,AD采样的结果为16位,UART_D为8位,所以你UART的偏移地址要为2,在PE里面可以看得很清楚。

非常感谢您的回复!
我试了一下 如果我的AD是8位精度的 根据资料并结合我实际测试的结果 那么其结果只是保存在了0x4003b010中,这样的话,address modulo是否不需要设置呢?像您在上述图片中设置的目的地址的address modulo是为了类似一个声明吧,是吗,防止那块存储区再被其他程序占用?
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

50

帖子

0

注册会员

Rank: 2

积分
117
最后登录
1970-1-1
 楼主| 发表于 2013-12-3 15:09:18 | 显示全部楼层

回复:KL25 DMA模块的一些问题

回复第 3 楼 于2013-12-03 09:51:04发表:
多谢分享 

多写顶贴
回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

459

帖子

0

中级会员

Rank: 3Rank: 3

积分
303
最后登录
2024-10-24
发表于 2013-12-3 15:48:21 | 显示全部楼层

回复:KL25 DMA模块的一些问题

回复第 4 楼 于2013-12-03 15:08:59发表:
回复第 2 楼 于2013-12-03 09:18:23发表:
 如果你要把AD0通道采集的结果通过DMA的方式传输到UART0模块,你需要指定目标地址为UART_D的地址,不过需要注意的是,AD采样的结果为16位,UART_D为8位,所以你UART的偏移地址要为2,在PE里面可以看得很清楚。

非常感谢您的回复!
我试了一下 如果我的AD是8位精度的 根据资料并结合我实际测试的结果 那么其结果只是保存在了0x4003b010中,这样的话,address modulo是否不需要设置呢?像您在上述图片中设置的目的地址的address modulo是为了类似一个声明吧,是吗,防止那块存储区再被其他程序占用?
address modulo相当于是申请一段缓存buffer,填满之后一块发出去,并且源地址和目的地址的modulo可以不一样,这种对于外设模块到SRAM的应用居多,因为SRAM的空间比较大,对于发送端modulo值到了中断,接收端modulo值到了中断,这是users可以处理数据,所以不只是防止存储区再被其他程序占用。

 
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

50

帖子

0

注册会员

Rank: 2

积分
117
最后登录
1970-1-1
 楼主| 发表于 2013-12-3 16:38:58 | 显示全部楼层

回复:KL25 DMA模块的一些问题

回复第 2 楼 于2013-12-03 09:18:23发表:
 如果你要把AD0通道采集的结果通过DMA的方式传输到UART0模块,你需要指定目标地址为UART_D的地址,不过需要注意的是,AD采样的结果为16位,UART_D为8位,所以你UART的偏移地址要为2,在PE里面可以看得很清楚。

找到问题了 不知道为什么 官方给的例程,通过UART0进行DMA的程序中,DMA_DCR_START位无需置1亦可以进行DMA传输,但是在AD0通道的传输中,必须将该位置1;另外,在使用DMA方式时,AD0通道不能使用软件触发,否则无法进行连续转换
 
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

50

帖子

0

注册会员

Rank: 2

积分
117
最后登录
1970-1-1
 楼主| 发表于 2013-12-3 16:39:00 | 显示全部楼层

回复:KL25 DMA模块的一些问题

回复第 2 楼 于2013-12-03 09:18:23发表:
 如果你要把AD0通道采集的结果通过DMA的方式传输到UART0模块,你需要指定目标地址为UART_D的地址,不过需要注意的是,AD采样的结果为16位,UART_D为8位,所以你UART的偏移地址要为2,在PE里面可以看得很清楚。

找到问题了 不知道为什么 官方给的例程,通过UART0进行DMA的程序中,DMA_DCR_START位无需置1亦可以进行DMA传输,但是在AD0通道的传输中,必须将该位置1;另外,在使用DMA方式时,AD0通道不能使用软件触发,否则无法进行连续转换
 
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

50

帖子

0

注册会员

Rank: 2

积分
117
最后登录
1970-1-1
 楼主| 发表于 2013-12-3 17:16:14 | 显示全部楼层

回复:KL25 DMA模块的一些问题

回复第 6 楼 于2013-12-03 15:48:21发表:
回复第 4 楼 于2013-12-03 15:08:59发表:
回复第 2 楼 于2013-12-03 09:18:23发表:
 
您好 谢谢您的帮助 我现在有个问题,就是我想以200khz的采样率进行采样,并将200khz采样得到的数据通过DMA通过SPA发出来,这样的话,为了控制这个200khz的采样率,我的DMA可以用200khz的PIT0通道触发,AD应该用多高的频率触发呢?
或者说,ADC0_RA的结果寄存器,在什么时候才更新?如果是在转换完成才更新,那么我可以定义更高的AD触发率,这样只要保证我的发数是200khz就可以了。
非常期待您的解答,谢谢了!

 

 

 
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 04:50 , Processed in 0.108676 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表