请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G031 ADC采集数值为0问题

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
开发平台:KEIL5
  {# o1 g7 s, O# W- h1 S6 b* Y8 o4 S, \' m( \
芯片:STM32G0314 I0 _0 w) ?1 O/ J
" A1 M% v( [$ s  v* @0 C
描述:近日使用STM32G031给客户做一款产品,在使用ADC时出现,采集的数值一直为0的情况。分享给大家。5 u) p( V1 ^5 F& P; w6 a8 ~+ x
+ A5 G, u0 j  V; J4 L
使用STM32CubeMX生成代码。配置ADC引脚,PB0为ADC1_8,PA11[PA9]为ADC1_15.2 w' W: j6 m" ]9 @* s. j3 C
- F' _7 i% W' T+ u
20210109140154535.png

; g/ E& s: g0 d9 E5 e$ n9 X( ]: b" _5 d
生成代码如下:5 f" [' j6 {5 V$ E" [! e% V

0 x) {/ r! Y) \
  1. int main(void)- V4 d' p9 @; c' @. ]
  2. {( R+ T: C6 i$ E' x6 Y, }1 T
  3.     HAL_Init();) t9 j: t5 s% F2 Y( e+ D
  4.     SystemClock_Config();
      l: B7 Y9 v! {' ~# _
  5.     MX_DMA_Init();
    7 `" w# }- W0 O
  6.     MX_ADC1_Init();
    6 C0 s, W* T1 M7 [1 P, v4 e0 f- P: g
  7.     MX_NVIC_Init();
    : |/ R; n7 _) m3 g6 V) S
  8.     HAL_ADCEx_Calibration_Start(&hadc1);
    8 S# ]' i0 s+ t2 x8 y0 F6 w2 B: {
  9.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);; N* G" a$ B# I1 I9 L  N! }% Y
  10.     while (1)/ s. h+ I9 N" p9 F+ C7 Q
  11.     {' c( Q% ^3 M. A
  12.           if(get_sys_time_us() % 1000 == 0)6 a" k7 ^: v: R! E# K
  13.         {   
    4 n, |1 M8 Z$ T' `2 t& p
  14.             printf("adc1 = %d\r\n", adcbuf[0]);
    9 j; u) m8 k7 ]+ o
  15.             printf("adc1 = %d\r\n", adcbuf[1]);2 a" D: v: v6 {% _& U! d0 Z
  16.         }
    8 {& |! m- g! j* {' w4 j4 ~* N  F
  17. " [5 ^8 q) D2 h  F
  18.     }
复制代码
  1. ADC_HandleTypeDef hadc1;/ S) M% l- ^( P+ z. G; y% x
  2. DMA_HandleTypeDef hdma_adc1;, J( G! K1 B0 @2 Q& W: d
  3. 3 g$ e2 w: @  v$ X2 Z; y
  4. /* ADC1 init function */
    4 @* U5 h9 e2 c
  5. void MX_ADC1_Init(void)1 M3 n: b1 T( K7 n2 S: B  X$ S4 S
  6. {" }2 D& u/ Y4 k9 A
  7.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
    0 z' S/ {8 q1 m/ ?% Y
  8.   ADC_ChannelConfTypeDef sConfig = {0};
    ( R( F8 @" p9 L6 o3 T& G6 U

  9. 8 x) }6 g3 c6 \
  10.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) " q+ J9 Q6 }# x5 {4 K
  11.   */
    ' P4 e: l9 B: Z+ y( H/ M2 e
  12.   hadc1.Instance = ADC1;0 ?! y1 P$ y# p4 f0 N
  13.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    $ u; L+ e( h6 N4 r
  14.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    * p% o! F: M! I
  15.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    ) F! W' w, w8 R+ O6 A, Y% g4 t
  16.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;7 t' l+ ~. A2 r" o$ q8 i
  17.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;. m8 D8 f* Y8 d2 l
  18.   hadc1.Init.LowPowerAutoWait = DISABLE;
    ; W2 z  a# p) z0 s; l
  19.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    , Z2 B: ^3 l4 K
  20.   hadc1.Init.ContinuousConvMode = ENABLE;- O; n1 I& y& I+ y! O8 ]
  21.   hadc1.Init.NbrOfConversion = 2;" h, Z/ j5 p0 J, _6 `. h* N3 q
  22.   hadc1.Init.DiscontinuousConvMode = DISABLE;
    ; b( ~" A9 @1 ]5 k
  23.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    " V5 v5 B, K+ D0 t5 C
  24.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    ' ]0 a, Y0 B1 b& }) ]
  25.   hadc1.Init.DMAContinuousRequests = ENABLE;( R( b9 A) E% ?3 ~; C7 o
  26.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    " Z( `9 j' a" j7 g! D2 Q
  27.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;
    / u( L  a$ c$ i( ?, Z/ u' T
  28.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;: O1 w) _- f5 G0 Y  z
  29.   hadc1.Init.OversamplingMode = DISABLE;
    4 A. s/ P% x& t6 ]
  30.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;7 Z  i7 S5 Y9 y6 v
  31.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
    " Z: ]- C2 u- T* z
  32.   {
    2 w+ F7 _* T, }* |; x* |
  33.     Error_Handler();
    , t, r, c1 o& h  G$ Y; w( ]
  34.   }* Y7 P6 ~/ y5 V8 ~
  35.   /** Configure Analog WatchDog 2
      ?4 n' b4 {/ Y/ V. F/ [, f2 f
  36.   */0 O! ~. D( T: D
  37.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    , R/ H' [$ d9 {. j
  38.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)- U5 C: Q1 J- h6 w7 _
  39.   {
    5 H  b2 g" G3 T$ k9 u1 m! P
  40.     Error_Handler();
    2 j+ y5 p' n# g+ i8 p' i. L- g( q
  41.   }
    % q" N& g% k9 r0 O8 Y
  42.   /** Configure Regular Channel
    - I9 v; {- I+ q7 X) Q
  43.   */" w! d3 I1 k2 Q
  44.   sConfig.Channel = ADC_CHANNEL_15;9 \  \# N: d1 ^  \
  45.   sConfig.Rank = ADC_REGULAR_RANK_1;
    % E, r. ^! r' ?! z4 a* t  K
  46.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;* I, M6 @# r2 ?/ W, m; f
  47.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    ( y; n' i9 v5 V$ Z. S5 Y+ Q
  48.   {
    * m6 C1 ^( P6 q
  49.     Error_Handler();
    1 J  d0 v* Z. W. k# y; J- A) N5 M1 M* W
  50.   }
    + A9 S2 ]2 M( X% [  u0 E6 }
  51.   /** Configure Regular Channel $ e/ r4 U! R& H0 R$ N) t4 \
  52.   */
    6 T2 k7 q  }8 d" _9 _4 W
  53.   sConfig.Channel = ADC_CHANNEL_8;
    6 L7 V. q6 ~) S( ~& ]
  54.   sConfig.Rank = ADC_REGULAR_RANK_2;
    , L) ~$ N: f6 u
  55.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
      G! C2 a; x" h* R, q
  56.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)  y  a! ]& ^3 A4 _
  57.   {
    ; X" W9 Y6 K  T% _
  58.     Error_Handler();; A, U6 p7 r4 a# ]. X7 E  l2 i
  59.   }4 y8 M/ v' F& D) s
  60. ' Z! u6 \9 ?3 X7 p) l/ D! ]8 Q
  61. }
    ; _/ q% a3 z0 t  e. B9 F
  62. 8 z0 g$ t- ]1 g4 X8 q
  63. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)8 W; n5 z% [, x  E, A
  64. {
    . P; y; o) U. ]" T" y/ x
  65. - n" T# J- m2 a$ S1 B
  66.   GPIO_InitTypeDef GPIO_InitStruct = {0};) |( G/ e, x3 \
  67.   if(adcHandle->Instance==ADC1)
    ) R( X, H4 `4 h& J  W
  68.   {
    1 m" E" B: U" R# b
  69.   /* USER CODE BEGIN ADC1_MspInit 0 */
    * [/ ?8 `9 ^. r0 V% f

  70. : ]" ]# ^: P+ v0 @) S4 U& Q3 O& {
  71.   /* USER CODE END ADC1_MspInit 0 */8 d( I& k; l2 T* Z2 ?( `4 }' s) F- z6 K
  72.     /* ADC1 clock enable */
    * K; V- X1 X6 x3 a: |! B
  73.     __HAL_RCC_ADC_CLK_ENABLE();
    . ?- y- `% J8 r4 Z' h2 ], A. j

  74. , \) s5 x9 j& F" T% {
  75.     __HAL_RCC_GPIOB_CLK_ENABLE();
    0 w$ z( S* X' N# ^3 f. b. M% P0 y
  76.     __HAL_RCC_GPIOA_CLK_ENABLE();
    ; u! Z) |: C+ h0 s: f
  77.     /**ADC1 GPIO Configuration    . n4 }6 ~/ M7 ?1 T
  78.     PB0     ------> ADC1_IN8, [5 I+ [6 p5 J8 ?6 [
  79.     PA11 [PA9]     ------> ADC1_IN15 - r9 `, B2 |. c( h1 \- |9 N2 [9 @
  80.     */
    $ C' o2 q8 H' Y. @
  81.     GPIO_InitStruct.Pin = GPIO_PIN_0;
    ( h0 F- n; R6 P: U
  82.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    9 c9 \' L- ]; k- `4 Z8 i6 q
  83.     GPIO_InitStruct.Pull = GPIO_NOPULL;$ }2 A9 G, u; V& u; B7 F! _/ s
  84.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    ) |( T5 J# W% ?) ^! Y# q

  85. / M! a# `1 {0 A- I, }
  86.     GPIO_InitStruct.Pin = GPIO_PIN_11;- E: @8 n( Y- Q& {' I* W
  87.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    7 H) i. ^, Y; s; p$ ]
  88.     GPIO_InitStruct.Pull = GPIO_NOPULL;7 J& F, Z& G# G# Z2 }+ F
  89.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);( x9 T' Y" F. P3 D# D# A3 u

  90. ) u( P8 K! O. L: E
  91.     /* ADC1 DMA Init */5 D9 K- D4 E' [8 {" r0 y% j- w
  92.     /* ADC1 Init */
    * S  f1 ?+ t; w" y
  93.     hdma_adc1.Instance = DMA1_Channel1;) B* `8 b( u4 z+ Q0 _$ N
  94.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;; |3 s. k$ O- o) f- G
  95.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;$ b( Y( ^, k5 y
  96.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    ( G8 T4 x! d7 j8 U
  97.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
    + m8 U  n3 N2 T& z5 [! Y
  98.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;3 `3 z1 K& n9 F2 B" Z, s
  99.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;' v% _: O/ P) m" G
  100.     hdma_adc1.Init.Mode = DMA_CIRCULAR;  r% l, y' _$ a6 Z, L3 H! Z$ z, F+ T
  101.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
    9 o1 f  ~- N3 [8 Z
  102.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
    . }9 B/ N9 u* L( _( @8 G( y% ~+ V
  103.     {3 Z) ~, i9 S. F/ h
  104.       Error_Handler();
    # K+ A( q8 f% h+ {  Y; l
  105.     }
    4 R1 ?- U3 V5 e
  106.   ^" B. M$ c9 W0 a" X- ^
  107.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    : f' h* d6 B& _9 F& K% P' x
  108. : L8 [: w; a' x& \# ]. s
  109.   /* USER CODE BEGIN ADC1_MspInit 1 */0 m; k5 n# P! X* R% T/ _. v

  110. + U: Y  m- |0 M  f. {, \
  111.   /* USER CODE END ADC1_MspInit 1 */
    7 u1 Y& g3 S' v: e! @: t
  112.   }
    , r4 C9 t6 T  h8 @2 e
  113. }
复制代码

5 f$ a; m1 r4 X8 T) g  U, w9 k把STM32CubeMX生成的代码下载到芯片中运行,结果ADC1_8的值可以读到,但是ADC1_15的值却一直为0.
( }& L$ y+ q. m  l: `6 W. k" Z. @. P5 F0 R/ d5 n
出现上述问题的原因是因为STM32G031的 ADC 序列器配置成完全可配置时,只能使用通
5 _/ A/ D% C+ j3 h" e( V  c' c- C道 0-14,不能使用通道 15,16,17,18;所以在有使用到通道 15,16,17,18 的情况下,ADC 序列
! Y: ~) q  s) q! n; r; G器要配置成不完全可配置。Sequencer 选项选择为:Sequencer not fully configurable  ~' ^- G  h3 q0 Z
如果是多通道则 Discontinuous Conversion Mode 要使能
' X+ G3 G9 B3 ?- b6 V6 ~$ g( e' U, r$ q/ h! q6 k/ P5 k; t& h6 n$ l) Y

1 P" v) C- N' A1 N
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版