打印
[技术问答]

M451 ADC PDMA 遇到的问题

[复制链接]
3987|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wlf19890312|  楼主 | 2016-3-26 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC, DMA, pd, AN, se
最近初步了解了 新塘的M451系列单片机对ADC 这部分 还是不太了解 有些问题想请教大家 功能如下:
1 定时器触发ADC两个通道连续转换。(本质上是 :定时器0 触发ADC通道1转换 ,ADC通道1转换完成后立马开始转换ADC通道2,这样的功能算是基本上很常见了,基本上每个单片机都有)。
2 每个通道转换完成后数据立马送往DMA缓冲区,并且开启了DMA传输完成中断,我需要每个通道转换65次所以 所以我开辟了130个U16大小的DMA缓冲区。
问题:现在是 DMA目标地址是递增的 (必须这样 否则数据会覆盖),源地址我不确定是否递增(源地址是ADC转换模组数据寄存器:递增不递增 我都尝试过一样不能进入中断 进入中断的时候 ADC 通道1通道2刚好每个转换了65次)。并且 DAC的PDMA功能是正常的  中断也是正常的  。程序如下:
EADC_Open(EADC, EADC_CTL_DIFFEN_SINGLE_END);

  EADC_SetInternalSampleTime(EADC, 6);
  /* Configure the sample 5 module for analog input channel 1 and enable timer0 trigger source */
  EADC_ConfigSampleModule(EADC, 1, EADC_TIMER0_TRIGGER, 1);
  /* Configure the sample 6 module for analog input channel 2 and enable ADINT0 trigger source */
  EADC_ConfigSampleModule(EADC, 2, EADC_ADINT0_TRIGGER, 2);
  /* Clear the A/D ADINT0 interrupt flag for safe */
  EADC_CLR_INT_FLAG(EADC, 0x1);
  /* Disable the sample module 7 interrupt */
  EADC_ENABLE_INT(EADC, 0x2);//Enable sample module  A/D ADINT1 interrupt.目前找不到合适的方法去触发下一个通道
    /* Open PDMA Channel 0,2 */
    PDMA_Open(0x5);   
   
    /* transfer width is half word(16 bit) and transfer count is 6 */
    PDMA_SetTransferCnt(2, PDMA_WIDTH_16, 130);
    /* Set source address as EADC data register(no increment) and destination address as g_i32ConversionData array(increment) */
    PDMA_SetTransferAddr(2, (uint32_t)&EADC->DAT[1],PDMA_SAR_INC, (uint32_t)g_i32ConversionData, PDMA_DAR_INC);
    /* Select PDMA request source as ADC RX */
    PDMA_SetTransferMode(2, PDMA_ADC_RX, FALSE, 0);
    /* Set PDMA as single request type for EADC */
    PDMA_SetBurstType(2,PDMA_REQ_BURST,PDMA_BURST_2);
   
    PDMA_EnableInt(2, PDMA_INT_TRANS_DONE);

    NVIC_EnableIRQ(PDMA_IRQn);
沙发
wlf19890312|  楼主 | 2016-3-26 19:44 | 只看该作者
已经改过来了 必须定时器先触发 采样模组2 但是问题又来了 即使定时器停止了 ADC 也不会停止

使用特权

评论回复
板凳
Thethree| | 2016-3-26 23:05 | 只看该作者
如果要设置一定采样率的话必须用定时器触发,还得设置好是上升沿还是下降沿

使用特权

评论回复
地板
capturesthe| | 2016-3-26 23:40 | 只看该作者
DMA设置的时候设置两个缓冲区就可以了

使用特权

评论回复
5
wlf19890312|  楼主 | 2016-3-27 09:55 | 只看该作者
capturesthe 发表于 2016-3-26 23:40
DMA设置的时候设置两个缓冲区就可以了

你这个建议 不错 我觉得可以试一下

使用特权

评论回复
6
wlf19890312|  楼主 | 2016-3-27 09:56 | 只看该作者
Thethree 发表于 2016-3-26 23:05
如果要设置一定采样率的话必须用定时器触发,还得设置好是上升沿还是下降沿 ...

现在还有个问题  定时器触发我也尝试了  但是停止定时器的时候转换 还在继续 并不能停止中断

使用特权

评论回复
7
wlf19890312|  楼主 | 2016-3-27 18:21 | 只看该作者
wlf19890312 发表于 2016-3-27 09:55
你这个建议 不错 我觉得可以试一下

朋友 你好 我已经尝试了  不行 开辟了两个缓冲区  只能正常传输一个通道的 数据 另外一个通道哦 无法传输 但是单从  ADC 触发的情况看  定时器 触发 ADC 功能是正常的

使用特权

评论回复
8
energyplants| | 2016-3-27 20:18 | 只看该作者
DMA开辟的深度和定义的缓冲区能否一致

使用特权

评论回复
9
wlf19890312|  楼主 | 2016-3-28 11:27 | 只看该作者
energyplants 发表于 2016-3-27 20:18
DMA开辟的深度和定义的缓冲区能否一致

已经确定了 新唐的 M4 ADC 只能一个通道连接到DMA  FAE 也是这么回答的

使用特权

评论回复
10
Harvard| | 2016-3-28 12:25 | 只看该作者
感觉玩复杂了嘛 ,一个定时器搞定. 定期切换adc通道

使用特权

评论回复
11
wlf19890312|  楼主 | 2016-3-28 12:46 | 只看该作者
Harvard 发表于 2016-3-28 12:25
感觉玩复杂了嘛 ,一个定时器搞定. 定期切换adc通道

还要干  其他事情的

使用特权

评论回复
12
heaven_xiyu| | 2016-3-28 15:59 | 只看该作者
Harvard 发表于 2016-3-28 12:25
感觉玩复杂了嘛 ,一个定时器搞定. 定期切换adc通道

下个项目也打算用M451做AD采样,所以之前也看了下官方的例程。好像说用dma 做传输 不能用AD中断,dma的目标地址是EADC_CURDAT,我想是不是当第一个adc模块采样完成后 dma直接把第一个采样的值从EADC_CURDAT传输到目标地址,当第二个adc模块采样完成后dma再从把第二个采样的值从EADC_CURDAT传输到目标地址+1,依次把所有的ad采样得到的值放入目标地址。

使用特权

评论回复
13
Harvard| | 2016-3-28 15:59 | 只看该作者
嗯嗯 明白了. 不过dma总归是好东西

使用特权

评论回复
14
wlf19890312|  楼主 | 2016-3-29 08:22 | 只看该作者
heaven_xiyu 发表于 2016-3-28 15:59
下个项目也打算用M451做AD采样,所以之前也看了下官方的例程。好像说用dma 做传输 不能用AD中断,dma的目 ...

楼上想法 不错 但是事与愿违!新唐的 DMA通道只能连接一个ADC通道 。并且ADC的DMA源地址只能设置成转换模组数据寄存器地址、并且不能递增,ADC通道不能连续转换如果想实现连续转换这个功能必须开启转换模组中断才能辅助实现这个功能!所以楼主的设想这个功能已经限制死了 你不能这么做!并且DMA地址不能循环计数!确定不能循环计数!DAC也是如此所以你要是想产生一个连续不断的波形必须要CPU来干预,可怜的M4内核,空有一身功夫却要用来辅助DMA干这些“下等活”,我猜想新唐设计M4的时候可能就没有了解过市场需求,当然只是猜想,以上所说功能低端的STM32\GD32都不会出现,因为他们的ADC DMA通道传输机制是只要数据转换完成就会发生数据传输,不管是哪个通道转换,因此只要设置好转换顺序DMA缓冲区里面的ADC转换结果就是是按照通道转换顺序来的。

使用特权

评论回复
15
wangguanfu| | 2016-11-22 21:02 | 只看该作者
其实就是个bug,这dma有毛用  买了评估板  玩了几天就吃灰了,完全闭门造车的玩意

使用特权

评论回复
16
643757107| | 2016-11-22 21:54 | 只看该作者
可以设置两个缓冲区?我一会儿找个板子试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

27

帖子

1

粉丝