STM32G031-使用STM32CubeIDE实现DMA处理ADC
8 K2 S# M3 e8 l; e/ d一、USART配置
( I6 U( y# s" [1 T7 }. x& w
0 t8 x7 U2 E, [) p' _% F# ^& T
{5 ]+ s# V8 l9 K% K" o
3 h$ x7 e9 G6 P5 _二、ADC配置' Z% ]; c! N& S) x1 C
! g5 U- d& P7 `$ k9 X
5 X/ S6 Q* [0 p6 Q! V
( ?5 S) l) a1 d+ m Y4 o t; S
' N( u, c2 q5 c
! b$ j- \& S5 @- _0 H$ ~8 X
+ Q. y; U1 N0 |2 j
1 f8 |: N; D8 D) j+ C配置完成后,生成代码即可。。。) p! H9 k5 x1 c" z7 ?
N3 k( v3 b4 s三、用户代码$ c8 h* F0 Y! T% N8 B+ ?
- /* USER CODE BEGIN Includes */
& I# u) h$ C4 x* r8 i
: J: z$ G" M% o* B+ H Z" u" T2 ?- #include "stdio.h"* o& B& h) j3 L/ V1 U
- /* USER CODE END Includes */
! d7 f/ r9 ~" i) C- b0 a! b
2 \2 _, G/ B7 A' a# e) ?8 ]; S- /* USER CODE BEGIN PD */
( }9 ?. n1 L( K3 [9 M0 r# a - #ifdef __GNUC__
8 }/ s& T5 D- A) {& q - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
: u1 g' ]0 V5 ?' ^4 A1 ]% D - #else
( \! a% ?( q, L! D2 b+ |1 S5 x! g - #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)
& w+ A$ v6 ~* U! @ ^3 ? - #endif
, T! a# A% ?- u/ Y" b - . k, p1 ]6 t/ c) U2 c2 Q
- PUTCHAR_PROTOTYPE; s( ~6 R8 ^' F8 B7 F [
- {
2 q# T/ N9 g0 }2 a2 z8 B - LL_USART_TransmitData8(USART2, (uint8_t)ch);
, p' y" Y* |+ m- r$ f* D - while(!LL_USART_IsActiveFlag_TXE(USART2)){} e: H' C; V% A4 _- Y
- return ch;
- ~9 D% q2 v c6 ^% C/ k0 | - }( E4 F5 l3 {1 s- ]9 K: s
- /* USER CODE END PD */- x" n& p7 E- Z( L
' g# h8 T. S6 Q3 v- /* USER CODE BEGIN PV */8 [" I( o! ]6 U! H' U" s
- uint16_t ADC_ConvertedValue[150];
7 g: V. P- I7 ~7 z- D - uint8_t i;. @% s/ F! }; r' T$ i
- uint32_t ad0,ad1,ad4;/ I+ ^8 O( X& q* X4 P
- /* USER CODE END PV */
3 @1 v9 T0 P7 }" R( H& K2 D$ I4 v8 @ - & S6 H S: o& I+ _0 @7 A/ j
- /* USER CODE BEGIN 0 */) X E( ^( D: _, p, i' @
- void ADC_DMA_Config_Start(void)
. Y" b% i8 k6 s! o2 y9 z& N - {
9 b8 u/ i7 q S4 M0 r - LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对
7 A# l/ x( c& i+ t1 D% o8 q - // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);/ Q+ G0 ^" C* n s+ M
- LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);6 W, S8 `, ~2 }5 X n: s
- LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);, ]% V" H5 v T7 o, o s
- LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
: l, \. w! R3 j6 K' d+ p# Y" J - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);1 R& K, |5 a) m
- 1 |" a6 u- u& v8 U! T9 O; K# {
- LL_ADC_StartCalibration(ADC1);
# O! ~" |* J5 v1 \ - while(LL_ADC_IsCalibrationOnGoing(ADC1));
- J; l' Y8 C: e8 ^+ y3 S4 U - LL_ADC_Enable(ADC1);
! r" G, t0 W. U - LL_ADC_REG_StartConversion(ADC1);; h R3 O/ k. }/ \
- 4 [7 c. Y# G" K5 X
- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);/ T- J! ~) U5 Y5 j: ?1 j3 {
- }
% m$ {7 [5 g. |
5 ~* U( _3 I$ e8 C( f; u8 }: {& F* W
; U1 x# I# x% w/ C+ ^- /* USER CODE END 0 */
6 M/ H9 c5 y, v7 s - - v6 X. n" p6 j
- /* USER CODE BEGIN 2 */# P8 R' o9 d8 \4 a: z6 _; P; u
- printf("STM32CubeMX Test...\r\n");5 r4 m4 Z: o& d& ^. V" @& i. H1 L+ j
- ADC_DMA_Config_Start();
2 p5 M. ^: H% k - /* USER CODE END 2 */ ^# ~& q& C% R: U. p1 B
- /* USER CODE BEGIN 3 */
) [1 c& q9 Z- H/ f4 y5 C8 F - for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){# S& T- k* u4 Q+ L) I% f9 b8 `
- ad0 += ADC_ConvertedValue[i++];
; ` K9 s* c5 T- E2 U - ad1 += ADC_ConvertedValue[i++];
, c" ~- P2 D, p: G* n+ V' t - ad4 += ADC_ConvertedValue[i++];* X4 _/ z6 Q) ~' U) r
- }
$ t* ~) f. G+ Y! b2 W1 ` - ad0 /= 50; // 实现均匀滤波
8 P& G9 u- d' A: u0 y+ q- g - ad1 /= 50; // 实现均匀滤波
! x+ L- N/ Q) d, n4 l" h: [ - ad4 /= 50; // 实现均匀滤波8 @- ]% ?% x5 i! b4 d
- // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);& _3 I8 T# F3 W- j$ E; I* [
- // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);
- j3 x) W7 [+ @- d# K: a, |5 z( W) L$ D - // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);% ]/ w3 ^# B( P' F
- printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);; m% D- H/ F* H, n" O
- }/ H: l4 T( Z1 W. a( {* B% |( W
- /* USER CODE END 3 */
! [7 [% A7 @7 m, \( Y - # ^% T$ C' I) V. `3 @5 w+ @- l
复制代码 / H8 g; S$ }4 v, T) ^" T
|