在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的 LL_ADC_DisableDeepPowerDown(ADC1); LL_ADC_EnableInternalRegulator(ADC1); ( 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 * @retval None8 y% K3 ]7 d2 z8 `1 E6 h" z8 E */4 X0 E3 v6 V# [# i. ] static void MX_ADC2_Init(void) { /* USER CODE BEGIN ADC2_Init 0 */ /* USER CODE END ADC2_Init 0 */ # a& r9 f+ g# p% o4 k | LL_ADC_InitTypeDef ADC_InitStruct = {0}; 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 */ LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);) j% _9 M' O* B$ i$ Y" j6 A /* ADC2 DMA Init */ 4 w+ f! ^- b# p$ Z+ I9 t3 @, l* _' W /* ADC2 Init */ LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2);7 y7 m* H8 e# g, J; l# U/ \# N LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); ' 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); ' 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 LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT); LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD); LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);; o% D/ l8 z8 Y( [7 h. e. a( v, n /* 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 \) { */ ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B; ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT; ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE; LL_ADC_Init(ADC2, &ADC_InitStruct); 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; ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; 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; ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN; LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);% y8 j8 S5 y+ d* W O3 m" I LL_ADC_SetGainCompensation(ADC2, 0); LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE); # ?; 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); /* Enable ADC internal voltage regulator */ LL_ADC_EnableInternalRegulator(ADC1);" \+ ^, j0 O' D6 w5 K /* Delay for ADC internal voltage regulator stabilization. */ /* 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 */ /* is only a few CPU processing cycles. */% ~3 i& H& C: J! L 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); while(wait_loop_index != 0)( s& P8 O1 M* v { 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); /** Configure Regular Channel */ 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); 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); /* USER CODE BEGIN ADC2_Init 2 */- D; q* x' R, f LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED); 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); 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 \, ` } /* Enable ADC */0 g3 G3 z `/ f9 ]7 @ f LL_ADC_Enable(ADC2);! @# H% u3 W7 Z+ c0 j" I6 L% F /* Poll for ADC ready to convert */5 e/ O- g: s# K0 w" Q while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0) { }; 6 f" Y2 N/ |9 a# s /* USER CODE END ADC2_Init 2 */. Q+ l6 k m/ R4 P* f/ ^/ B5 [! I } % 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 |