1 RCC_ADCCLKConfig(RCC_PCLK2_Div8); //設置ADC分頻因子8 72M/8=9,ADC最大時間不能超過14M
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1工作在獨立模式 2 3 ADC_InitStructure.ADC_ScanConvMode = ENABLE;//模數轉換工作在掃描模式(多通道) 4 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//ADC工作在非連續模式 5 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;//定時器3的TRGO觸發轉換 6 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//ADC數據右對齊 7 ADC_InitStructure.ADC_NbrOfChannel = 2;//轉換的ADC通道的數目爲2 8 ADC_Init(ADC1, &ADC_InitStructure);//要把以下參數初始化ADC_InitStructure 9 ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 1, ADC_SampleTime_13Cycles5);//ADC1通道6 ,採樣時間爲13.5個週期 10 ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 2, ADC_SampleTime_13Cycles5);//ADC1通道7 ,採樣時間爲13.5個週期 11 ADC_DMACmd(ADC1, ENABLE); //使能ADC1的DMA傳輸方式 12 ADC_Cmd(ADC1, ENABLE);//使能ADC1 13 ADC_ResetCalibration(ADC1);//重置ADC1的校準寄存器 14 while(ADC_GetResetCalibrationStatus(ADC1)); 15 ADC_StartCalibration(ADC1); //開始校準ADC1 16 while(ADC_GetCalibrationStatus(ADC1)); //等待校準完成 17 ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能ADC1軟件轉換
其中值得注意的是:
1 DMA_DeInit(DMA1_Channel1); 2 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//傳輸的源頭地址 3 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCConvertedValue;//目標地址 4 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外設作源頭 5 DMA_InitStructure.DMA_BufferSize = 2000;//數據長度爲2000 6 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外設地址寄存器不遞增 7 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//內存地址遞增 8 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外設傳輸以字節爲單位 9 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//內存以字爲單位 10 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//循環模式 11 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//4優先級之一的(高優先) 12 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非內存到內存 13 DMA_Init(DMA1_Channel1, &DMA_InitStructure);//根據以上參數初始化DMA_InitStructure 14 15 DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);//配置DMA1通道1傳輸完成中斷 16 DMA_Cmd(DMA1_Channel1, ENABLE);//使能DMA1
1 NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn; 2 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//搶佔優先級設置爲1 3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子優先級設置爲1 4 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中斷使能 5 NVIC_Init(&NVIC_InitStructure);//按指定參數初始化中斷
1 void DMA1_Channel1_IRQHandler(void) 2 { 3 if(DMA_GetITStatus(DMA1_IT_TC1))//判斷通道1是否傳輸完成 4 { 5 DMA_ClearITPendingBit(DMA1_IT_TC1); //清除通道1傳輸完成標誌位 6 7 ////////////此處應編寫代碼從DMA指向的內存區讀走數據,否則可能被覆蓋////////// 8 9 10 } 11 }
1 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3時鐘 2 3 TIM_TimeBaseStructure.TIM_Period = 1000-1; 4 TIM_TimeBaseStructure.TIM_Prescaler = 72-1; 5 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //採樣分頻TIM_CKD_DIV1 6 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數 7 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 8 9 TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);//設置輸出TRGO信號 10 TIM_Cmd(TIM3, ENABLE);