楼主: retome

[已解决] k60 mk60fx512dn 的adc2的DMA如何配置(已解决)

[复制链接]

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-10 11:49:28 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-9 18:14
在内部论坛里面有一个关于这方面类似的问题,有具体的ADC DMA的配置,还有问题解决后修改的代码,是K70的 ...

我确认我的TCD 和 dmamux1 都没有配置错误
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-10 13:42:10 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-10 11:47
好的,我知道了。
待会有空,我会配一个试看看。
然后再回复你。

谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-11 15:54:47 | 显示全部楼层
楼主你好!
不好意思,迟给你回复了。
我刚刚测试了,使用ADC2转换triggerDMA转换是可以成功的。
我认为,不不仅仅需要查看DMAMUX,DMA的配置,你还要保证你的ADC2的DMA trigger是使能的,并且先单独测试下你的ADC2能转换完成,比如COCO置位了。
这里我贴出DMA的配置代码,供你参考:
void Dma_Conif(uint8_t Dma_Chn, uint8_t DmaMux_Sou, uint32_t Sou, uint32_t Add,uint16_t Block_Size)
{
     

      
      SIM_SCGC7 |= SIM_SCGC7_DMA_MASK;   //DMA CLOCK
     
      SIM_SCGC6 |= SIM_SCGC6_DMAMUX1_MASK;  // DMAMUX CLOCK

      DMAMUX_CHCFG_REG(DMAMUX1_BASE_PTR, Dma_Chn) = (
        0|
        DMAMUX_CHCFG_ENBL_MASK  |                     // enalbe DMA channle

        DMAMUX_CHCFG_SOURCE(DmaMux_Sou)              // assign DMA trigger source

      );

      DMA_CR = 0 | DMA_CR_GRP1PRI(1);

      DMA_BASE_PTR->TCD[Dma_Chn+16].SADDR = Sou;     //DMA source address
      DMA_BASE_PTR->TCD[Dma_Chn+16].DADDR = Add; //0x20000002;//Add;      // DMA destination address
      DMA_BASE_PTR->TCD[Dma_Chn+16].NBYTES_MLNO = 1;   // minor byte transfer count

      DMA_BASE_PTR->TCD[Dma_Chn+16].ATTR = (           // DMA transsmit attributes
              0    |
              DMA_ATTR_SMOD(0)    |                  //Source address modulo feature is disabled
              DMA_ATTR_SSIZE(0)    |                  // source data transfer size is 8-bit
              DMA_ATTR_DMOD(0)    |                  //destination address modulo feature is disabled
              DMA_ATTR_DSIZE(0)                   // destination data transfer size is 8-bit
              );
      DMA_BASE_PTR->TCD[Dma_Chn+16].SOFF = 0x0000;   // the current source address to next is one byte
      //DMA_BASE_PTR->TCD[Dma_Chn].DOFF = 0x0002;   // the destination address doesn't change
      DMA_BASE_PTR->TCD[Dma_Chn+16].DOFF = 0x0000;   // the destination address doesn't change
      DMA_BASE_PTR->TCD[Dma_Chn+16].SLAST = 0x00;    // end major_loop not change source address
      DMA_BASE_PTR->TCD[Dma_Chn+16].DLAST_SGA = 0x00; // end major_loop not change destination address
      DMA_BASE_PTR->TCD[Dma_Chn+16].CITER_ELINKNO = DMA_CITER_ELINKNO_CITER(Block_Size);  // major loop current count
      DMA_BASE_PTR->TCD[Dma_Chn+16].BITER_ELINKNO = DMA_CITER_ELINKNO_CITER(Block_Size);  // major lteration count

      DMA_BASE_PTR->TCD[Dma_Chn+16].CSR = 0;        // clear 0
    //  DMA_INT &=~(1<<(Dma_Chn+16));                        // disalbe interrupt
    //  DMA_BASE_PTR->TCD[Dma_Chn+16].CSR &= ~DMA_CSR_INTMAJOR_MASK; // disable major_loop interrupt

      //  DMA_BASE_PTR->TCD[Dma_Chn].CSR |= 1;        // software start
    //  DMA_ERQ &= ~(1 << (Dma_Chn+16));                            //close DMA channle*/
}
void Start_Dma(uint8_t Dma_Chn)
{
    DMA_ERQ |= (1 << (Dma_Chn+16));                           //enalbe DMA Dma_Chn channle
    //DMA_ERQ |= (1 << (Dma_Chn));
}

回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-11 16:00:58 | 显示全部楼层
为了便于你查看,我这里上传我的测试代码。
代码功能,通过ADC2trigger,让DAM把如下变量
uint8_t sou = 0x12;
uint8_t des = 0x34;
的sou 值传到des中。
当然, 你也可以直接把转换的值传到你想要的目的地址。
这里仅仅给你参考。
最终结果是des的值也被刷为0X12了,是通过DMA方式传过去的。
K60_120M_DMA_ADC2.rar (1.31 MB, 下载次数: 41)
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-12 18:05:04 | 显示全部楼层
惊喜啊 感谢您的回复,我看了你上次说有空再看看,这,这么快就回复了,太厉害1
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-15 11:02:09 | 显示全部楼层
retome 发表于 2014-12-12 18:05
惊喜啊 感谢您的回复,我看了你上次说有空再看看,这,这么快就回复了,太厉害1 ...

不客气,因为如果调代码还是要花时间的,而且一般不会立刻给你调,手上的问题比较多,所以要一一处理。
后续如果有问题,欢迎继续发帖交流啊。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-15 15:33:49 | 显示全部楼层
DMA_CR = 0 | DMA_CR_GRP1PRI(1);
这句话有什么用?
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-16 14:02:05 | 显示全部楼层
retome 发表于 2014-12-15 15:33
DMA_CR = 0 | DMA_CR_GRP1PRI(1);
这句话有什么用?

因为没有这句话导致我的配置无法起效,这句话有点神奇
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-12-17 12:57:07 | 显示全部楼层
retome 发表于 2014-12-15 15:33
DMA_CR = 0 | DMA_CR_GRP1PRI(1);
这句话有什么用?

关于group的使用,请查看参考手册的Control Register (DMA_CR),前面有详细的讲解内容。
• Group 1 contains channels 31-16
• Group 0 contains channels 15-0


回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

38

帖子

0

注册会员

Rank: 2

积分
128
最后登录
2014-12-31
 楼主| 发表于 2014-12-18 17:25:09 | 显示全部楼层
FSL_TICS_ZJJ 发表于 2014-12-17 12:57
关于group的使用,请查看参考手册的Control Register (DMA_CR),前面有详细的讲解内容。
• Group 1 cont ...

如何在IAR打开MK60FX512的硬件浮点运算,好像我一选上这个VFPv4选项,我就无法启动PDB模块!!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-20 16:55 , Processed in 0.111097 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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