-
1
.
关于
SCAN
模式和连续采样模式的搭配使用说明:
1
)
SCA
N
模式设置有效时,会扫描所有设置的
AD
通道。扫描完成后,如果连续模式
无效,则停止采样;如果连续模式有效,则继续按
照通道设置顺序进行通道扫描采
样。
2
)
连续模
式设置有效时,软件一旦启动,会连续采样;如果此时设置了
SCAN
< br>模式,
则完成一次通道扫描采样,再从头来连续进行采样。
2
.
关
于
DMA
使用说明:
由于
AD
采样速度很快,
在通
道扫描模式进行
AD
采样时,
软件获取
采样数据可能出错,
这是因为上次采样数据没有及时取出,被后面的数据给覆盖掉了。这
时就需要采用启动
AD
采样完成的
DM
A
传输,以保证数据的正确性。
3
.
函数<
/p>
ADC_SoftwareStartConvCmd(ADC1, DISABLE)<
/p>
不能关闭
AD
。
以下代码经过验证:
//*******************************************
*********************************//
例
p>
1
:使用
AD
通道
扫描,连续模式,使用
DMA
传输
void ADC1_Config_DMA (void)
{
/*
DMA1 channel1 configuration
----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA__PeripheralBaseAddr =
ADC1_DR_Address;
DMA__MemoryBaseAddr =
(u32)&A_Volt_Data[0];
DMA__DIR =
DMA_DIR_PeripheralSRC;
DMA__BufferSize = 200;
DMA__PeripheralInc =
DMA_PeripheralInc_Disable;
DMA__MemoryInc =
DMA_MemoryInc_Enable;
DMA__PeripheralDataSize =
DMA_PeripheralDataSize_HalfWord;
DMA__MemoryDataSize =
DMA_MemoryDataSize_HalfWord;
DMA__Mode =
DMA_Mode_Circular;
DMA__Priority =
DMA_Priority_High;
DMA__M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1,
&DMA_InitStructure);
DMA_Cmd(DMA1_Channel1, ENABLE);
ADC__Mode = ADC_Mode_Independent;
ADC__ScanConvMode = ENABLE;
ADC__ContinuousConvMode = ENABLE;
ADC__ExternalTrigConv =
ADC_ExternalTrigConv_None;
ADC__DataAlign =
ADC_DataAlign_Right;
ADC__NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
/*
ADC1 regular channel8 configuration */
ADC_RegularChannelConfig(ADC1,
ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1,
ADC_Channel_11, 2, ADC_SampleTime_13Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1
*/
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1
reset calibaration register */
ADC_ResetCalibration(ADC1);
/*
Check the end of ADC2 reset calibration register
*/
while(ADC_GetResetCalibrationStatus(ADC1));
/*
Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/*
Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
}
此种
模式下,
应用程序可以用定时器配合进行工作,
启动
AD
时同时启动定时器,
当定时器
时间到时,调用函数
ADC_DMACmd(ADC1, DISABLE)<
/p>
关闭
AD
采样后的
DMA
传输功能,
此时
AD
继续工作,但是系统不去处理。在低功耗应用中,如果需要降低系统功耗,还可调
用
ADC_Cmd(ADC1, DISABLE)
关
闭
AD
。
//*************************************
***************************************//
< br>例
2
:使用
AD
通道扫描,非连续模式,使用
DMA
传输
void ADC1_Config_DMA (void)
{
/*
DMA1 channel1 configuration
----------------------------------------------*/
DMA_DeInit(DMA1_Channel1);
DMA__PeripheralBaseAddr =
ADC1_DR_Address;
DMA__MemoryBaseAddr =
(u32)&A_Volt_Data[0];
DMA__DIR =
DMA_DIR_PeripheralSRC;
DMA__BufferSize = 200;
DMA__PeripheralInc =
DMA_PeripheralInc_Disable;
DMA__MemoryInc =
DMA_MemoryInc_Enable;
DMA__PeripheralDataSize =
DMA_PeripheralDataSize_HalfWord;
DMA__MemoryDataSize =
DMA_MemoryDataSize_HalfWord;
DMA__Mode =
DMA_Mode_Circular;
DMA__Priority =
DMA_Priority_High;
DMA__M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1,
&DMA_InitStructure);