请教:STM8L151 HALT唤醒后ADC异常

2019-12-13 18:21发布

  1. //ADC采集通道
  2. #define ADC_MAX_CHAN  10        //通道总数

  3. #define ADC_PORT_MP0  GPIOA
  4. #define ADC_PINS_MP0  GPIO_Pin_4

  5. #define ADC_PORT_MP1  GPIOA
  6. #define ADC_PINS_MP1  GPIO_Pin_7

  7. #define ADC_PORT_MA0  GPIOA
  8. #define ADC_PINS_MA0  GPIO_Pin_5

  9. #define ADC_PORT_MA1  GPIOA
  10. #define ADC_PINS_MA1  GPIO_Pin_6

  11. #define ADC_CHAN_MA0  ADC_Channel_1
  12. #define ADC_CHAN_MA1  ADC_Channel_0


  13. #define ADC_PORT_RP0  GPIOD
  14. #define ADC_PINS_RP0  GPIO_Pin_2

  15. #define ADC_PORT_RP1  GPIOB
  16. #define ADC_PINS_RP1  GPIO_Pin_1

  17. #define ADC_PORT_RA0  GPIOD
  18. #define ADC_PINS_RA0  GPIO_Pin_3

  19. #define ADC_PORT_RA1  GPIOB
  20. #define ADC_PINS_RA1  GPIO_Pin_0

  21. #define ADC_CHAN_RA0  ADC_Channel_19
  22. #define ADC_CHAN_RA1  ADC_Channel_18


  23. #define ADC_PORT_FP0  GPIOB
  24. #define ADC_PINS_FP0  GPIO_Pin_2

  25. #define ADC_PORT_FP1  GPIOB
  26. #define ADC_PINS_FP1  GPIO_Pin_5

  27. #define ADC_PORT_FA0  GPIOB
  28. #define ADC_PINS_FA0  GPIO_Pin_3

  29. #define ADC_PORT_FA1  GPIOB
  30. #define ADC_PINS_FA1  GPIO_Pin_4

  31. #define ADC_CHAN_FA0  ADC_Channel_15
  32. #define ADC_CHAN_FA1  ADC_Channel_14


  33. #define ADC_PORT_LP0  GPIOB
  34. #define ADC_PINS_LP0  GPIO_Pin_6

  35. #define ADC_PORT_LP1  GPIOF
  36. #define ADC_PINS_LP1  GPIO_Pin_1

  37. #define ADC_PORT_LA0  GPIOB
  38. #define ADC_PINS_LA0  GPIO_Pin_7

  39. #define ADC_PORT_LA1  GPIOF
  40. #define ADC_PINS_LA1  GPIO_Pin_0

  41. #define ADC_CHAN_LA0  ADC_Channel_11
  42. #define ADC_CHAN_LA1  ADC_Channel_24


  43. #define ADC_PORT_BP0  GPIOD
  44. #define ADC_PINS_BP0  GPIO_Pin_4

  45. #define ADC_PORT_BP1  GPIOD
  46. #define ADC_PINS_BP1  GPIO_Pin_7

  47. #define ADC_PORT_BA0  GPIOD
  48. #define ADC_PINS_BA0  GPIO_Pin_5

  49. #define ADC_PORT_BA1  GPIOD
  50. #define ADC_PINS_BA1  GPIO_Pin_6

  51. #define ADC_CHAN_BA0  ADC_Channel_9
  52. #define ADC_CHAN_BA1  ADC_Channel_8

  53. //按顺序排列,方便模块化
  54. GPIO_TypeDef*       ADCPORTSel[ADC_MAX_CHAN] = {ADC_PORT_MP0,ADC_PORT_MP1,ADC_PORT_RP0,ADC_PORT_RP1,ADC_PORT_FP0,ADC_PORT_FP1,ADC_PORT_LP0,ADC_PORT_LP1,ADC_PORT_BP0,ADC_PORT_BP1,};
  55. GPIO_Pin_TypeDef    ADCPINSSel[ADC_MAX_CHAN] = {ADC_PINS_MP0,ADC_PINS_MP1,ADC_PINS_RP0,ADC_PINS_RP1,ADC_PINS_FP0,ADC_PINS_FP1,ADC_PINS_LP0,ADC_PINS_LP1,ADC_PINS_BP0,ADC_PINS_BP1,};
  56. ADC_Channel_TypeDef ADCCHANSel[ADC_MAX_CHAN] = {ADC_CHAN_MA0,ADC_CHAN_MA1,ADC_CHAN_RA0,ADC_CHAN_RA1,ADC_CHAN_FA0,ADC_CHAN_FA1,ADC_CHAN_LA0,ADC_CHAN_LA1,ADC_CHAN_BA0,ADC_CHAN_BA1,};

  57. GPIO_TypeDef*       ADCPORTCH[ADC_MAX_CHAN]  = {ADC_PORT_MA0,ADC_PORT_MA1,ADC_PORT_RA0,ADC_PORT_RA1,ADC_PORT_FA0,ADC_PORT_FA1,ADC_PORT_LA0,ADC_PORT_LA1,ADC_PORT_BA0,ADC_PORT_BA1,};
  58. GPIO_Pin_TypeDef    ADCPINSCH[ADC_MAX_CHAN]  = {ADC_PINS_MA0,ADC_PINS_MA1,ADC_PINS_RA0,ADC_PINS_RA1,ADC_PINS_FA0,ADC_PINS_FA1,ADC_PINS_LA0,ADC_PINS_LA1,ADC_PINS_BA0,ADC_PINS_BA1,};

  59. //读到的当前数据
  60. uint16_t recCurVal[ADC_MAX_CHAN];


  61. void GetADCValue(unsigned char ch)
  62. {
  63.         uint16_t temp=0;
  64.        
  65.         if(ch<ADC_MAX_CHAN)                                                                                                          //防止越界跑飞
  66.         {       
  67.                   GPIO_Init(ADCPORTCH[ch], ADCPINSCH[ch], GPIO_Mode_In_FL_No_IT);                                //设置ADC脚为输入
  68.                 ADC1_Init();
  69.                   GPIO_SetBits(ADCPORTSel[ch], ADCPINSSel[ch]);                                                                //打开电源
  70.                 ADC_ChannelCmd (ADC1,ADCCHANSel[ch],ENABLE);                                                                //使能
  71.                 Delay(50);                                                                                                                                        //延时,电容充电要时间,约5ms
  72.                 ADC_SoftwareStartConv (ADC1);                                                                                                //开启软件转换
  73.                 while(!ADC_GetFlagStatus (ADC1,ADC_FLAG_EOC));                                                                //等待转换结束
  74.                 ADC_ClearFlag (ADC1,ADC_FLAG_EOC);                                                                                        //清除相关标识
  75.                 temp = ADC_GetConversionValue(ADC1);                                                                                //获取转换值
  76.                 GPIO_ResetBits(ADCPORTSel[ch], ADCPINSSel[ch]);                                                                //关闭电源
  77.                 ADC1_Closed();
  78.                 GPIO_Init(ADCPORTCH[ch] , ADCPINSCH[ch] , GPIO_Mode_Out_PP_Low_Slow);                //设置ADC脚为输出低
  79.                
  80.                 recCurVal[ch] = temp; //保存数据
  81.                
  82.                 #ifdef DEBUG
  83.                 temp = temp*3000UL/4095UL;        //转换成电压值
  84.                 USART1_SendInt(ch,temp);
  85.                 #endif
  86.         }
  87. }

  88. void main(void)
  89. {        
  90.           static unsigned char aaa=0;
  91.         PWR_FastWakeUpCmd(ENABLE);  //快速唤醒使能
  92.     RTC_Config();
  93.         PowerOn_Init();
  94.         aaa = 0;
  95.         while (1)
  96.         {
  97.                 GetADCValue(aaa);
  98.                 if(++aaa>=9) aaa = 0;
  99.                 GPIO_ResetBits(LED_PORT,LED_PINS);
  100.                 halt();
  101.                 GPIO_SetBits(LED_PORT,LED_PINS);
  102.         }
  103. }
复制代码

程序如上,问题在于:
1:如果人为的用 GetADCValue(0);  或者GetADCValue(1);  或者GetADCValue(3); 等,串口打印ADC读到的数据完全没有问题
2:如果像上面那样用一个变量控制,则第一个  GetADCValue(0); 和 GetADCValue(7);数据是正确的,其他数据为0或者很小(小于5)
求解
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。