打印

ADC与DMA

[复制链接]
3947|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxinfa|  楼主 | 2009-3-22 00:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从51转过来,正在苦读李宁博士的《基于MDK的STM32处理器开发应用》和相关pdf,还没买板子,这两天就打算买。
在ADC部分有些不太明白,书中有这样的描述“因为规则通道转换的值被储存在一个唯一的数据寄存器中,所以当转换多个规则通道时需要使用DMA,这可以避免丢失已经存储在ADC_DR寄存器中的数据”,本书及本论坛的一些例子都是对一个通道进行采样,这样的话有必要用DMA吗?另外,我没有看到采两个以上通道的例子,在lib中也没有找到相关函数。那么如果把同一个AD的两个以上的的通道作为规则通道,应该怎么初始化DMA以及怎么读数据?用下面这种方式不行吧?
u16 DataValue; 
DataValue = ADC_GetConversionValue(ADC1);
文档中对ADC_GetConversionValue这么解释“返回最近一次ADCx规则组的转换结果”,那前面通道转换的结果在哪里啊?
谢谢指教,初学者,见笑了,感觉还是对文档理解的不到位
沙发
lut1lut| | 2009-3-24 11:54 | 只看该作者

这里有一个对两个通道采样的例子

1.
“本书及本论坛的一些例子都是对一个通道进行采样,这样的话有必要用DMA吗?”
当然一个通道的话,可以每次转换结束后在中断中处理,不用DMA。


2.
“另外,我没有看到采两个以上通道的例子,在lib中也没有找到相关函数”
其实改的也不多:
1) DMA_InitStructure.DMA_BufferSize : 1--> 2
2) ADC_InitStructure.ADC_NbrOfChannel : 1 --> 2
3) 添加一个通道:
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2, ADC_SampleTime_55Cycles5);
4) 当然GPIO配置时,添加的那个通道也要配置
5) DMA目标地址从单一变量改成数组
vu16 ADCConvertedValue[2]={0,0};

这样ADCConvertedValue[0]和ADCConvertedValue[1]就分别装的是通道14和通道15的采样值了。

由于DMA配置成为circular模式,所以两个通道的最新采样值,会不断覆盖ADCConvertedValue[]。如果希望f/w对采样值进行处理,可以两个办法:

1。DMA不用circular模式,用normal模式

这样的话,对两个通道分别采样一次后,DMA停止。可以由此出发中断,或者轮训EOC标志,来对第一次采样的两个通道的值进行处理。
由于DMA不是cicular模式,所以DMA停止后,需要重新初始化DMA_InitStructure.DMA_MemoryBaseAddr,使它指向ADCConvertedValue[]首地址。再开启DMA进行下一次转换


2。DMA还是使用circular模式,但是把ADCConvertedValue[]数组开大一些,比如ADCConvertedValue[20]。随之DMA buffersize也改成10。

这样的话,[0][2][4]。。。[18]放的是通道14的每次采样值;[1][3][5]。。。[19]放的是通道15每次的采样之。由于DMA采用了circular模式,所以20个采样完后,又从[0]开始覆盖以前的采样值。于是f/w可以使用DMA half transfer complete中断。即当ADCConvertedValue[0]~ADCConvertedValue[9]被填满后,f/w处理两个通道的前5次采样值;与此同时,DMA继续进行后10次的采样值搬移。当后10个采样值放好后,f/w又处理这些数据;同时DMA继续采样,并且把采样值放到ADCConvertedValue的前半部分。。。。

使用特权

评论回复
板凳
mxinfa|  楼主 | 2009-3-25 23:12 | 只看该作者

非常感谢

使用特权

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

本版积分规则

33

主题

198

帖子

1

粉丝