欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13550|回復: 4
收起左側

STM32F302的ADC采集,卡死在while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC)

[復制鏈接]
ID:96313 發表于 2018-9-4 14:22 | 顯示全部樓層 |閱讀模式
就是配置這個自動注入這里,沒有用DMA,又要自己切換通道,一定要記得配置為使能,雖然配置失能也可以運行n次,但是總會卡死,找半天找不出來,我先后屏蔽過其他定時器,感覺又能多運行幾次,但是有時候也會卡死,所以我感覺是配置的問題,把這里使能就好了。
stm32f302RBT6

原因是配置的問題:
具體如下:
  1. void ADC2_init(void)
  2. {
  3.         GPIO_InitTypeDef          GPIO_InitStructure;
  4.         ADC_InitTypeDef           ADC_InitStructure;
  5.         ADC_CommonInitTypeDef     ADC_CommonInitStructure;
  6.         
  7.         RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div2);

  8.   /* Enable ADC12 clock */
  9.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);

  10.   /* ADC Channel configuration */
  11.   /* GPIOC Periph clock enable */
  12.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOA, ENABLE);

  13.   /* Configure ADC Channel5 as analog input */
  14.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
  15.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  16.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  17.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  18.         
  19.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  20.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  21.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  22.   GPIO_Init(GPIOA, &GPIO_InitStructure);

  23.   ADC_StructInit(&ADC_InitStructure);

  24.   /* Calibration procedure */  
  25.   ADC_VoltageRegulatorCmd(ADC2, ENABLE);

  26.   ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single);
  27.   ADC_StartCalibration(ADC2);

  28.   while(ADC_GetCalibrationStatus(ADC2) != RESET );
  29.   calibration_value = ADC_GetCalibrationValue(ADC2);

  30.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;                                                                    
  31.   ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;                    
  32.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;            
  33.   ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;                  
  34.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;         
  35.   ADC_CommonInit(ADC2, &ADC_CommonInitStructure);

  36.   ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
  37.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  38.   //ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
  39.   ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
  40.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  41.   ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
  42.   ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Enable;  //自動注入使能
  43.   ADC_InitStructure.ADC_NbrOfRegChannel = 1;
  44.   ADC_Init(ADC2, &ADC_InitStructure);

  45.   /* Enable ADC2 */
  46.   ADC_Cmd(ADC2, ENABLE);

  47. }

  48. u16 Get_Adc2(u8 ch)
  49. {
  50.           ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_181Cycles5);
  51. /* wait for ADRDY */
  52.           while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));
  53. /* Start ADC1 Software Conversion */
  54.           ADC_StartConversion(ADC2);   
  55. /* Test EOC flag */
  56.           while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);
  57. /* Get ADC1 converted data */
  58.     return ADC_GetConversionValue(ADC2);
  59. }
復制代碼



評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:96313 發表于 2018-9-4 15:18 | 顯示全部樓層
在while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET)后面把這句加上,
ADC_ClearFlag(ADC2, ADC_FLAG_EOC);清除標志位

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:96313 發表于 2018-9-5 08:46 | 顯示全部樓層
現在ADC1和ADC2都配置好了,把程序附上:
#include "adc.h"
/*************************************************
PA1(ADC1_IN2)     PA5(ADC2_IN2)     PC2(ADC1_IN8)
PA2(ADC1_IN3)     PA6(ADC2_IN3)     PC3(ADC1_IN9)
PA3(ADC1_IN4)     PA7(ADC2_IN4)     PC4(ADC2_IN5)
**************************************************/
__IO uint16_t  ADC1ConvertedValue = 0, ADC1ConvertedVoltage = 0, calibration_value = 0;
void ADC2_init(void)
{
        GPIO_InitTypeDef          GPIO_InitStructure;
  ADC_InitTypeDef           ADC_InitStructure;
  ADC_CommonInitTypeDef     ADC_CommonInitStructure;
       
        RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div6);
  
  /* Enable ADC1 clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);

  /* ADC Channel configuration */
  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOA, ENABLE);

  /* Configure ADC Channel5 as analog input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  ADC_StructInit(&ADC_InitStructure);

  /* Calibration procedure */  
  ADC_VoltageRegulatorCmd(ADC2, ENABLE);

  ADC_SelectCalibrationMode(ADC2, ADC_CalibrationMode_Single);
  ADC_StartCalibration(ADC2);
  
  while(ADC_GetCalibrationStatus(ADC2) != RESET );
  calibration_value = ADC_GetCalibrationValue(ADC2);
     
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;                                                                    
  ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;                    
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;            
  //ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;                  
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;         
  ADC_CommonInit(ADC2, &ADC_CommonInitStructure);
  
  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;//ADC continuous conversion mode disable
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  //ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Enable;  //×Ô¶ˉ×¢èëÄ£ê½
  ADC_InitStructure.ADC_NbrOfRegChannel =1;
  ADC_Init(ADC2, &ADC_InitStructure);

  /* Enable ADC2 */
  ADC_Cmd(ADC2, ENABLE);
}

u16 Get_Adc2(u8 ch)
{
          ADC_RegularChannelConfig(ADC2, ch, 1, ADC_SampleTime_601Cycles5);
                /* wait for ADRDY */
                while(!ADC_GetFlagStatus(ADC2, ADC_FLAG_RDY));
                /* Start ADC1 Software Conversion */
                ADC_StartConversion(ADC2);   
    /* Test EOC flag */
    while(ADC_GetFlagStatus(ADC2,ADC_FLAG_EOC) == RESET); //|| ADC_GetCommonFlagStatus(ADC2, ADC_FLAG_EOC) == RESET);
    /*Clear ADC_FLAG_EOC*/
                ADC_ClearFlag(ADC2,ADC_FLAG_EOC);
                //ADC_ClearCommonFlag(ADC2, ADC_FLAG_EOC);
    /* Get ADC1 converted data */
    return ADC_GetConversionValue(ADC2);
}

void ADC1_init(void)
{
        GPIO_InitTypeDef          GPIO_InitStructure;
  ADC_InitTypeDef           ADC_InitStructure;
  ADC_CommonInitTypeDef     ADC_CommonInitStructure;
       
        RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div6);
  
  /* Enable ADC1 clock */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_ADC12, ENABLE);

  /* ADC Channel configuration */
  /* GPIOC Periph clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC|RCC_AHBPeriph_GPIOA, ENABLE);

  /* Configure ADC1 Channel8,9 as analog input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
        /* Configure ADC1 Channel2,3,4 as analog input */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        /* Reset ADC init structure parameters values */
  ADC_StructInit(&ADC_InitStructure);

  /* Calibration procedure */  
  ADC_VoltageRegulatorCmd(ADC1, ENABLE);

  ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
  ADC_StartCalibration(ADC1);
  
  while(ADC_GetCalibrationStatus(ADC1) != RESET );
  calibration_value = ADC_GetCalibrationValue(ADC1);
     
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;                                                                    
  ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;                    
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;            
  //ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;                  
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;         
  ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
  
  ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  //ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
  ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;   
  ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Enable;  //×Ô¶ˉ×¢èëÄ£ê½
  ADC_InitStructure.ADC_NbrOfRegChannel =1;
  ADC_Init(ADC1, &ADC_InitStructure);

  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
}

u16 Get_Adc1(u8 ch)
{
          ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_601Cycles5);
                /* wait for ADRDY */
                while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
                /* Start ADC1 Software Conversion */
                ADC_StartConversion(ADC1);   
    /* Test EOC flag */
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);// || ADC_GetCommonFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    /*Clear ADC_FLAG_EOC*/
                ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
                //ADC_ClearCommonFlag(ADC1, ADC_FLAG_EOC);
    /* Get ADC1 converted data */
    return ADC_GetConversionValue(ADC1);
}

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

ID:511102 發表于 2019-6-25 10:23 | 顯示全部樓層
樓主你好,我也遇到這樣的問題,我是在F103的板子上做ADC的數據采集時沒有問題,等我移植了RTOS系統后,就在標志位這里陷入了死循環,我加了清除標志位,但是清除標志位這里又陷入了死循環。。。。
代碼
void  Adc_Init(void)
{        
        ADC_InitTypeDef ADC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1, ENABLE );          //使能ADC1通道時鐘


        RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M

        //PA4 作為模擬通道輸入引腳                        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模擬輸入引腳
        GPIO_Init(GPIOA, &GPIO_InitStructure);       

        ADC_DeInit(ADC1);  //復位ADC1

        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在獨立模式
        ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模數轉換工作在單通道模式
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模數轉換工作在單次轉換模式
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //轉換由軟件而不是外部觸發啟動
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC數據右對齊
        ADC_InitStructure.ADC_NbrOfChannel = 1;        //順序進行規則轉換的ADC通道的數目
        ADC_Init(ADC1, &ADC_InitStructure);        //根據ADC_InitStruct中指定的參數初始化外設ADCx的寄存器   

  
        ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1
       
        ADC_ResetCalibration(ADC1);        //使能復位校準  
         
        while(ADC_GetResetCalibrationStatus(ADC1));        //等待復位校準結束
       
        ADC_StartCalibration(ADC1);         //開啟AD校準

        while(ADC_GetCalibrationStatus(ADC1) != RESET ); //等待校準結束

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的軟件轉換啟動功能   
}                                  
//獲得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
          //設置指定ADC的規則組通道,一個序列,采樣時間
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采樣時間為239.5周期                                      
  

       
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET)// || ADC_GetCommonFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
   
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);

    return ADC_GetConversionValue(ADC1);

}
回復

使用道具 舉報

ID:961292 發表于 2023-4-3 15:21 | 顯示全部樓層
過往云煙 發表于 2018-9-4 15:18
在while(ADC_GetFlagStatus(ADC2, ADC_FLAG_EOC) == RESET)后面把這句加上,
ADC_ClearFlag(ADC2, ADC_F ...

感謝大佬。!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表