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

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

[复制链接]
IncoYang 发布时间:2020-9-28 17:54
在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的  LL_ADC_DisableDeepPowerDown(ADC1);
) k* |! d# q) s9 Q4 Y8 J; H  LL_ADC_EnableInternalRegulator(ADC1);
$ Z+ M& e- C6 w7 e1 a0 v. Y: T$ B! Y- @, m! V8 m2 ~' K1 \
将导致ADC2不供电,无法工作,每次都要手工改过来才能正常工作。& c$ |' {; {' z9 @+ H) i$ s0 v) p; E
. K# j, _9 L. k5 n. C' P
$ b/ u% _( v, B  @
  * @brief ADC2 Initialization Function
1 B  N! `" c0 z& q3 a" V2 p& Q: n  * @param None. E# e4 J% N2 V0 i# k' x$ u
  * @retval None
& z+ A" M1 V- Y8 r  */
8 k) K  d9 L0 U9 ~, E$ a- Zstatic void MX_ADC2_Init(void)
7 n  m5 _, V$ u6 {% x{; A' _$ d# }$ b/ G) z" o

/ x/ R7 g! l6 X) |  /* USER CODE BEGIN ADC2_Init 0 */4 Q( D8 N# a! k' Z
6 c- z1 g+ L  H% _: c* {
  /* USER CODE END ADC2_Init 0 */
' y! x4 f$ {1 u- r0 U5 }- ]% Q
" d* O. M7 H' _% J  LL_ADC_InitTypeDef ADC_InitStruct = {0};
% g& o6 ?* y% h! V" O/ B  P  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};* K8 R' Q* p, a

7 Q) F: H* u2 A9 V  /* Peripheral clock enable */3 C1 D( d4 D- e  [* y! [4 X9 ?
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);# h% U" C2 |4 V/ v+ P6 w7 B
* r2 ~7 n; j# l
  /* ADC2 DMA Init */  S1 b4 k  d$ E3 u$ ~. m
2 i  C; C. f$ r0 w1 F3 x3 R7 r
  /* ADC2 Init */) c) n4 v( m( T$ }3 k6 C& h+ T
  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2);
0 V6 z7 ~5 A0 X. a2 B) {3 ]. q; j1 v1 Q) h: a
  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);7 ]! E4 P6 o# t* B8 E

' {  W- `" q! K7 C9 _# i  LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM);
$ a, K! Y0 A, ]
- }4 P8 Z( K) R7 ?. F* P% Y9 w9 i4 ^  LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);
5 u& d% t# ^5 B: p; ?5 V
- B/ u* m, {" n; h  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);
$ b/ K. V! Y& W& M3 q6 J, _
6 u' I- V# `: W7 r% a& B% \  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
; I8 c9 H" A- Q, e& N' }* {
/ h4 H# j5 i, x  `0 J( _. ?  LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);
( x; j( ^/ n" H3 ^. G2 V
( m$ ^) T' v" I' K  LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);/ v; I2 ?2 w: _4 I: [

: X/ c; N2 l1 G; G( s" @  /* USER CODE BEGIN ADC2_Init 1 */% R. M2 q0 y& d: o+ `; v* r# X) Q8 h
0 D- C1 \6 O1 v8 t* \6 G
  /* USER CODE END ADC2_Init 1 */
) ^$ q; n/ W# G# T/ t# f  /** Common config
7 v. L, A5 x6 b  */3 m  Z/ q6 ~. }, D) |* I9 P$ A
  ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;
, U) r3 b' D: k% b0 c7 u! f$ ?) E# Z  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT;7 ~' L8 v* M6 T2 A, K1 b- c) l
  ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;! L  U6 K" [4 C7 T# l3 y
  LL_ADC_Init(ADC2, &ADC_InitStruct);
3 M3 ?8 l" ~0 w& E% h+ w% C  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIM8_TRGO;
( w) l! Y4 G; Q  V, S. k% c( D# I  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
, j; G1 E  X" v) R# Q  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;) e+ ?- P1 |& E4 T1 Y! I! ~  J
  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;
; _6 e6 |% B" C4 [1 W9 V  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;/ U. l$ J" h$ _6 D2 S& {! F
  ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;) v5 E1 L" k. d
  LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);
. R" E1 A% s& E9 s1 M  LL_ADC_SetGainCompensation(ADC2, 0);
8 R6 N8 _) a( K  d  LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE);( t/ L: `# |$ Y/ V! t! C

5 k9 p( ^+ |) ^% N# l. F( [  /* Disable ADC deep power down (enabled by default after reset state) */; b% n7 v% R" Y  W
  LL_ADC_DisableDeepPowerDown(ADC1);
0 t5 ~. ?- Z/ v; g0 E* \7 V9 S  /* Enable ADC internal voltage regulator */( m( e; @  R6 L: _* k
  LL_ADC_EnableInternalRegulator(ADC1);, y: p- \; t! B6 T* G# H3 D0 j
  /* Delay for ADC internal voltage regulator stabilization. */' U8 `: |3 ~5 {' q6 A
  /* Compute number of CPU cycles to wait for, from delay in us. */$ S; a9 D( }2 o  I4 l
  /* Note: Variable divided by 2 to compensate partially */
1 _1 F7 |/ G5 K, x  /* CPU processing cycles (depends on compilation optimization). */
- K% o  G  P, E7 }4 `; v3 n+ d  /* Note: If system core clock frequency is below 200kHz, wait time */% C# u+ |) O- m7 u! L7 z5 |. Z
  /* is only a few CPU processing cycles. */+ ]0 x# G" K9 H, i& V' I5 ~

9 J, |; p0 ?) c: `2 `  uint32_t wait_loop_index;
) O( R* N  ^4 ?) o, o) i; H6 @  wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);$ B* g5 `2 Z8 p7 j" i. I' V
  while(wait_loop_index != 0)
$ b0 p' f  Q7 }, \4 A7 k  {
9 t- ?+ x8 P/ ?: `    wait_loop_index--;  \. H- L) L8 l2 h8 ]$ t  G
  }- W% W" o$ h' G. o7 Y/ P
  LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING);. g1 R+ J1 y" w1 G
  /** Configure Regular Channel7 \" q) Y/ ?& c
  */: s/ }: e* ]: R! w3 E
  LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_VOPAMP3_ADC2);1 M8 n9 R: w' h  p3 \: G% v
  LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SAMPLINGTIME_6CYCLES_5);5 H( ~8 D4 g' \. Z1 N" G
  LL_ADC_SetChannelSingleDiff(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SINGLE_ENDED);
+ U  E, F3 d5 \2 u  r  LL_ADC_SetOffset(ADC2, LL_ADC_OFFSET_1, LL_ADC_CHANNEL_VOPAMP3_ADC2, 0);
, ?8 u. ]  \5 `* {  LL_ADC_SetOffsetSign(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SIGN_NEGATIVE);
7 N' J$ w  {, X$ l& k  LL_ADC_SetOffsetSaturation(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SATURATION_DISABLE);( o, s! ^* F$ M3 v
  /* USER CODE BEGIN ADC2_Init 2 */
, T1 Y& [1 K/ ~; X% |0 i+ D$ J  LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED);4 Z' R" q* `2 u8 [$ ~/ ]# d
  while (LL_ADC_IsCalibrationOnGoing(ADC2) != 0)  { };; T$ B* S1 n6 F6 x+ \: n

: K& ~" G- o5 h8 {5 J  wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1);
! @! C; W( q  a; S9 G  while(wait_loop_index != 0)
# m# @7 |6 Y3 j# F/ z  {
; U7 W+ E9 j- h; J: J$ @5 C! r0 F    wait_loop_index--;
4 D3 r$ D. P5 o$ ?  }, e) i! o+ o8 w3 k1 p5 G! k% r0 b
  /* Enable ADC */# A- a5 f8 s6 R) @2 Y: N
  LL_ADC_Enable(ADC2);/ `5 l5 P: U) R7 _( T

- [' s* j1 t! r. y0 {% B  /* Poll for ADC ready to convert */  O  f- a8 F7 ]: x
  while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0)         { };
  }$ k* n) e5 {' E3 B/ R* H7 a1 u, g! E9 ^
  /* USER CODE END ADC2_Init 2 */+ M. }5 {. V- D0 L! \

% @6 @, J2 \9 q1 e; S& ~% Q" S" Q3 U}
2 o- ^! @- g% X& w- x( o0 h+ }# J/ R* f. f2 X5 Q+ O4 M! J5 v2 y
1 }1 o, B/ X( q, R8 W5 L9 X
, f; V; M+ V1 {( ^  O" q3 X
收藏 评论0 发布时间:2020-9-28 17:54

举报

0个回答

所属标签

相似分享

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