打印

【请教】STM32F303CC ADC1初始化问题

[复制链接]
3756|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
woddy|  楼主 | 2013-10-22 09:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void RCCInit (void)
{
    RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div16);
   
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA     |
                          RCC_AHBPeriph_GPIOB     |
                          RCC_AHBPeriph_ADC12     ,
                          ENABLE  
                         );
                        
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2  |
                           RCC_APB1Periph_USART3  ,
                           ENABLE
                         );
                        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1  ,
                           ENABLE
                           
                          );
   
   
   
    return;   
}

void GPIOInit (void)
{
    GPIO_InitTypeDef s_gpio_init;
   
    /** ADC1 GPIO Configuration        
                 PA0         ------> ADC1_IN1
        */
        
        s_gpio_init.GPIO_Pin  = GPIO_Pin_0;
        s_gpio_init.GPIO_Mode = GPIO_Mode_AN;
        s_gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOA, &s_gpio_init);
   
        /** USART1 GPIO Configuration        
                 PA9         ------> USART1_TX
                 PA10         ------> USART1_RX
        */   
        
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_7);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);
   
    s_gpio_init.GPIO_Pin   = GPIO_Pin_9;
    s_gpio_init.GPIO_Mode  = GPIO_Mode_AF;
    s_gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    s_gpio_init.GPIO_OType = GPIO_OType_PP;
    s_gpio_init.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &s_gpio_init);
   
    s_gpio_init.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA, &s_gpio_init);
   
        /** USART2 GPIO Configuration        
                 PA2         ------> USART2_TX
                 PA3         ------> USART2_RX
        */
        
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);
        
    s_gpio_init.GPIO_Pin   = GPIO_Pin_2;
    s_gpio_init.GPIO_Mode  = GPIO_Mode_AF;
    s_gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    s_gpio_init.GPIO_OType = GPIO_OType_PP;
    s_gpio_init.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(GPIOA, &s_gpio_init);
   
    s_gpio_init.GPIO_Pin = GPIO_Pin_3;
    GPIO_Init(GPIOA, &s_gpio_init);           

        /** Configure pins as GPIO
                 PA8         ------> GPIO_Output
                 PA11         ------> GPIO_Output
                 PA12         ------> GPIO_Output
                 PB5         ------> GPIO_Output
                 PB6         ------> GPIO_Output
                 PB7         ------> GPIO_Output
        */
        
        s_gpio_init.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12;
        s_gpio_init.GPIO_Mode = GPIO_Mode_OUT;
        s_gpio_init.GPIO_OType = GPIO_OType_PP;
        s_gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
        s_gpio_init.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOA, &s_gpio_init);

        s_gpio_init.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        s_gpio_init.GPIO_Mode = GPIO_Mode_OUT;
        s_gpio_init.GPIO_OType = GPIO_OType_PP;
        s_gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL;
        s_gpio_init.GPIO_Speed = GPIO_Speed_2MHz;
        GPIO_Init(GPIOB, &s_gpio_init);            
   
    return;   
}

void USARTInit (void)
{
    USART_InitTypeDef s_usart_init;
   
    s_usart_init.USART_BaudRate   = 9600;
    s_usart_init.USART_WordLength = USART_WordLength_8b;
    s_usart_init.USART_StopBits   = USART_StopBits_1;
    s_usart_init.USART_Parity     = USART_Parity_No;
    s_usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    s_usart_init.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &s_usart_init);
   
    USART_Cmd(USART1, ENABLE);
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
   
    s_usart_init.USART_BaudRate   = 9600;
    s_usart_init.USART_WordLength = USART_WordLength_8b;
    s_usart_init.USART_StopBits   = USART_StopBits_1;
    s_usart_init.USART_Parity     = USART_Parity_No;
    s_usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    s_usart_init.USART_Mode       = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART2, &s_usart_init);
   
    USART_Cmd(USART2, ENABLE);
   
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  
    return;   
}

void ADCInit (void)
{
    ADC_InitTypeDef         s_adc_init;
    ADC_CommonInitTypeDef   s_adc_common_init;
   
    ADC_StructInit(&s_adc_init);

    /* Calibration procedure */  
    ADC_VoltageRegulatorCmd(ADC1, ENABLE);
  
    /* Insert delay equal to 10 us */
    //DelayNUs(10);
    DelayUs(10);
  
    ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
    ADC_StartCalibration(ADC1);
  
    while(ADC_GetCalibrationStatus(ADC1) != RESET );
    CalibrationValue = ADC_GetCalibrationValue(ADC1);
     
    s_adc_common_init.ADC_Mode = ADC_Mode_Independent;                                                                    
    s_adc_common_init.ADC_Clock = ADC_Clock_AsynClkMode;                    
    s_adc_common_init.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;            
    s_adc_common_init.ADC_DMAMode = ADC_DMAMode_OneShot;                  
    s_adc_common_init.ADC_TwoSamplingDelay = 0;         
    ADC_CommonInit(ADC1, &s_adc_common_init);
  
    s_adc_init.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
    s_adc_init.ADC_Resolution = ADC_Resolution_12b;
    s_adc_init.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
    s_adc_init.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
    s_adc_init.ADC_DataAlign = ADC_DataAlign_Right;
    s_adc_init.ADC_OverrunMode = ADC_OverrunMode_Disable;   
    s_adc_init.ADC_AutoInjMode = ADC_AutoInjec_Disable;  
    s_adc_init.ADC_NbrOfRegChannel = 1;
    ADC_Init(ADC1, &s_adc_init);
  
    /* ADC1 regular channel1 configuration */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_7Cycles5);
   
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
   
   
    return;   
}

void NVICInit (void)
{
    NVIC_InitTypeDef s_nvic_init;

    /* Enable the USART1 Interrupt */
    s_nvic_init.NVIC_IRQChannel = USART1_IRQn;
    s_nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
    s_nvic_init.NVIC_IRQChannelSubPriority = 0;
    s_nvic_init.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&s_nvic_init);  
   
    /* Enable the USART1 Interrupt */
    s_nvic_init.NVIC_IRQChannel = USART2_IRQn;
    s_nvic_init.NVIC_IRQChannelPreemptionPriority = 0;
    s_nvic_init.NVIC_IRQChannelSubPriority = 0;
    s_nvic_init.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&s_nvic_init);  
      
    return;   
}

void SYSInit (void)
{
   
    RCCInit();
    GPIOInit();
    SysTickInit();
    NVICInit();
    USARTInit();
    ADCInit();
   
    return;
}

简直要疯掉了,STM32F103CB可以正常工作,STM32F303CC的GPIO和USART也可以正常工作,只是ADC初始化部分“红色代码行”总是死循环。
这是全部的初始化代码,请有经验的同仁帮俺看看,俺在这里作揖了。
沙发
outstanding| | 2013-10-22 10:56 | 只看该作者
while(ADC_GetCalibrationStatus(ADC1) != RESET );  这里死循环么 ?

使用特权

评论回复
板凳
杨爱林林| | 2013-10-22 11:07 | 只看该作者
进到ADC_GetCalibrationStatus 里面看看呀

使用特权

评论回复
地板
woddy|  楼主 | 2013-10-22 11:14 | 只看该作者
杨爱林林 发表于 2013-10-22 11:07
进到ADC_GetCalibrationStatus 里面看看呀

看过了,ADCAL标志位总是1(校准没有完成)。

使用特权

评论回复
5
杨爱林林| | 2013-10-22 11:32 | 只看该作者
没用过f3
不过f1里面  时钟配置这块  
adc1、adc2 是在高速时钟里面  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE)  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2,ENABLE)

你看看RCCInit   是否正确

使用特权

评论回复
6
woddy|  楼主 | 2013-10-22 15:08 | 只看该作者
本帖最后由 woddy 于 2013-10-22 15:55 编辑
杨爱林林 发表于 2013-10-22 11:32
没用过f3
不过f1里面  时钟配置这块  
adc1、adc2 是在高速时钟里面  


RCC配置应该是没问题的,f3的ADC都在AHB上。同样的板子,我又焊了一块,单片机换成STM32F103CB,一切正常。

硬件核对了好多次,也没发现问题,相当郁闷!

非常感谢!

使用特权

评论回复
7
andyjian| | 2013-10-22 16:21 | 只看该作者
学习了

使用特权

评论回复
8
风继续吹AQA| | 2015-6-15 16:27 | 只看该作者
我也遇到了跟你同样的问题,请问你的怎么解决的,这个问题困扰了我好久!!!

使用特权

评论回复
9
woddy|  楼主 | 2015-6-18 11:02 | 只看该作者
风继续吹AQA 发表于 2015-6-15 16:27
我也遇到了跟你同样的问题,请问你的怎么解决的,这个问题困扰了我好久!!! ...

不好意思,我至今也没有找到问题原因。

使用特权

评论回复
10
风继续吹AQA| | 2015-6-18 11:44 | 只看该作者
woddy 发表于 2015-6-18 11:02
不好意思,我至今也没有找到问题原因。

我解决了,重新设置一下时钟,就好了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝