void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
/* RCC system reset(for debug purpose) */
RCC_DeInit();
/* Enable HSE */
RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
/* HCLK = SYSCLK */
RCC_HCLKConfig(RCC_SYSCLK_Div1);
/* PCLK2 = HCLK */
RCC_PCLK2Config(RCC_HCLK_Div1);
/* PCLK1 = HCLK/2 */
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
/* Flash 2 wait state */
FLASH_SetLatency(FLASH_Latency_2);
/* Enable Prefetch Buffer */
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/* PLLCLK = 8MHz * 9 = 72 MHz */
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
/* Enable PLL */
RCC_PLLCmd(ENABLE);
/* Wait till PLL is ready */
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
{
}
/* Select PLL as system clock source */
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
/* Wait till PLL is used as system clock source */
while(RCC_GetSYSCLKSource() != 0x08)
{
}
}
//这里是模块时钟,需要使用的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //复用功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//PA0 作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_Configuration();
}
void ADC_Configuration(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 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 = 1; // 顺序进行规则转换的ADC通道的数目 1 ;
ADC_Init(ADC1, &ADC_InitStructure);
// 设置指定ADC的规则组通道1,设置它们的转化顺序和采样时间为55.5周期 ;
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1,ADC_SampleTime_239Cycles5);
//ADC_DMACmd(ADC1, ENABLE); // 使能指定的ADC的DMA请求 ;
ADC_Cmd(ADC1, ENABLE); // 使能指定的ADC ;
ADC_ResetCalibration(ADC1); // 重置指定的ADC的校准寄存器 ;
while(ADC_GetResetCalibrationStatus(ADC1)); // 获取ADC重置校准寄存器的状态 ;
ADC_StartCalibration(ADC1); // 开始指定ADC的校准程序 ;
while(ADC_GetCalibrationStatus(ADC1)); // 获取指定ADC的校准状态 ;
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 使能指定的ADC的软件转换启动功能 ;
}
int main (void)
{
float ADValue = 0.00;
u32 delayTime = 0;
RCC_Configuration();
NVIC_Configuration();
GPIO_Configuration();
while(1){
if(delayTime++ >=2000000)
{
delayTime = 0;
ADValue = 3.3*ADC_GetConversionValue(ADC1)/4095;
printf("\r\n ADValue = %.2fv",ADValue);
}
}
}
帮忙看看,基本上是PA0读出的值一直不变,也不正确,哪儿问题,急? |