void Adc_Init(u16 period)
{
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStruct);
RCC->APB2RSTR|=1<<9; //ADC1復位
RCC->APB2RSTR&=~(1<<9);//復位結束
RCC->APB2RSTR&=~(1<<10);//復位結束
RCC->CFGR&=~(3<<14); //分頻因子清零
RCC->CFGR|=2<<14; //SYSCLK/DIV2=12M ADC時鐘設置為12M,ADC最大時鐘不能超過14M!
ADC1->CR1=0x00070000;
ADC1->CR2=0x00180100;
ADC1->SQR3=0x0000000A;
ADC1->SMPR2=0x00000000;
ADC2->CR1=0x00000000;
ADC2->CR2=0x00180100;
ADC2->SMPR1=0x00000000; //通道10 1.5周期,使用交替模式,采樣時間小于7.5 ADCclock
ADC2->SMPR2=0x00000000;
ADC1->CR2|=1<<3; //使能復位校準
while(ADC1->CR2&1<<3); //等待校準結束
ADC1->CR2|=1<<2; //開啟AD校準
while(ADC1->CR2&1<<2); //等待校準結束
ADC2->CR2|=1<<0; //開啟AD轉換器
ADC2->CR2|=1<<3; //使能復位校準
while(ADC2->CR2&1<<3); //等待校準結束
ADC2->CR2|=1<<2; //開啟AD校準
while(ADC2->CR2&1<<2); //等待校準結束
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
TIM_Cmd(TIM3,ENABLE);
}
void ADC1_DMA_Config(u32 MemoryAddress,u16 num)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=0x40012400+0x4c;
DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddress;
DMA_InitStructure.DMA_BufferSize=num;
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Word;
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;
DMA_Init(DMA1_Channel1,&DMA_InitStructure);
DMA_Cmd(DMA1_Channel1 ,ENABLE);
}
10k時