|
在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的 LL_ADC_DisableDeepPowerDown(ADC1); LL_ADC_EnableInternalRegulator(ADC1);( R! D+ r. Z9 i% n7 o1 k * c$ R# D) z9 _+ s 将导致ADC2不供电,无法工作,每次都要手工改过来才能正常工作。, H1 `0 N: `3 K- {0 F! }# B , h% ^5 Q; V0 v3 T+ ~ * @brief ADC2 Initialization Function, p0 d6 {1 Y: v * @param None * @retval None */ static void MX_ADC2_Init(void) {/ y- q w* U, U* S& I /* USER CODE BEGIN ADC2_Init 0 */ % y" K% s5 @* L( ^$ Q /* USER CODE END ADC2_Init 0 */ % B3 w; \& p% b LL_ADC_InitTypeDef ADC_InitStruct = {0}; LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0}; /* Peripheral clock enable */ LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);: a/ t, T3 T3 r ) n% |# d& @' a$ [ /* ADC2 DMA Init */ /* ADC2 Init */ LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2); H5 E) n, ~* Q$ d LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);5 u. p! l& {9 t" q! O- } LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM);5 x! a0 e# ?" _- C0 v6 ?3 ?* } LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);4 I1 i* o; t$ F* N8 W7 M % F5 G0 R* x- M# ?/ `5 g LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);2 |. X( N6 C/ S" a* S7 K6 d$ } LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT); . l E$ n ~. E" W LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD);- p& H, `+ f3 j; W6 w LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);/ K8 @1 A, J( Z9 l. O' | /* USER CODE BEGIN ADC2_Init 1 */. S, M9 W4 w/ x, l/ g6 K /* USER CODE END ADC2_Init 1 */ /** Common config7 k# h- A7 g; J) h, q9 f */# Y [7 b1 N; G) a' w; j% Z% P ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;1 Z6 D/ y( |6 [. |* c( d ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT;0 N7 s' @, {7 W$ U8 Q8 M 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; 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; ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;# Y, s2 ?! M: w3 J- s0 t' t ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN; n/ V6 w: k# \9 c: V s; c# @ LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);. a8 [. G' J) [5 L( O- _3 z LL_ADC_SetGainCompensation(ADC2, 0);- z" k% g% F# C2 K! X: X) x LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE); /* Disable ADC deep power down (enabled by default after reset state) */; Q. D( I) x3 d$ y. P0 [1 x$ E LL_ADC_DisableDeepPowerDown(ADC1);8 v( Z* X$ d8 l- F1 c/ v /* Enable ADC internal voltage regulator */8 i: q7 U) Y) A1 N( k; u LL_ADC_EnableInternalRegulator(ADC1); /* Delay for ADC internal voltage regulator stabilization. */2 L6 a) E. c9 _6 f: l /* Compute number of CPU cycles to wait for, from delay in us. */ /* 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/ E+ f/ H# ~: d /* is only a few CPU processing cycles. */& h* e0 u9 t c% [! y; | uint32_t wait_loop_index;( Q+ y& _, Q' @4 n, F4 A wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);+ t: }! d8 B4 M while(wait_loop_index != 0)1 Q! S- Q, G( ^2 Q+ r$ A { wait_loop_index--;0 k+ z4 o* {# R5 i }, m* ]+ | ^4 P0 @8 H5 T/ n3 d LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING); /** Configure Regular Channel8 W' [+ R' q, Q! y/ ]* M6 D' q */ LL_ADC_REG_SetSequencerRanks(ADC2, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_VOPAMP3_ADC2); LL_ADC_SetChannelSamplingTime(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SAMPLINGTIME_6CYCLES_5); 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); e' L( q4 }4 X; Q' |# D1 U 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);; W [) Z6 M: l) x# t% U9 ]8 r /* USER CODE BEGIN ADC2_Init 2 */ LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED);- K+ V, b+ p9 P3 v4 S; q while (LL_ADC_IsCalibrationOnGoing(ADC2) != 0) { };5 P$ y# X! [0 a7 r+ G 8 [$ Q+ ^$ Z! T x0 H2 t' \ wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1); while(wait_loop_index != 0)% c! K1 E! f( h, ^7 G& ]- \1 V1 b {+ G/ P* C1 y& B# n* S, y$ P8 E8 y wait_loop_index--; } /* Enable ADC */) t; @+ _2 ^7 j LL_ADC_Enable(ADC2); /* Poll for ADC ready to convert */3 j5 [; t8 n; g5 M% n( ] while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0) { };; b" V2 z6 F: |6 z% g. k! ~ ( i* G. T2 M9 j! G1 c4 T /* USER CODE END ADC2_Init 2 */8 t7 R: y& C- N& E }- O, A6 O7 s, b2 }# V & z7 H5 H& Z( i. h: ] ) d8 n) Y+ _3 O. k6 z6 [1 f1 b # m( }% o0 [+ O* X. z6 m |
微信公众号
手机版