OpenEdv-开源电子网

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

求助:设置了DMA外设ADC的基地址之后,读取了两个通道的模拟输入值,这两个值是如何提取出来的?

[复制链接]

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-20
在线时间
31 小时
发表于 2016-9-25 21:55:30 | 显示全部楼层 |阅读模式
1金钱
void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
该函数规定了cpar——DMA 外设 ADC 基地址,还有cmar——DMA 内存基地址,以及cndtr——DMA 通道的 DMA 缓存的大小。
那么,我用ADC1的通道0和1采集了模拟量,并将数据传输到cndtr——DMA 通道的 DMA 缓存里面,然后应该如何将两个通道的数据分别提取出来呢?

最佳答案

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

读取cmar地址所指向的内存空间,就可以读取你的数据了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-25 21:55:31 | 显示全部楼层
读取cmar地址所指向的内存空间,就可以读取你的数据了。
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-20
在线时间
31 小时
 楼主| 发表于 2016-9-25 22:14:19 | 显示全部楼层
还有这个缓存区u16 cndtr的单位是什么?正点原子的例程里面是“SEND_BUF_SIZE 8200”,大小是8200,而我看别人分享的一些工程,有的是直接等于“6(因为6个通道)”,这有什么差别吗?
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-20
在线时间
31 小时
 楼主| 发表于 2016-9-25 23:19:11 | 显示全部楼层
规定了缓冲区之后,收集到的数据是一连串的吗?需要编写怎样的函数将每个通道的数据提取出来呢?
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-20
在线时间
31 小时
 楼主| 发表于 2016-9-29 22:04:01 | 显示全部楼层
终于弄明白啦!void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)的第三个参数u16 cndtr指的是一共要进行采样的次数,如果是一个通道采样一次,那么这个就等于1,如果是两个通道各采样一次,那么这个就是20,如此类推
[mw_shl_code=applescript,true]#define X 10 //取10次平均值
#define Y 2  //2路AD
DMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)&ADC_Value,X*Y);[/mw_shl_code]
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-20
在线时间
31 小时
 楼主| 发表于 2016-9-29 22:08:42 | 显示全部楼层
airlovelj 发表于 2016-9-29 22:04
终于弄明白啦!void DMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)的第三个参数u ...

如果在adc.c里面设好了通道的采样顺序,那么就会按照顺序进行采样,返回值的时候也是按照这个顺序返回的,比如说,ADC1_IN0是第一顺位,ADC1_IN1是第二顺位,那么返回的时候,返回的第一个值就是ADC1_IN0的值啦~
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5 );        
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5 );   
回复

使用道具 举报

9

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-20
在线时间
31 小时
 楼主| 发表于 2016-9-29 22:11:31 | 显示全部楼层
如果是ADC多通道多次采样的话,大家一定要记得在main()函数之前写一个求每个通道多次采样后取得的平均值的函数啊,也就是所谓的滤波函数啦~
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 14:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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