1,初始化代碼 ADC_InitTypeDef?ADC_InitStructure?=?{?0?}; GPIO_InitTypeDef?GPIO_InitStructure?=?{?0?}; DMA_InitTypeDef?DMA_InitStructure?=?{?0?}; NVIC_InitTypeDef?NVIC_InitStructure?=?{?0?}; RCC_APB2PeriphClockCmd?(?RCC_APB2Periph_GPIOA,?ENABLE?); RCC_APB2PeriphClockCmd?(?RCC_APB2Periph_ADC1,?ENABLE?); RCC_AHBPeriphClockCmd?(?RCC_AHBPeriph_DMA1,?ENABLE?); RCC_ADCCLKConfig?(?RCC_PCLK2_Div8?); GPIO_InitStructure.GPIO_Pin?=?GPIO_Pin_3?|?GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_AIN; GPIO_Init?(?GPIOA,?&GPIO_InitStructure?); ADC_DeInit?(?ADC1?); ADC_InitStructure.ADC_Mode?=?ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode?=?ENABLE; ADC_InitStructure.ADC_ContinuousConvMode?=?ENABLE; ADC_InitStructure.ADC_ExternalTrigConv?=?ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign?=?ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel?=?PD_CHANNEL_NUM; ADC_Init?(?ADC1,?&ADC_InitStructure?); ADC_RegularChannelConfig?(?ADC1,?ADC_Channel_3,?1,?ADC_SampleTime_239Cycles5?); ADC_RegularChannelConfig?(?ADC1,?ADC_Channel_6,?2,?ADC_SampleTime_239Cycles5?); ADC_Cmd?(?ADC1,?ENABLE?); ADC_BufferCmd?(?ADC1,?DISABLE?);?//?disable?buffer ADC_ResetCalibration?(?ADC1?); while?(ADC_GetResetCalibrationStatus(ADC1)) ; ADC_StartCalibration?(?ADC1?); while?(ADC_GetCalibrationStatus(ADC1)) ; Calibrattion_Val?=?Get_CalibrationValue?(?ADC1?); DMA_DeInit?(?DMA1_Channel1?); DMA_InitStructure.DMA_PeripheralBaseAddr?=?(u32)?&ADC1->RDATAR; DMA_InitStructure.DMA_MemoryBaseAddr?=?(u32)?adc_dma_buf; DMA_InitStructure.DMA_DIR?=?DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize?=?ADC_DMA_BUF_SIZE?*?PD_CHANNEL_NUM; DMA_InitStructure.DMA_PeripheralInc?=?DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc?=?DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize?=?DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize?=?DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode?=?DMA_Mode_Circular; DMA_InitStructure.DMA_Priority?=?DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M?=?DMA_M2M_Disable; DMA_Init?(?DMA1_Channel1,?&DMA_InitStructure?); DMA_ITConfig?(?DMA1_Channel1,?DMA_IT_TC,?ENABLE?); NVIC_InitStructure.NVIC_IRQChannel?=?DMA1_Channel1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority?=?4; NVIC_InitStructure.NVIC_IRQChannelCmd?=?ENABLE; NVIC_Init?(?&NVIC_InitStructure?);
2,數(shù)據(jù)采集夠之后,在
DMA1_Channel1_IRQHandler
中,停止采集:
DMA_Cmd?(?DMA1_Channel1,?DISABLE?); ADC_DMACmd?(?ADC1,?DISABLE?); DMA1_Channel1->CNTR?=?0; ADC_SoftwareStartConvCmd?(?ADC1,?DISABLE?);
3,啟動采集
DMA_Cmd?(?DMA1_Channel1,?DISABLE?); DMA1_Channel1->CNTR?=?user_curve_avg_size?*?2; DMA_Cmd?(?DMA1_Channel1,?ENABLE?); ADC_DMACmd?(?ADC1,?ENABLE?); ADC_SoftwareStartConvCmd?(?ADC1,?ENABLE?);
問題,緩沖區(qū)是一個
adc_dma_buf[cnt][2] 就是兩個通道交替保存采集的數(shù)據(jù),多次啟動-停止會發(fā)現(xiàn)有時候一通道的值會和二通道的值交換位置
熱門產(chǎn)品 :
CH592: RISC-V內(nèi)核BLE5.4無線MCU