OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4527|回复: 10

ADC DMA现象求解

[复制链接]

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2014-10-22 14:24:56 | 显示全部楼层 |阅读模式
5金钱
1.当DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1->DR;时,接收数组中数据不正常。ADC_IT_EOC正常生成
2.当DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);时,接收数组中数据正确。ADC_IT_EOC却不再产生

void ADC_Int_Init(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  //中断优先级NVIC设置
  NVIC_InitStructure.NVIC_IRQChannel =  ADC1_2_IRQn;  //DMA1中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级0级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
}

static uint16_t count = 0;
void ADC1_2_IRQHandler()  
{  
  
    if (ADC_GetITStatus(ADC1, ADC_IT_EOC))
    {   
      count++;      
      printf("****************ADC_IT_EOC  %d***************\r\n", count);
      printf("DMA还剩下:%d\r\n", DMA_GetCurrDataCounter(DMA1_Channel1));
    }  
    ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);                   //清除DMA中断标志位  
}

单通道时,使用1,数组数据却是正确的。
多通道时使用1,数组数据错误
多通道使用2,数组数据正确,但不产生ADC_IT_EOC。

最佳答案

查看完整内容[请看2#楼]

参考手册:  EOC: End of conversion This bit is set by hardware at the end of a group channel conversion (regular or injected). It is cleared by software or by reading the ADC_DR.  //DMA将数据读走了,所以没有了adc的eoc了 0: Conversion is not complete 1: Conversion complete 经测试:使用非DMA方式读取,证明确实是DMA将DR中数据读走后,EOC标 ...
小小蜗牛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-22 14:24:57 | 显示全部楼层
参考手册: 
EOC: End of conversion
This bit is set by hardware at the end of a group channel conversion (regular or injected). It is
cleared by software or by reading the ADC_DR.  //DMA将数据读走了,所以没有了adc的eoc了
0: Conversion is not complete
1: Conversion complete

经测试:使用非DMA方式读取,证明确实是DMA将DR中数据读走后,EOC标志自动清掉了。
但依然会进入中断处理函数,判断时,却已经被清掉了,一直不能成立。
小小蜗牛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-22 23:30:19 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-23 13:14:19 | 显示全部楼层
伤心。使用(uint32_t)&(ADC1->DR),还是不打印中断处理的信息。只是把ADC_ITConfig,adc2也使能了的话,才会打印,但是是乱的数字。
小小蜗牛
回复

使用道具 举报

42

主题

208

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2014-6-12
在线时间
35 小时
发表于 2014-10-23 15:52:26 | 显示全部楼层
回复【3楼】jiutianshenjian:
---------------------------------
 (uint32_t)&(ADC1->DR)这样得到的才是地址,(uint32_t)ADC1->DR这个得到的不是地址,至于其他的应该是你的配置问题
回复

使用道具 举报

42

主题

208

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2014-6-12
在线时间
35 小时
发表于 2014-10-23 15:54:10 | 显示全部楼层
这个是我用的代码你可以看一下

DMA+ADC1+LCD.zip

5.14 MB, 下载次数: 214

回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-23 16:06:12 | 显示全部楼层
回复【5楼】郭刘阳:
---------------------------------
看了下,跟我的不一样,

1.你用的软件触发,我是定时器触发。我试了定时器触发,我只能把ADC1触发方式选为外部才能成功,软件触发方式根本无法按定时器的时间触发。
2.你用的单通道,我3*2个通道。
3.你是ADC1,我的是双ADC同步规则

外设地址就设置为你说的这个了,就是再也进不去ADC_IT_EOC中断去查看完成次数了。
调试的时候我改为没有&的,用到硬件上,就使用DMA1_IT_TC1中断判断来处理数据了。
小小蜗牛
回复

使用道具 举报

42

主题

208

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2014-6-12
在线时间
35 小时
发表于 2014-10-23 18:05:13 | 显示全部楼层
哦哦,爱莫能助,没研究那么深,希望你的问题能早日解决
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-23 18:55:00 | 显示全部楼层
回复【8楼】郭刘阳:
---------------------------------
这个搞清楚了,6楼就是答案。开始的地址给错了,所以没读DR,就有EOC.地址给对了后,读走了DR的值,就把完成标志清掉了。
小小蜗牛
回复

使用道具 举报

42

主题

208

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2014-6-12
在线时间
35 小时
发表于 2014-10-23 19:23:48 | 显示全部楼层
恭喜了,嘿嘿
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
 楼主| 发表于 2014-10-23 19:30:43 | 显示全部楼层
回复【10楼】郭刘阳:
---------------------------------
我是看英文手册发现的,看中文就一眼过去,没任何印象。唉,看来还得仔细看手册啊。
小小蜗牛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 06:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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