久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 13316|回復(fù): 4
收起左側(cè)

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

[復(fù)制鏈接]
ID:96313 發(fā)表于 2018-9-4 14:22 | 顯示全部樓層 |閱讀模式
就是配置這個(gè)自動(dòng)注入這里,沒有用DMA,又要自己切換通道,一定要記得配置為使能,雖然配置失能也可以運(yùn)行n次,但是總會(huì)卡死,找半天找不出來,我先后屏蔽過其他定時(shí)器,感覺又能多運(yùn)行幾次,但是有時(shí)候也會(huì)卡死,所以我感覺是配置的問題,把這里使能就好了。
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;  //自動(dòng)注入使能
  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. }
復(fù)制代碼



評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:96313 發(fā)表于 2018-9-5 08:46 | 顯示全部樓層
現(xiàn)在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);
}

評(píng)分

參與人數(shù) 1黑幣 +30 收起 理由
admin + 30 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

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


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

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

        ADC_DeInit(ADC1);  //復(fù)位ADC1

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

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

        while(ADC_GetCalibrationStatus(ADC1) != RESET ); //等待校準(zhǔn)結(jié)束

        ADC_SoftwareStartConvCmd(ADC1, ENABLE);                //使能指定的ADC1的軟件轉(zhuǎn)換啟動(dòng)功能   
}                                  
//獲得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
          //設(shè)置指定ADC的規(guī)則組通道,一個(gè)序列,采樣時(shí)間
        ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );        //ADC1,ADC通道,采樣時(shí)間為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);

}
回復(fù)

使用道具 舉報(bào)

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

感謝大佬!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产高清一区二区三区 | 99久久久国产精品 | 免费在线观看一区二区 | 久久久久久91香蕉国产 | a在线视频观看 | 亚洲 欧美 在线 一区 | 成人精品视频在线观看 | 青青草综合网 | 天天躁人人躁人人躁狂躁 | 可以看黄的视频 | 中文字幕成人av | www.国产一区 | 欧美日韩91 | 欧美精品一区二区三区在线四季 | 久久一区二区三区电影 | 综合色久 | 免费的日批视频 | 国产精品久久久久久久久免费 | 在线观看国产精品一区二区 | 一区二区影院 | 国产精品一区二区在线 | 成人亚洲视频 | www狠狠爱com| 在线观看国产三级 | 久久久久成人精品 | 少妇黄色 | 欧美在线a | 午夜视频一区二区三区 | 污视频免费在线观看 | 婷婷毛片| 亚洲免费精品 | 日韩综合一区 | 亚洲视频一区在线观看 | 欧美专区在线 | 久久精品国产久精国产 | 国产精品视频区 | 亚洲国产小视频 | 超碰97免费在线 | 神马影院一区二区三区 | 日韩一区二区在线视频 | 一区二区三区视频在线观看 |