在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的 LL_ADC_DisableDeepPowerDown(ADC1); LL_ADC_EnableInternalRegulator(ADC1); ! 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 * @param None. E# e4 J% N2 V0 i# k' x$ u * @retval None */ static void MX_ADC2_Init(void) {; A' _$ d# }$ b/ G) z" o /* 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 */ LL_ADC_InitTypeDef ADC_InitStruct = {0}; LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};* K8 R' Q* p, a /* 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); 2 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 LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM); LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL); LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT); 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);/ v; I2 ?2 w: _4 I: [ /* 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 */ /** Common config */3 m Z/ q6 ~. }, D) |* I9 P$ A ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B; 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); ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_EXT_TIM8_TRGO; ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_DISABLE; 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; 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); LL_ADC_SetGainCompensation(ADC2, 0); LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE);( t/ L: `# |$ Y/ V! t! C /* Disable ADC deep power down (enabled by default after reset state) */; b% n7 v% R" Y W LL_ADC_DisableDeepPowerDown(ADC1); /* 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 */ /* CPU processing cycles (depends on compilation optimization). */ /* 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 ~ uint32_t wait_loop_index; 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) { 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); 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); LL_ADC_SetOffsetSaturation(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SATURATION_DISABLE);( o, s! ^* F$ M3 v /* USER CODE BEGIN ADC2_Init 2 */ 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 wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1); while(wait_loop_index != 0) { wait_loop_index--; }, 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 /* Poll for ADC ready to convert */ O f- a8 F7 ]: x while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0) { }; / R* H7 a1 u, g! E9 ^ /* USER CODE END ADC2_Init 2 */+ M. }5 {. V- D0 L! \ } . 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 |