首先打开极海APM32F030x4x6x8xC 用户手册找到VREFINT。
找到内部参考电压 VREFINT为ADC1_IN17通道
使用VREFINT必须使能VREFEN位
初始化ADC代码
void ADC_Init(void)
{
GPIO_Config_T gpioConfig;
ADC_Config_T adcConfig;
/* Enable GPIOA clock */
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
/* ADC channel 0 configuration */
GPIO_ConfigStructInit(&gpioConfig);
gpioConfig.mode = GPIO_MODE_AN;
gpioConfig.pupd = GPIO_PUPD_NO;
gpioConfig.pin = GPIO_PIN_2;
GPIO_Config(GPIOA, &gpioConfig);
/* Enable ADC clock */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
/* ADC configuration */
ADC_Reset();
ADC_ConfigStructInit(&adcConfig);
/* Set resolution*/
adcConfig.resolution = ADC_RESOLUTION_12B;
/* Set scanDir*/
adcConfig.scanDir = ADC_SCAN_DIR_UPWARD;
/* Set convMode continous*/
adcConfig.convMode = ADC_CONVERSION_CONTINUOUS;
/* Set dataAlign*/
adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
/* Set extTrigEdge*/
adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_NONE;
/* Set extTrigConv*/
adcConfig.extTrigConv = ADC_EXT_TRIG_CONV_TRG0;
ADC_Config(&adcConfig);
ADC_EnableVrefint();
ADC_DisableVbat();
/* ADC channel Convert configuration */
ADC_ConfigChannel(ADC_CHANNEL_2, ADC_SAMPLE_TIME_239_5);
ADC_ConfigChannel(ADC_Channel_Vrefint, ADC_SAMPLE_TIME_239_5);
/* Config DMA*/
DMA_Init();
/* Calibration */
ADC_ReadCalibrationFactor();
/* Enable ADC DMA*/
ADC_EnableDMA();
ADC_DMARequestMode(ADC_DMA_MODE_CIRCULAR);
/* Enable ADC */
ADC_Enable();
}
初始化DMA代码
void DMA_Init(void)
{
/* DMA Configure */
DMA_Config_T dmaConfig;
/* Enable DMA clock */
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1);
/* Set Peripheral Address */
dmaConfig.peripheralAddress = ADC_DR_ADDR;
/* Set memory Address */
dmaConfig.memoryAddress = (uint32_t)&adcData;
/* read from peripheral */
dmaConfig.direction = DMA_DIR_PERIPHERAL;
/* size of buffer*/
dmaConfig.bufferSize = ADC_CH_SIZE;
/* Disable Peripheral Address increase */
dmaConfig.peripheralInc = DMA_PERIPHERAL_INC_DISABLE;
/* Enable Memory Address increase */
dmaConfig.memoryInc = DMA_MEMORY_INC_ENABLE;
/* Set peripheral Data Size */
dmaConfig.peripheralDataSize = DMA_PERIPHERAL_DATASIZE_HALFWORD;
/* set memory Data Size */
dmaConfig.memoryDataSize = DMA_MEMORY_DATASIZE_HALFWORD;
/* Reset Circular Mode */
dmaConfig.circular = DMA_CIRCULAR_ENABLE;
/* Disable M2M */
dmaConfig.memoryTomemory = DMA_M2M_DISABLE;
/* set priority */
dmaConfig.priority = DMA_PRIORITY_LEVEL_HIGHT;
DMA_Config(DMA1_CHANNEL_1, &dmaConfig);
DMA_Enable(DMA1_CHANNEL_1);
}
debug调试
void ADC_MultiChannelPolling(void)
{
float voltage;
uint8_t index;
voltage = (float)((float)adcData[0] / (float)adcData[1]) * 1.2;
printf("ADC CH[2] = %d, voltage = %.3f V\r\n", adcData[0], voltage);
printf("ADC CH[17] = %d, voltage = 1.2f V\r\n", adcData[1]);
printf("\r\n");
}
主函数
int main(void)
{
/* COM1 init*/
APM_MINI_COMInit(COM1);
/* ADC1 initialization */
ADC_Init();
ADC_StartConversion();
printf("code start\r\n");
while (1)
{
Delay(0x3FFFFF);
ADC_MultiChannelPolling();
}
}
串口打印如下