由于目前手頭的開發(fā)板剛剛燒掉,無法驗證如下程序,請官方查看如下程序,看是否有問題,003芯片,三通道,使用dma adc采集,開啟轉換后使用?while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC))判斷轉換完畢,后期會將while中的程序放置在TIM中斷中,周期采集
#include "debug.h"
u16 TxBuf[10];
void ADC_Function_Init(void)
{
? ? ADC_InitTypeDef? ADC_InitStructure = {0};
? ? GPIO_InitTypeDef GPIO_InitStructure = {0};
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
? ? RCC_ADCCLKConfig(RCC_PCLK2_Div8);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOC, &GPIO_InitStructure);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOD, &GPIO_InitStructure);
? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
? ? GPIO_Init(GPIOD, &GPIO_InitStructure);
? ? ADC_DeInit(ADC1);
? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
? ? ADC_InitStructure.ADC_ScanConvMode = ENABLE;//多通道需要使能,掃描模式
? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//連續(xù)轉換
? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//沒有外部觸發(fā)
? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
? ? ADC_InitStructure.ADC_NbrOfChannel = 3;//轉換三個通道
? ? ADC_Init(ADC1, &ADC_InitStructure);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 1, ADC_SampleTime_241Cycles);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 2, ADC_SampleTime_241Cycles);
? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 3, ADC_SampleTime_241Cycles);
? ? ADC_Calibration_Vol(ADC1, ADC_CALVOL_50PERCENT);
? ? ADC_DMACmd(ADC1, ENABLE);
? ? ADC_Cmd(ADC1, ENABLE);
? ? ADC_ResetCalibration(ADC1);
? ? while(ADC_GetResetCalibrationStatus(ADC1));
? ? ADC_StartCalibration(ADC1);
? ? while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_ADC_Val(u8 ch)
{
? ? u16 val;
? ? ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_241Cycles);
? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);
? ? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
? ? val = ADC_GetConversionValue(ADC1);
? ? return val;
}
void DMA_Tx_Init(DMA_Channel_TypeDef *DMA_CHx, u32 ppadr, u32 memadr, u16 bufsize)
{
? ? DMA_InitTypeDef DMA_InitStructure = {0};
? ? RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
? ? DMA_DeInit(DMA_CHx);
? ? DMA_InitStructure.DMA_PeripheralBaseAddr = ppadr;
? ? DMA_InitStructure.DMA_MemoryBaseAddr = memadr;
? ? DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
? ? DMA_InitStructure.DMA_BufferSize = bufsize;
? ? 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(DMA_CHx, &DMA_InitStructure);
}
int main(void)
{
? ? u16 i;
? ? SystemCoreClockUpdate();
? ? Delay_Init();
#if (SDI_PRINT == SDI_PR_OPEN)
? ? SDI_Printf_Enable();
#else
? ? USART_Printf_Init(115200);
#endif
? ? printf("SystemClk:%d\r\n", SystemCoreClock);
? ? printf( "ChipID:%08x\r\n", DBGMCU_GetCHIPID() );
? ? ADC_Function_Init();
? ? DMA_Tx_Init(DMA1_Channel1, (u32)&ADC1->RDATAR, (u32)TxBuf,3);
? ? while(1)
? ? {
? ? ? ? DMA_Cmd(DMA1_Channel1, ENABLE);
? ? ? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);
? ? ? ? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
? ? ? ? ADC_SoftwareStartConvCmd(ADC1, DISABLE);
? ? ? ? DMA_Cmd(DMA1_Channel1, DISABLE);
? ? ? ? for(i = 0; i < 3; i++)
? ? ? ? {
? ? ? ? ? ? printf("%04d\r\n", TxBuf[i]);
? ? ? ? ? ? Delay_Ms(10);
? ? ? ? }
? ? }
}