|
在cubeide中,用cubemx产生stm32g474re LL库的初始代码中,ADC1和ADC2配成独立工作,但是在MX_ADC2_Init(void)中,这两句是错的 LL_ADC_DisableDeepPowerDown(ADC1); LL_ADC_EnableInternalRegulator(ADC1);+ m* I$ r/ ~( x! g 将导致ADC2不供电,无法工作,每次都要手工改过来才能正常工作。' `9 E9 Q" S3 H1 N$ @ * @brief ADC2 Initialization Function/ L8 `0 F( g2 j1 \ |6 r * @param None7 N: U- k% `+ ?( W' ~& Q% C * @retval None5 c5 E5 j( l1 N" L, p4 A */ static void MX_ADC2_Init(void)( x: K6 | r& P6 ^0 e {' ?* t4 g& [! q [2 [ /* USER CODE BEGIN ADC2_Init 0 */9 b$ ~$ H6 U1 ^1 K: ] 0 }7 l7 x8 ]6 W5 X; P /* USER CODE END ADC2_Init 0 */ LL_ADC_InitTypeDef ADC_InitStruct = {0};4 P( ?1 B1 K4 B' u" f LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};" P7 m2 R S8 _2 F /* Peripheral clock enable *// D5 n" T2 @1 e7 X LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12);' W7 @* m. q% c* H . V: l" q: c0 h1 P. T1 p* K8 M) h /* ADC2 DMA Init */ /* ADC2 Init */7 k/ R1 F3 I/ B9 f7 U* h) O LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC2);- g$ C! K9 E9 b; H6 q* H1 [+ s% r LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);" c. x5 ?5 t- N; m/ r LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_MEDIUM); LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_NORMAL);1 e$ y. d0 R4 i0 r5 Q LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);4 {3 B% ^! n; I4 e$ P0 B( } LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT); . n" z w1 ~- j, E ?$ G LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_WORD); , X- V8 s/ v( M0 H& W& V2 g+ b: e LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD); 6 ]( f0 A4 H4 a7 j7 o0 L! F+ T( D /* USER CODE BEGIN ADC2_Init 1 */1 R. G7 D! ]) b- t3 k /* USER CODE END ADC2_Init 1 */. m: d$ X& n/ W# { /** Common config7 ?% l4 q. T6 i */, _2 ]. H7 e8 r ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;" C1 t( F: Z; _% h1 e2 f: ?: q& U ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_LEFT; ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE; x) r1 P9 Z' J 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;3 e! G `3 J/ m3 u ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;1 ^/ P3 N$ h* w. D) Q, S( Q ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_SINGLE;0 L' q0 H8 ^# b& u ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;3 i( X& l* c5 s+ I9 A ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN;1 Z. e8 w8 M( L! } LL_ADC_REG_Init(ADC2, &ADC_REG_InitStruct);" r. {% ]- e- ~) e" z5 { LL_ADC_SetGainCompensation(ADC2, 0); LL_ADC_SetOverSamplingScope(ADC2, LL_ADC_OVS_DISABLE);3 X+ J4 }# i' y7 ^- D /* Disable ADC deep power down (enabled by default after reset state) */8 u5 A) F- n: b9 H9 N% S8 _ LL_ADC_DisableDeepPowerDown(ADC1); /* Enable ADC internal voltage regulator */ LL_ADC_EnableInternalRegulator(ADC1); /* Delay for ADC internal voltage regulator stabilization. */ /* Compute number of CPU cycles to wait for, from delay in us. */ /* Note: Variable divided by 2 to compensate partially */ B: T4 C7 o% K2 J# ~; e: [ /* CPU processing cycles (depends on compilation optimization). */ /* Note: If system core clock frequency is below 200kHz, wait time */& C6 {- O- |5 K3 B! @3 r9 n: E /* is only a few CPU processing cycles. */ uint32_t wait_loop_index;4 u4 J( r" b+ E wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10);' q m0 h" ?9 }1 r while(wait_loop_index != 0) { wait_loop_index--;6 x4 a4 Y, {" D }( b$ h5 @0 L r1 b" n) X LL_ADC_REG_SetTriggerEdge(ADC2, LL_ADC_REG_TRIG_EXT_RISING);$ |9 j o' m% `$ S. [! P# f /** Configure Regular Channel */ 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);, p, I) r$ E- Z; c2 X5 S! @ LL_ADC_SetChannelSingleDiff(ADC2, LL_ADC_CHANNEL_VOPAMP3_ADC2, LL_ADC_SINGLE_ENDED);2 d) \9 G; K" E: k2 u 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);! Z( Q) t x H$ W, N) V! B LL_ADC_SetOffsetSaturation(ADC2, LL_ADC_OFFSET_1, LL_ADC_OFFSET_SATURATION_DISABLE);8 Z# H: h/ `5 X+ W /* USER CODE BEGIN ADC2_Init 2 */1 ~0 O8 {/ P( o. h, c& B" l LL_ADC_StartCalibration(ADC2, LL_ADC_SINGLE_ENDED);5 ^- O, S) J% t$ v) e& X6 b while (LL_ADC_IsCalibrationOnGoing(ADC2) != 0) { }; " u2 Z( K( m. C9 }4 R! ^$ ^+ J wait_loop_index = (ADC_DELAY_CALIB_ENABLE_CPU_CYCLES >> 1);) d* M! H: n/ g: \8 A. _ while(wait_loop_index != 0)) E: `, o5 K) P! V {" y$ Y8 @, G5 R0 ?( R, h: Q wait_loop_index--;6 H/ R6 f2 o& W& h% ~ }9 e! N$ h" F) c9 k/ K ]6 N4 E2 _ /* Enable ADC */ LL_ADC_Enable(ADC2); 0 Q2 o K+ b+ @& m; m5 A /* Poll for ADC ready to convert */ while (LL_ADC_IsActiveFlag_ADRDY(ADC2) == 0) { }; /* USER CODE END ADC2_Init 2 */ } |
微信公众号
手机版