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的前半部分。。。。
|