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

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

[复制链接]
IncoYang 发布时间:2020-9-28 17:54
在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的  LL_ADC_DisableDeepPowerDown(ADC1);
( a7 a) H; I  Z9 i/ L. P  LL_ADC_EnableInternalRegulator(ADC1);+ m* I$ r/ ~( x! g

2 s: b) s7 ]( `9 O( `& o$ r将导致ADC2不供电,无法工作,每次都要手工改过来才能正常工作。' `9 E9 Q" S3 H1 N$ @

$ I3 h3 }" k7 {( C( C& M- \2 j
6 r+ I. y& @6 v; O  * @brief ADC2 Initialization Function/ L8 `0 F( g2 j1 \  |6 r
  * @param None7 N: U- k% `+ ?( W' ~& Q% C
  * @retval None5 c5 E5 j( l1 N" L, p4 A
  */
! k7 T2 _. g% Zstatic void MX_ADC2_Init(void)( x: K6 |  r& P6 ^0 e
{' ?* t4 g& [! q  [2 [

& X% _/ Z8 O/ @/ \  /* USER CODE BEGIN ADC2_Init 0 */9 b$ ~$ H6 U1 ^1 K: ]
0 }7 l7 x8 ]6 W5 X; P
  /* USER CODE END ADC2_Init 0 */
2 @( k, c; }+ D/ W8 B
( ~6 ]0 j; b% x$ {- {$ k  LL_ADC_InitTypeDef ADC_InitStruct = {0};4 P( ?1 B1 K4 B' u" f
  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};" P7 m2 R  S8 _2 F

. g2 N7 e; r: S# W1 @/ ]/ ~  /* Peripheral clock enable *// D5 n" T2 @1 e7 X
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);' W7 @* m. q% c* H
. V: l" q: c0 h1 P. T1 p* K8 M) h
  /* ADC2 DMA Init */
0 A2 F6 w# v: I5 a
0 _; H0 S7 R3 R: [  /* ADC2 Init */7 k/ R1 F3 I/ B9 f7 U* h) O
  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2);- g$ C! K9 E9 b; H6 q* H1 [+ s% r

& {& n$ |/ Y  B  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);" c. x5 ?5 t- N; m/ r

- `2 G3 s( ]) `  LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM);
% {1 d0 s5 `1 r0 |. R) C" Z2 E
2 B5 {7 \5 T/ V4 [  LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);1 e$ y. d0 R4 i0 r5 Q

4 O# u9 _* g7 O( b  \8 \* U, u4 b- r  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);4 {3 B% ^! n; I4 e$ P0 B( }

2 b6 K) ?+ N! r. L' j  K: M  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
  [& J4 c+ R/ K. W7 L* i/ G. n" z  w1 ~- j, E  ?$ G
  LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);
+ E( D/ |/ j( h4 |, X- V8 s/ v( M0 H& W& V2 g+ b: e
  LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);
$ s* d; O- ^$ Y7 C8 h# Z0 u6 ]( f0 A4 H4 a7 j7 o0 L! F+ T( D
  /* USER CODE BEGIN ADC2_Init 1 */1 R. G7 D! ]) b- t3 k

' y2 P' H; `( C% W0 ?5 t) w  /* USER CODE END ADC2_Init 1 */. m: d$ X& n/ W# {
  /** Common config7 ?% l4 q. T6 i
  */, _2 ]. H7 e8 r
  ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;" C1 t( F: Z; _% h1 e2 f: ?: q& U
  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT;
4 m- u  }5 N* H; z3 l  ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;  x) r1 P9 Z' J
  LL_ADC_Init(ADC2, &ADC_InitStruct);
" y  P! J! Y: q$ O  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIM8_TRGO;
+ v. N7 K" j4 Y$ p  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;3 e! G  `3 J/ m3 u
  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;1 ^/ P3 N$ h* w. D) Q, S( Q
  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;0 L' q0 H8 ^# b& u
  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;3 i( X& l* c5 s+ I9 A
  ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;1 Z. e8 w8 M( L! }
  LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);" r. {% ]- e- ~) e" z5 {
  LL_ADC_SetGainCompensation(ADC2, 0);
. b/ S  ?9 D) c: |+ Z' c, Q  LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE);3 X+ J4 }# i' y7 ^- D

, u0 H6 Q0 o$ I5 t0 b& }" X  /* Disable ADC deep power down (enabled by default after reset state) */8 u5 A) F- n: b9 H9 N% S8 _
  LL_ADC_DisableDeepPowerDown(ADC1);
  T, q& j7 {+ V! f  /* Enable ADC internal voltage regulator */
( q* J, p2 O. z7 _: t  C9 S6 g3 U9 ]  LL_ADC_EnableInternalRegulator(ADC1);
! `+ V( J8 [7 d  /* Delay for ADC internal voltage regulator stabilization. */
8 F! \. N9 K2 D% W  /* Compute number of CPU cycles to wait for, from delay in us. */
3 h% @" `  f$ T3 B" Z2 A- L  /* Note: Variable divided by 2 to compensate partially */  B: T4 C7 o% K2 J# ~; e: [
  /* CPU processing cycles (depends on compilation optimization). */
/ R6 k- Y- {' J' f% ~! }+ l  /* Note: If system core clock frequency is below 200kHz, wait time */& C6 {- O- |5 K3 B! @3 r9 n: E
  /* is only a few CPU processing cycles. */
+ H( N' F* f$ W7 a9 B* z( V
) Q, C+ z* o4 W0 F* n* \, @  uint32_t wait_loop_index;4 u4 J( r" b+ E
  wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);' q  m0 h" ?9 }1 r
  while(wait_loop_index != 0)
- S% _- i, ~6 i5 e2 Z# x  t6 y: E  {
3 R7 R  t0 j, q8 P. B    wait_loop_index--;6 x4 a4 Y, {" D
  }( b$ h5 @0 L  r1 b" n) X
  LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING);$ |9 j  o' m% `$ S. [! P# f
  /** Configure Regular Channel
8 n. N' L( T& J1 J0 p  */
: D8 Y& B8 M+ n/ w; T  LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_VOPAMP3_ADC2);
1 K8 B# V5 ^3 d/ U5 n& s5 d3 J1 }  LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SAMPLINGTIME_6CYCLES_5);, p, I) r$ E- Z; c2 X5 S! @
  LL_ADC_SetChannelSingleDiff(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SINGLE_ENDED);2 d) \9 G; K" E: k2 u
  LL_ADC_SetOffset(ADC2, LL_ADC_OFFSET_1, LL_ADC_CHANNEL_VOPAMP3_ADC2, 0);
! J: U, ^4 T* s1 D4 J- r  LL_ADC_SetOffsetSign(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SIGN_NEGATIVE);! Z( Q) t  x  H$ W, N) V! B
  LL_ADC_SetOffsetSaturation(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SATURATION_DISABLE);8 Z# H: h/ `5 X+ W
  /* USER CODE BEGIN ADC2_Init 2 */1 ~0 O8 {/ P( o. h, c& B" l
  LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED);5 ^- O, S) J% t$ v) e& X6 b
  while (LL_ADC_IsCalibrationOnGoing(ADC2) != 0)  { };
5 o! w! `7 g" g" u2 Z( K( m. C9 }4 R! ^$ ^+ J
  wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1);) d* M! H: n/ g: \8 A. _
  while(wait_loop_index != 0)) E: `, o5 K) P! V
  {" y$ Y8 @, G5 R0 ?( R, h: Q
    wait_loop_index--;6 H/ R6 f2 o& W& h% ~
  }9 e! N$ h" F) c9 k/ K  ]6 N4 E2 _
  /* Enable ADC */
) C- F: ?* B6 i% O5 e9 k' O  LL_ADC_Enable(ADC2);
2 H+ w3 x1 p/ w* b1 d0 Q2 o  K+ b+ @& m; m5 A
  /* Poll for ADC ready to convert */
& p& M3 j/ @9 J& J( y  while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0)         { };
* Q8 Z0 C2 j& e
: K0 R5 _3 n2 k2 w8 d5 x! b( m  w  /* USER CODE END ADC2_Init 2 */
$ I* B4 U8 k) d. [. }5 A
9 [* t5 w6 W4 E. N}
  K* `2 v& w: {2 Q) ?. B
# r* ~* J# Y6 X, a' i& V$ R
7 {9 b/ |/ c$ _, j! T' J' n
2 u! P8 R. ?2 r  |2 A
赞 收藏 评论0 发布时间:2020-9-28 17:54

举报

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