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

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- D; N  v* n: j/ P# A; e, a4 l  u  LL_ADC_EnableInternalRegulator(ADC1);
: o2 |; p* T3 v8 Z9 ^* W: h8 A( W2 G% u7 k9 t, E% j, k: G2 G" `
将导致ADC2不供电,无法工作,每次都要手工改过来才能正常工作。8 j3 i) x, p% o" e9 a
, f& Q) |8 ]+ [# U
. d1 Y" e6 m; t" N+ ]7 F8 I
  * @brief ADC2 Initialization Function  }5 D7 C* _7 l- u
  * @param None
! z; k$ m. o3 \$ @  * @retval None8 y% K3 ]7 d2 z8 `1 E6 h" z8 E
  */4 X0 E3 v6 V# [# i. ]
static void MX_ADC2_Init(void)
' V& [: T1 {" g{
" f! C7 l8 s+ \% d3 h6 L; z2 n- m
2 A1 h9 H$ w, N. N  /* USER CODE BEGIN ADC2_Init 0 */
  F/ v2 v) B" ^8 h8 a
1 I$ C; L' z5 _6 |3 I: ]- F/ N  /* USER CODE END ADC2_Init 0 */
6 t2 l% G' I3 F& K: ?$ z# a& r9 f+ g# p% o4 k  |
  LL_ADC_InitTypeDef ADC_InitStruct = {0};
6 z3 r7 w, |0 c4 D6 ]( u  LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};* h4 Y+ ?9 ]+ `' _  f% ]- W: D
& v% C* K7 N7 y2 Q) B* U
  /* Peripheral clock enable */
; f7 G1 e' ]7 `, _3 A0 U  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);) j% _9 M' O* B$ i$ Y" j6 A

& g8 K7 p- z# x# T" d' W, F9 `1 t; J  /* ADC2 DMA Init */
- `- A' \; O# z* Y6 H" \/ |9 M4 w+ f! ^- b# p$ Z+ I9 t3 @, l* _' W
  /* ADC2 Init */
: x0 J; j+ z) G, L  LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2);7 y7 m* H8 e# g, J; l# U/ \# N

! l# Z( e& Q3 m/ p0 |  LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
0 |1 b: y: N: e# S; t0 T9 G6 _4 u' r$ q2 Q* i4 `" b1 [) u; E; X
  LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM);4 M* l- o; s& w' w7 _3 I1 w3 u
; F* U/ |; V+ `4 t2 L
  LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);
8 t. g, ?! t& I& V% n' A2 ]! K$ R; j8 s9 w5 }/ {3 |
  LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);1 L) L' }& ~5 o' C* o4 X/ T

' x; M/ k) ~5 ^- q  LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);
: Z$ e- z. l, S7 J2 F3 ^5 d
/ K+ h. ?! e2 n8 ^  LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);
: i, V  s, R3 m+ F% j. l3 \
: K8 W# {+ X- _# o; D7 Z  l  LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);; o% D/ l8 z8 Y( [7 h. e. a( v, n

2 H) {- y, h8 Q1 j5 S- b' |  /* USER CODE BEGIN ADC2_Init 1 */$ x$ A9 |5 T6 L3 V' u$ C
. N1 Z) A3 t' h  j+ a
  /* USER CODE END ADC2_Init 1 */. P- d: F) |: k4 {0 l& J% o
  /** Common config! D( {9 \( ^, j" K7 \) {
  */
% O6 ~5 K+ u- q& j: r9 d% M  `  ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;
8 A7 ?% P1 u- d/ c, O/ k6 x  ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT;
$ Y/ K+ R6 ~* N) o6 L  ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE;
' U" c$ `2 B( U+ j0 e" H* S% j  LL_ADC_Init(ADC2, &ADC_InitStruct);
* {1 W# ^- B. T3 U  ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIM8_TRGO;+ b* e9 O6 k  e3 Q& _7 q
  ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE;
$ [! w; Z. _; ~4 v) I4 p" }  ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
/ @# \; I$ W: P- _  ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;. v# e' k& S, s& K% y7 `  `1 A
  ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;
+ [- V7 X- D  e: E. J% o& e% b3 z  ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;
9 x% v6 ]+ X; b  LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);% y8 j8 S5 y+ d* W  O3 m" I
  LL_ADC_SetGainCompensation(ADC2, 0);
0 ~9 c, C7 M# a8 U) F1 `  LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE);
; g/ n7 c8 N: n9 [( B# ?; V6 l; k& y. }. ~# u
  /* Disable ADC deep power down (enabled by default after reset state) */4 V& q2 J7 y2 F, o
  LL_ADC_DisableDeepPowerDown(ADC1);
& p  s' k) f6 F) J. }  /* Enable ADC internal voltage regulator */
5 x: r/ c1 k0 B4 ^, J1 q" v: k  LL_ADC_EnableInternalRegulator(ADC1);" \+ ^, j0 O' D6 w5 K
  /* Delay for ADC internal voltage regulator stabilization. */
8 U7 B1 {3 H- \( t& s  /* Compute number of CPU cycles to wait for, from delay in us. */6 B& R9 N0 U6 v' [3 q/ t" X8 h( p
  /* Note: Variable divided by 2 to compensate partially */2 w+ b7 t; P% g0 t9 P) h2 S3 ~# D
  /* CPU processing cycles (depends on compilation optimization). */% j6 S# v' s8 x' k5 _  D
  /* Note: If system core clock frequency is below 200kHz, wait time */
6 F% A, j7 c$ `  /* is only a few CPU processing cycles. */% ~3 i& H& C: J! L

& N( r- Z: @4 V/ v: C1 i( d  uint32_t wait_loop_index;" U* {. K! ]) N* V& m1 x& D
  wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);
2 A! y- Y! X6 {/ t* f# |* ?' A2 y2 ]  while(wait_loop_index != 0)( s& P8 O1 M* v
  {
  P3 C- P; [4 n" @; j! o; Z    wait_loop_index--;+ {- V, Z! M2 }2 R/ l
  }3 E( H$ Y* E# v0 Y
  LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING);
# q# a. K3 u0 ]! j+ D$ X/ I* b# J  /** Configure Regular Channel
3 i  J$ M5 V+ p  J% U  */
. w7 W5 q  i! K3 W: o  LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_VOPAMP3_ADC2);0 u& ^" D. F# G$ d% @2 V/ F3 ~
  LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SAMPLINGTIME_6CYCLES_5);% U9 {) e. B1 Q; @/ E8 f& c
  LL_ADC_SetChannelSingleDiff(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SINGLE_ENDED);6 s' g* M9 U# `" H0 g
  LL_ADC_SetOffset(ADC2, LL_ADC_OFFSET_1, LL_ADC_CHANNEL_VOPAMP3_ADC2, 0);
; u3 o7 u4 H3 n9 F  LL_ADC_SetOffsetSign(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SIGN_NEGATIVE);* C" ~. n# G2 m4 I# T1 f
  LL_ADC_SetOffsetSaturation(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SATURATION_DISABLE);
# B! y( f: m2 {  ~* c9 U. [7 g& Z* `  /* USER CODE BEGIN ADC2_Init 2 */- D; q* x' R, f
  LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED);
' J9 i1 g# O( G0 ^7 R  while (LL_ADC_IsCalibrationOnGoing(ADC2) != 0)  { };: [  U  h( x4 J
$ E7 V" ^( y# w( `3 T- p% ^
  wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1);
/ o! b2 E7 @5 N/ o! n  while(wait_loop_index != 0)! B: @$ q6 l2 B3 ]: W  s$ ~
  {. W: B  c3 j$ ?5 K( m& k
    wait_loop_index--;3 z$ L! f1 \, `
  }
0 W, N6 F" v1 w' v1 a+ R  /* Enable ADC */0 g3 G3 z  `/ f9 ]7 @  f
  LL_ADC_Enable(ADC2);! @# H% u3 W7 Z+ c0 j" I6 L% F

& j/ k4 m1 T0 T& E4 Y  /* Poll for ADC ready to convert */5 e/ O- g: s# K0 w" Q
  while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0)         { };
; t2 d( A" U$ d. R6 f" Y2 N/ |9 a# s
  /* USER CODE END ADC2_Init 2 */. Q+ l6 k  m/ R4 P* f/ ^/ B5 [! I

4 z' q1 g$ e& R}
8 u# @- S  [1 S: p# R4 R% c, W( a0 h  J/ h3 C) ]
9 D8 x" h4 y8 @8 u! t8 s8 G9 C
2 C' g( w8 O8 ^4 X
收藏 评论0 发布时间:2020-9-28 17:54

举报

0个回答

所属标签

相似分享

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