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

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

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
开发平台:KEIL5
& x5 A0 g* Y; W% |: A! ^1 g4 X' G9 A) h8 Q4 K
芯片:STM32G031
5 w( _0 d+ A6 P$ a: E: I
- g5 N; I, v& ^$ q- r% K& u描述:近日使用STM32G031给客户做一款产品,在使用ADC时出现,采集的数值一直为0的情况。分享给大家。
( r6 f3 c% C& e2 A) Y) t1 [( D* w4 l: K& _
使用STM32CubeMX生成代码。配置ADC引脚,PB0为ADC1_8,PA11[PA9]为ADC1_15.
9 a- {6 `/ @$ R- H
% Y% q. j3 M5 I: u" G7 W; p- c+ e( z1 H
20210109140154535.png
1 V5 F9 N6 l; L

) R, l) A! R- V8 [生成代码如下:
  {, ]; M. Q0 ^% z, ]  Q3 D5 f5 D4 s& X+ H7 r$ B- z2 Y' q
  1. int main(void)1 N3 M$ O  J7 a' E% l
  2. {( x7 t/ V; m- d! J3 F5 O
  3.     HAL_Init();* m& P" l% l2 x# |
  4.     SystemClock_Config();# Y0 S9 \# A) v
  5.     MX_DMA_Init();/ q9 h6 _$ L" L3 L' [
  6.     MX_ADC1_Init();
      M, f: u! Y- G; C% y: r: A! K, ^& B
  7.     MX_NVIC_Init();
    ! r$ }3 V! g0 {1 F7 h
  8.     HAL_ADCEx_Calibration_Start(&hadc1);
    1 e' ?1 O2 }- ]% K
  9.     HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&adcbuf,2);* h" Z& t6 N( ^' b4 v  x
  10.     while (1)& M+ c  W9 F" o; s! p* W# `% F9 k
  11.     {
    ! E- C5 Z' G: o- U8 \4 w
  12.           if(get_sys_time_us() % 1000 == 0)
    7 ~& V( Z9 P2 Z% x+ A9 I
  13.         {   
    ) g$ Q& N. j# D
  14.             printf("adc1 = %d\r\n", adcbuf[0]);
      s3 q, M9 ~# {; |/ n; c
  15.             printf("adc1 = %d\r\n", adcbuf[1]);
    ( v9 c/ A8 Z! h
  16.         }& v2 ~# C& ?" C* g7 w

  17. % m; b& }$ E# v. A/ B
  18.     }
复制代码
  1. ADC_HandleTypeDef hadc1;
    2 ]# K4 s+ k7 Y- V7 y4 N
  2. DMA_HandleTypeDef hdma_adc1;
    4 U) o( k( e. o5 p' [. r
  3. ( C2 I4 f) Z' ^5 v8 `5 F
  4. /* ADC1 init function */8 s7 n7 S/ m% \( R' D- h
  5. void MX_ADC1_Init(void)
    - W/ Y6 u1 `4 w8 K5 R' H  l0 ^5 }
  6. {/ j# S( g8 A1 \2 I% c; Q: D+ X- K
  7.   ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};+ `& p' l6 |9 @# w  ~
  8.   ADC_ChannelConfTypeDef sConfig = {0};1 N9 m. C4 ^- O
  9. 0 ]: i8 M- f' }
  10.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    0 z0 F$ v9 l; M) i
  11.   */+ y- @$ y7 `$ x1 o/ S: m
  12.   hadc1.Instance = ADC1;
    $ }( y' l3 t# @  p
  13.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
    ' H; k* I& [& H2 \
  14.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
    5 X3 ]; n* j7 g) c  ]! ?; N
  15.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    , s2 B# \# q/ C7 ^) K( a, k4 b
  16.   hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
    2 x& c) M+ q0 e( E/ c
  17.   hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    " Y5 ~7 i/ d. K# D: X+ @
  18.   hadc1.Init.LowPowerAutoWait = DISABLE;
    ; g  f& k* C2 N& e% d. m
  19.   hadc1.Init.LowPowerAutoPowerOff = DISABLE;/ U4 ]8 h. F0 I3 \$ A
  20.   hadc1.Init.ContinuousConvMode = ENABLE;  f. ]. |: G% k. W/ V0 e
  21.   hadc1.Init.NbrOfConversion = 2;
    * q( O4 b' z, c5 |
  22.   hadc1.Init.DiscontinuousConvMode = DISABLE;# s8 }, ^9 }# \' V# ?
  23.   hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    6 i2 S% m1 [4 o) z) e* V& s
  24.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;0 t7 x' ?! h/ C: |: M# T
  25.   hadc1.Init.DMAContinuousRequests = ENABLE;
    3 W, G2 r  R0 ~$ X+ s- _
  26.   hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;1 y' i/ f& `1 X0 J0 S& J
  27.   hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_160CYCLES_5;- E: f0 @* s7 v9 \( C- }$ R
  28.   hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_160CYCLES_5;
    * \, `+ }* o% l
  29.   hadc1.Init.OversamplingMode = DISABLE;: ^3 i8 A; o. I* t; ~" }* L% |% L
  30.   hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;5 j  R) ~8 [# E  d/ P$ {4 |, u
  31.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
    & W- x+ A; V# Y4 H- I! O: Y: K
  32.   {
    2 u- M& W* J- K! j" P2 \
  33.     Error_Handler();
    : e" m0 A. m: k7 D
  34.   }
    2 D1 t8 Z) G  `, W
  35.   /** Configure Analog WatchDog 2
    8 W% Q' {/ m  D/ A1 Y7 z# d, @
  36.   */6 M( s# m$ {* H, h' y& J
  37.   AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
    . ?( k4 x5 J, R2 @" U
  38.   if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK)
    : I, I( W& N( h& J0 f
  39.   {
    ' u# f, E4 \* v/ ?6 z
  40.     Error_Handler();( ~0 D) B. ]* {9 S* m* s1 U2 Z
  41.   }) c8 M+ M3 W9 n8 A# Y/ P: }4 j4 ?
  42.   /** Configure Regular Channel
    $ n9 @. }! j- X. E8 J* k5 l
  43.   */6 x$ U1 |1 K2 k1 c2 x1 q
  44.   sConfig.Channel = ADC_CHANNEL_15;, s5 K- ^: H3 l8 C
  45.   sConfig.Rank = ADC_REGULAR_RANK_1;
    3 a( o  p  I" W' }: a
  46.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;, ~5 e$ v: }9 W: W  e6 g3 W
  47.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    4 @2 n. B, u: ~7 Z- Q9 d% d( M: I( n
  48.   {
    6 M, \- C3 ^1 B+ R
  49.     Error_Handler();- J( O+ z* Z9 @# _$ ]
  50.   }
    ' K( _# V' }6 V; R
  51.   /** Configure Regular Channel
    + y, W" E! g3 U, H4 B2 A9 H8 t
  52.   */
    ; O# p3 s6 U; j3 m5 l3 [8 L3 W& `
  53.   sConfig.Channel = ADC_CHANNEL_8;
    & w/ ]# S# f  H( S% k# f$ {: s9 L
  54.   sConfig.Rank = ADC_REGULAR_RANK_2;0 f: M8 d" f, B: s
  55.   sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;) V+ o& _$ j5 ]( Z/ R+ a
  56.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK). g, j2 I& k& N- y3 L
  57.   {
    # Q( j/ L! I8 k4 V" U" ]
  58.     Error_Handler();* p) v" a/ c6 m* h4 @
  59.   }+ ]" |3 O' U: D# @  e9 S
  60. " A- S: e$ j# ~2 z8 s6 I( j
  61. }
    7 F" ]: u% i+ B& R
  62. 1 g5 m/ E8 J. S/ A  d. R
  63. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle). _2 u. U" l' K# q& V; M: v! u
  64. {
    5 D" d+ k  m$ c, t+ r
  65.   y. d. ~2 b; N! {; f: V
  66.   GPIO_InitTypeDef GPIO_InitStruct = {0};2 `( C5 P/ |7 Z3 m& z' I# U
  67.   if(adcHandle->Instance==ADC1)1 \9 `/ d% s9 W% S* E9 P  V
  68.   {# \; ]( m3 @6 e( x! z7 n: H$ y
  69.   /* USER CODE BEGIN ADC1_MspInit 0 */
    9 N4 b1 B" c- t! K( n
  70. % F4 n4 m/ c4 O" j
  71.   /* USER CODE END ADC1_MspInit 0 */
    1 J' N. \) z! \% Z+ J
  72.     /* ADC1 clock enable */! `% d! J5 R( a" I
  73.     __HAL_RCC_ADC_CLK_ENABLE();  x# R8 a/ E2 n9 a* w3 U& }
  74. 6 K* H6 f9 f/ v, V& d4 w
  75.     __HAL_RCC_GPIOB_CLK_ENABLE();9 X7 a5 A5 P8 b/ x5 T
  76.     __HAL_RCC_GPIOA_CLK_ENABLE();3 }, C6 `  w) |
  77.     /**ADC1 GPIO Configuration   
    # i. U5 z- ^2 A% D
  78.     PB0     ------> ADC1_IN8
    # L1 Z' _- I% z4 I9 `3 X
  79.     PA11 [PA9]     ------> ADC1_IN15 , [! Z8 [2 T9 A
  80.     */
    - @8 k9 s$ n$ y6 a- L9 \: X( S0 y
  81.     GPIO_InitStruct.Pin = GPIO_PIN_0;9 Q8 v" H8 k9 N$ O( V
  82.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    0 f  P  ^( r" \6 j5 M$ d
  83.     GPIO_InitStruct.Pull = GPIO_NOPULL;9 o( V, I0 _. q( F8 z
  84.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);# x3 |/ R. e8 B; G1 n0 y/ V3 Q. q2 E

  85. - {8 z- U* F( w6 M8 p7 D; K
  86.     GPIO_InitStruct.Pin = GPIO_PIN_11;
    ; K( a8 P# H  o' w! q8 {0 i
  87.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;4 x1 ^$ h# Z; T
  88.     GPIO_InitStruct.Pull = GPIO_NOPULL;& d& J/ L& R% o
  89.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ( X3 |( Q+ `( z: x4 D

  90. . S% W0 T  U% `, {+ v1 v- {8 `
  91.     /* ADC1 DMA Init */
    & d1 B' H8 c$ M4 X! V( f% ^& l; H! r
  92.     /* ADC1 Init *// s; ]: G4 [, p" b
  93.     hdma_adc1.Instance = DMA1_Channel1;
    5 w( a2 Q1 W& ~/ ?& F" E7 I
  94.     hdma_adc1.Init.Request = DMA_REQUEST_ADC1;
    ( s9 _  y: s; e$ M8 T; p
  95.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
    . v- i- x$ _! \: U2 p
  96.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
    7 `& M! Y- `, |6 k
  97.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
      q3 x! N/ k9 F7 L( G4 |& J& }- _
  98.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    1 C' E: m1 L3 [' I! r, R
  99.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;' g- }% ?8 h- |3 y9 k: }
  100.     hdma_adc1.Init.Mode = DMA_CIRCULAR;
    3 C8 H1 v4 y+ d* ~+ z
  101.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;! T( |7 c% j: P- p( |/ H, O3 P1 s
  102.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)3 n! X, a) n2 T4 k  k
  103.     {) x. ?5 O& S" P
  104.       Error_Handler();, X" y2 s9 E- G, P
  105.     }5 q3 j6 r* A; n2 X& v" p  i

  106. # o7 `2 E9 }9 b( z8 [
  107.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);
    8 G: P& e5 F1 H/ k

  108. 6 m& \9 n( b4 ]! \3 k; d& M
  109.   /* USER CODE BEGIN ADC1_MspInit 1 */& ?, U; m$ @/ e
  110. , z. ]( j) R( `) d  G
  111.   /* USER CODE END ADC1_MspInit 1 */
    . U6 o1 A$ u: M8 w, ^! I
  112.   }7 G1 C  X+ M  M# p4 }0 Z, }+ y
  113. }
复制代码
, `. C; X6 o6 z+ C' i- Z4 D
把STM32CubeMX生成的代码下载到芯片中运行,结果ADC1_8的值可以读到,但是ADC1_15的值却一直为0.
& S5 n8 c; t: Z/ G' T0 z
1 T; N( ]5 u) E0 r6 T出现上述问题的原因是因为STM32G031的 ADC 序列器配置成完全可配置时,只能使用通4 P1 d1 k. f* s! O* e# M8 {; c
道 0-14,不能使用通道 15,16,17,18;所以在有使用到通道 15,16,17,18 的情况下,ADC 序列2 A3 K6 d3 i: O- v
器要配置成不完全可配置。Sequencer 选项选择为:Sequencer not fully configurable
+ X0 s/ t! I8 A如果是多通道则 Discontinuous Conversion Mode 要使能
6 s" w6 q5 l9 Z; e
# s( d6 r1 T& T1 c$ U/ d, o" U  [) O- o2 X
收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版