本人有一款成熟产品,之前主控用的是STM32F103VC系列,现在想替换成GD32F103VC,将之前STM32的代码下载到GD芯片时候,发现串口,IO口,定时器等其他功能都正常,唯独PC3引脚端口作为ADC采集的数据不正常,不是说不工作,而是电压不对。貌似配置成模拟输入(GPIO_Mode_AIN)后,居然电压偏高造成,有时候都超过3,3V,如果配置成其他功能就不会有,之前用STM芯片时候没遇到过的,期望哪位大神能帮忙解惑!
如上图,下面贴出代码
void vADC1_Configuartion(void)
{
unsigned int i = 0;
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | ADC_BoilerPortClock | ADC_WaterLevelPortClock |
ADC_SteamPressPortClock, ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
// CH0
// GPIO_InitStructure.GPIO_Pin = ADC_WaterLevelPIN;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //
// GPIO_Init(ADC_WaterLevelPORT, &GPIO_InitStructure);
// CH13
GPIO_InitStructure.GPIO_Pin = ADC_BoilerPIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADC_BoilerPORT, &GPIO_InitStructure);
// CH15
GPIO_InitStructure.GPIO_Pin = ADC_SteamPressPIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(ADC_SteamPressPORT, &GPIO_InitStructure);
/* Enable the temperature sensor and vref internal channel */
// ADC_TempSensorVrefintCmd(ENABLE); //开启内部芯片温度ADC采集
ADC_DeInit(ADC1); //将外设ADC1的全部寄存器重新设置为默认值
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // ADC工作模式,ADC1和ADC2工作在独立模式
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数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = ADC_Num; // 顺序进行规则转换的ADC通道数量,3路外部输入,每个通道采集N次,求平均值
ADC_Init(ADC1, &ADC_InitStructure); // 根据制定参数,初始化ADC寄存器
// 设置指定ADC的规则组通道,设置他们的转化顺利和采样时间
// ADC1,ADC通道x,规则采样顺序值为y,采样时间为239.5周期
// ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 2,ADC_SampleTime_239Cycles5);
// 开始ADC的DMA支持,要实现DMA功能,还要独立配置DMA的通道等参数
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE); //使能ADC
for (i = 0; i < 0xFFFFFF; i++);
ADC_ResetCalibration(ADC1); //复位指定的ADC的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC复位寄存器的状态,设置状态泽等待
ADC_StartCalibration(ADC1); //开始指定ADC的校准状态
while(ADC_GetCalibrationStatus(ADC1)); //获取ADC校准寄存器的状态,设置状态泽等待
}
|