求解STM32 非DMA非中断方式ADC转换不能读数据

[复制链接]
4679|4
 楼主| IVAN0821 发表于 2012-7-28 10:06 | 显示全部楼层 |阅读模式
我的ADC为什么不能读数据呢,采用的是软件查询方法,但当我在WHILE(1)前后加上 ADC_Cmd(ADC1, ENABLE);
ADC_Cmd(ADC1, DISABLE);
两个函数时能转换一次,求解啊,搞好几天了,谢谢各位了
int main(void)
{
    uint8_t  i,j;
    //uint32_t   sum1;
  union SlideSample testadc;

  /* System clocks configuration -------------------------------------------*/
           RCC_Configuration();
  /* NVIC configuration ----------------------------------------------------*/
           NVIC_Configuration();
  /* GPIO configuration ----------------------------------------------------*/
           GPIO_Configuration();
  /* USART  configuration ----------------------------------------------------*/
           USART_Configuration();   
  /* DMA  configuration ----------------------------------------------------*/
           DMA_Configuration();
  /* PWM  configuration ----------------------------------------------------*/
           //PWM_Configuration();
  /* ADC  configuration ----------------------------------------------------*/
           ADC_Configuration();
           
            ADC_CH_channel(0);
while(1)
{
       // ADC_Cmd(ADC1, ENABLE);
     // ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);      
     delay_ms(50);
      //while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=RESET);
      //while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
      //ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
   
      ADC_Value[0]=ADC_GetConversionValue(ADC1);   
      //ADC_SoftwareStartConvCmd(ADC1, DISABLE);
        ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
        ADC_SoftwareStartConvCmd(ADC1, DISABLE);
       //ADC_Cmd(ADC1, DISABLE);
        
      
      
      testadc.sword = ADC_Value[0];
      j = testadc.sbyte[1];
      j = j&0x0F;
      USART_SendData(USART1,j);
      delay_ms(0x5F);
      j = testadc.sbyte[0];
      USART_SendData(USART1,j);
      delay_ms(0x5F);
   
}
void ADC_Configuration(void)
{
    ADC_InitTypeDef           ADC_InitStructure;
      /* ADC1 configuration ----------------------------------------------------*/
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//多通道模式   或者单通道模式
    ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;//连续模式    单次模式
    //ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;//选择定时器1的捕获比较1作为转换外部触发
    ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigInjecConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   //ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);
    /* ADC1 regular channel14 configuration */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);//ADC_Channel_14
    /* Set injected sequencer length */
   // ADC_InjectedSequencerLengthConfig(ADC1, 1);
    /* ADC1 injected channel Configuration */
   // ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_71Cycles5);
    /* ADC1 injected external trigger configuration */
    ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigInjecConv_None);
    // ADC_ExternalTrigInjectedConvConfig(ADC1, ADC_ExternalTrigConv_T1_CC1);
    /* Enable automatic injected conversion start after regular one */
   // ADC_AutoInjectedConvCmd(ADC1, ENABLE);//使能ADC在规则组转化后自动开始注入转换组
    /* Enable ADC1 DMA */
   // ADC_DMACmd(ADC1, ENABLE);
    /* Enable ADC1 external trigger */
    //ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能ADC的经外部触发启动转换功能
    /* Enable JEOC interrupt */
      //ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE);
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    /* Enable ADC1 reset calibration register */
    ADC_ResetCalibration(ADC1);
    /* Check the end of ADC1 reset calibration register */
    while(ADC_GetResetCalibrationStatus(ADC1));
    /* Start ADC1 calibration */
    ADC_StartCalibration(ADC1);
    /* Check the end of ADC1 calibration */
    while(ADC_GetCalibrationStatus(ADC1));
   

    /* Test on channel1 transfer complete flag */
   // while(!DMA_GetFlagStatus(DMA1_FLAG_TC1));
    /* Clear channel1 transfer complete flag */
  //  DMA_ClearFlag(DMA1_FLAG_TC1);
   
    ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
   // ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
}
 楼主| IVAN0821 发表于 2012-7-28 11:00 | 显示全部楼层
终于理解了啊,ADC_SoftwareStartConvCmd(ADC1, ENABLE); 函数的功能是:使用外部触发信号启动转换,这样的话ADC的配置里面还的改回原来的ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;,哎,改过来就好了
airwill 发表于 2012-7-28 13:30 | 显示全部楼层
路过, 聪明, 鼓励一个
 楼主| IVAN0821 发表于 2012-7-28 17:13 | 显示全部楼层
谢谢,望各位多多指点
11721206 发表于 2013-9-9 17:00 | 显示全部楼层
我想你能把源程序给我发一遍么?谢谢!QQ:455317619    THX
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:转行

1

主题

11

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部