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

BUG: stm32g474 cubemx生成ADC2初始化代码有问题

[复制链接]
IncoYang 发布时间:2020-9-28 17:54
在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的  LL_ADC_DisableDeepPowerDown(ADC1);
5 r) f# Z  i8 \  u  LL_ADC_EnableInternalRegulator(ADC1);( R! D+ r. Z9 i% n7 o1 k
* c$ R# D) z9 _+ s
将导致ADC2不供电,无法工作,每次都要手工改过来才能正常工作。, H1 `0 N: `3 K- {0 F! }# B

* X/ a0 k2 G# o5 Y/ D, h% ^5 Q; V0 v3 T+ ~
  * @brief ADC2 Initialization Function, p0 d6 {1 Y: v
  * @param None
; g; Z# P$ Z: I% M6 F" E5 {4 O1 G  * @retval None
9 ]6 {, O3 j# E' u  */
4 F, _& r) j# kstatic void MX_ADC2_Init(void)
6 _* z; [' d8 c* S% C' _{/ y- q  w* U, U* S& I

0 ^4 {: Z' e$ O7 i7 T1 s  /* USER CODE BEGIN ADC2_Init 0 */
% ^& y0 a) Z5 J! G8 B+ p2 r% y" K% s5 @* L( ^$ Q
  /* USER CODE END ADC2_Init 0 */
# ?1 N3 R- h* {! G% B3 w; \& p% b
  LL_ADC_InitTypeDef ADC_InitStruct = {0};
/ k9 _, q# p, K: e9 J  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};
) A+ }7 O; H, W
# y' m. r7 P$ u* Q! ?$ L  /* Peripheral clock enable */
8 C. ]  ^9 v- b: W6 D! ?  {  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);: a/ t, T3 T3 r
) n% |# d& @' a$ [
  /* ADC2 DMA Init */
' e: e% L" C9 a' t( N% L* c
+ K' V; g( `+ D, C, t/ h% z- Z3 S) G" K  /* ADC2 Init */
+ |2 A) H  h4 [; i/ x  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2);
) `7 ^1 R3 x& v. O  D0 z$ `  H5 E) n, ~* Q$ d
  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);5 u. p! l& {9 t" q! O- }

4 W* n8 O% o+ i  LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM);5 x! a0 e# ?" _- C0 v6 ?3 ?* }

9 T! Q; {" `$ b$ {  LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);4 I1 i* o; t$ F* N8 W7 M
% F5 G0 R* x- M# ?/ `5 g
  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);2 |. X( N6 C/ S" a* S7 K6 d$ }

4 N: R1 ^5 ?/ ]8 t! I  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
/ ^% ]7 E" w2 a3 H( I( @. l  E$ n  ~. E" W
  LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);- p& H, `+ f3 j; W6 w

1 M7 p. o; E# X( w3 e1 K& N  LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);/ K8 @1 A, J( Z9 l. O' |

4 d! y6 _7 p, H3 `* o  /* USER CODE BEGIN ADC2_Init 1 */. S, M9 W4 w/ x, l/ g6 K

$ A& @0 W# O, g3 |: P  /* USER CODE END ADC2_Init 1 */
" A6 P. Q3 s8 {5 {* }  /** Common config7 k# h- A7 g; J) h, q9 f
  */# Y  [7 b1 N; G) a' w; j% Z% P
  ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;1 Z6 D/ y( |6 [. |* c( d
  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT;0 N7 s' @, {7 W$ U8 Q8 M
  ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;
0 ?' o9 g6 q. H' T) t0 `1 O  LL_ADC_Init(ADC2, &ADC_InitStruct);
! N' y1 `1 v% N7 m  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIM8_TRGO;
. h" U/ V1 z0 w/ }: D  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
) k* H0 p& R# Y9 |  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
, [/ R/ ]( `5 d* L/ |5 q( {$ d  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
7 w8 ~  f$ B9 H: H. ]) U3 }) @! J; f6 k  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;# Y, s2 ?! M: w3 J- s0 t' t
  ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;  n/ V6 w: k# \9 c: V  s; c# @
  LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);. a8 [. G' J) [5 L( O- _3 z
  LL_ADC_SetGainCompensation(ADC2, 0);- z" k% g% F# C2 K! X: X) x
  LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE);
  |; b% H! M: \! n( ^# ]6 D: ?+ E
& r/ \- T: ~4 P& x' O# R# Z! A# P" I) @  /* Disable ADC deep power down (enabled by default after reset state) */; Q. D( I) x3 d$ y. P0 [1 x$ E
  LL_ADC_DisableDeepPowerDown(ADC1);8 v( Z* X$ d8 l- F1 c/ v
  /* Enable ADC internal voltage regulator */8 i: q7 U) Y) A1 N( k; u
  LL_ADC_EnableInternalRegulator(ADC1);
: C1 _$ Y, s9 S8 {  /* Delay for ADC internal voltage regulator stabilization. */2 L6 a) E. c9 _6 f: l
  /* Compute number of CPU cycles to wait for, from delay in us. */
2 M# C1 e8 y$ W& c* k% N0 g  /* Note: Variable divided by 2 to compensate partially */
. m5 m0 a2 O6 F7 w  /* CPU processing cycles (depends on compilation optimization). */
  Y1 R' ]- ]! @1 r5 w  /* Note: If system core clock frequency is below 200kHz, wait time */( c/ E+ f/ H# ~: d
  /* is only a few CPU processing cycles. */& h* e0 u9 t  c% [! y; |

; `2 u- l6 p8 B7 _: m2 h: D3 a2 Y  uint32_t wait_loop_index;( Q+ y& _, Q' @4 n, F4 A
  wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);+ t: }! d8 B4 M
  while(wait_loop_index != 0)1 Q! S- Q, G( ^2 Q+ r$ A
  {
& a6 z' H0 @/ H; X% M9 p    wait_loop_index--;0 k+ z4 o* {# R5 i
  }, m* ]+ |  ^4 P0 @8 H5 T/ n3 d
  LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING);
; h' l( I. U1 O5 z5 J' r/ F  /** Configure Regular Channel8 W' [+ R' q, Q! y/ ]* M6 D' q
  */
! _$ \! G% ~8 r/ r+ `7 l  LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_VOPAMP3_ADC2);
2 D4 C, n: x, ~/ k5 E# B  LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SAMPLINGTIME_6CYCLES_5);
. ^4 A  E; q! F4 L  LL_ADC_SetChannelSingleDiff(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SINGLE_ENDED);
2 W6 b0 l/ O6 y8 k  LL_ADC_SetOffset(ADC2, LL_ADC_OFFSET_1, LL_ADC_CHANNEL_VOPAMP3_ADC2, 0);  e' L( q4 }4 X; Q' |# D1 U
  LL_ADC_SetOffsetSign(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SIGN_NEGATIVE);
8 u/ v+ [. W! \- P  LL_ADC_SetOffsetSaturation(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SATURATION_DISABLE);; W  [) Z6 M: l) x# t% U9 ]8 r
  /* USER CODE BEGIN ADC2_Init 2 */
, K) i. x8 I7 C4 T8 j+ A  LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED);- K+ V, b+ p9 P3 v4 S; q
  while (LL_ADC_IsCalibrationOnGoing(ADC2) != 0)  { };5 P$ y# X! [0 a7 r+ G
8 [$ Q+ ^$ Z! T  x0 H2 t' \
  wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1);
0 f' N; z/ S4 D2 h7 I6 L$ Y  while(wait_loop_index != 0)% c! K1 E! f( h, ^7 G& ]- \1 V1 b
  {+ G/ P* C1 y& B# n* S, y$ P8 E8 y
    wait_loop_index--;
# W% T* _( ^. ?0 i6 S$ q  }
* h/ Y5 H! Z6 I" _- V# |  /* Enable ADC */) t; @+ _2 ^7 j
  LL_ADC_Enable(ADC2);
  T6 V% _* z* m/ d) `# F+ ^& O
0 j0 `0 w# @7 h3 T  /* Poll for ADC ready to convert */3 j5 [; t8 n; g5 M% n( ]
  while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0)         { };; b" V2 z6 F: |6 z% g. k! ~
( i* G. T2 M9 j! G1 c4 T
  /* USER CODE END ADC2_Init 2 */8 t7 R: y& C- N& E

* h% e; l, a6 E7 e# Y}- O, A6 O7 s, b2 }# V
& z7 H5 H& Z( i. h: ]
) d8 n) Y+ _3 O. k6 z6 [1 f1 b
# m( }% o0 [+ O* X. z6 m
收藏 评论0 发布时间:2020-9-28 17:54

举报

0个回答

所属标签

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