你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用DMA传输ADC转换结果, 数据不正确

[复制链接]
cpev 提问时间:2018-3-15 09:39 /
阅读主题, 点击返回1楼
收藏 评论23 发布时间:2018-3-15 09:39
23个回答
废鱼 回答时间:2018-3-15 11:26:21
看配置差不多,值应该是多少,采集到的是多少。
cpev 回答时间:2018-3-15 11:30:57
安 发表于 2018-3-15 11:26
看配置差不多,值应该是多少,采集到的是多少。

AD转换结果为0x04ef, DMA传输后得到的结果为0x00ef, 高8位被丢掉了。
cpev 回答时间:2018-3-15 12:38:45
安 发表于 2018-3-15 11:26
看配置差不多,值应该是多少,采集到的是多少。

控制部分是这样做的,需要每100ms转换一次,并用DMA传输  
         ADC_DMACmd(ADC1,ENABLE); //开启ADC1 DMA传输                  
         ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换启动功能                    
         while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); //等待转换结束         大约56us              
         while(DMA_GetFlagStatus(DMA1_FLAG_TC1) != RESET)
         {            
            DMA_ClearFlag(DMA1_FLAG_TC1);    //清除通道1传输完成标志
            break;
         }       
         ADC_DMACmd(ADC1,DISABLE);                     //关闭ADC1 DMA传输         
废鱼 回答时间:2018-3-15 14:00:31
楼主,方便把你的代码共享一下吗?我找个板子测试一下。
也可以仿真的情况下,看一下寄存器的值和DMA取到的值是不是一致。我使用很长时间DMA中断,发生的问题基本是因为自己配置错误导致。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

wenyangzeng 回答时间:2018-3-15 14:57:35
本帖最后由 wenyangzeng 于 2018-3-15 15:01 编辑

楼主既然一次扫描8个通道4次,就不应该将这里设成禁止:
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
这样的话ADC只转换8个通道一次就结束,DMA不知道,它会硬要凑足32个数据,后面的数据必定对不上号
要么设成ENABLE,要么32改成8
还有字长应该设成:
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

埃斯提爱慕 回答时间:2018-3-15 15:38:18
提示: 作者被禁止或删除 内容自动屏蔽
小涂邦邦 回答时间:2018-9-5 23:39:54
我也遇到了同样的问题,就是DMA得到的结果只有低8位,没有高8位。例如,ADC采样的值位0x0A10,但DMA对应的内存变量值为0x0010。也就是高位传不过来。请问楼主是怎么解决的。
OHWIXP 回答时间:2018-9-24 16:00:44
本帖最后由 OHWIXP 于 2018-9-24 16:30 编辑

楼主程序里DMA传输数据宽度部分,应该是配置错了:
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; //数据宽度为32位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word; //数据宽度为32位
——改为:
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //数据宽度为16位
        DMA_InitStructure.DMA_MemoryDataSize =  DMA_MemoryDataSize_HalfWord; //数据宽度为16位
QiaoKun 回答时间:2021-10-14 15:30:56
OHWIXP 发表于 2018-9-24 16:00
楼主程序里DMA传输数据宽度部分,应该是配置错了:
        DMA_InitStructure.DMA_PeripheralDataSize = D ...

非常感谢,我也犯了这个错误
12

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版