STM32G031-使用STM32CubeIDE实现DMA处理ADC
3 C- |2 k9 D( B1 s$ e一、USART配置5 M2 I1 N# H1 Q2 |$ Y
" `. z v; N l0 A. G- q0 f' t! L* n n
7 l: J4 C4 S" K" b+ \( B二、ADC配置
* Z$ K w& Z. A) f: D1 D; O3 l% \- z& ?
f+ [3 |& ?" ?4 Y7 \* E+ p
+ {+ Z: ?2 x0 J
. d5 K+ B( u* Y/ W# C7 c# z% @: X6 \% o6 x5 {
6 c# {% C+ Z8 o* _+ K7 o
1 U# l# K1 Q a( B! @配置完成后,生成代码即可。。。
/ v' y0 }7 E0 u# I) c: d7 v* ?$ ]! V3 Q# T
三、用户代码
4 N5 {5 n8 l* R4 [, g. t$ v% g+ \- /* USER CODE BEGIN Includes */
% B3 l9 R* P6 u( Q& G
5 F8 ~" E" `! R4 \3 `4 ?1 U- #include "stdio.h"
7 D# m f- N7 E( u - /* USER CODE END Includes */! V6 t6 u7 T1 U5 @- |0 K6 v
3 X+ y$ J' u/ F0 y( H, R( p3 U- Q- /* USER CODE BEGIN PD */! C$ m* y1 h8 j( y
- #ifdef __GNUC__8 j$ j9 g0 G5 {. }( J" P
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch). Q" z& ]: S: t9 ^5 G3 D# o
- #else' c0 X4 H( M a' p V3 q. i% V
- #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)
* D' s8 F& @3 R3 u4 O* K - #endif8 B; O/ V0 z" i
2 u& \# ~( ~3 Z5 _) k5 w3 v- PUTCHAR_PROTOTYPE, f+ b- N; A6 s4 r' c; F
- {
/ o6 W6 W8 f+ Q' V - LL_USART_TransmitData8(USART2, (uint8_t)ch);5 D# y$ Q" i/ A
- while(!LL_USART_IsActiveFlag_TXE(USART2)){}! l: v9 f, \7 V* J! W! C1 z
- return ch;
) {! [( a& X* r/ S4 E4 m k2 J - }, G8 _ j% b' ^; H
- /* USER CODE END PD */
5 V! ?: v% |1 i( P: I# o* S" f7 {& R
/ ~1 {+ L, f, C4 x- /* USER CODE BEGIN PV */2 G( o1 {' o" Q: J
- uint16_t ADC_ConvertedValue[150];
[; P2 T+ k& y+ {! b T - uint8_t i;( B8 q+ L8 o, ~3 H3 M- M" a2 o
- uint32_t ad0,ad1,ad4;0 m# {& T' ^0 N3 i8 q
- /* USER CODE END PV */
7 k& W, c( h' q' c3 j: u
1 F+ X$ s; {# t! U$ L2 Y' r- /* USER CODE BEGIN 0 */
! j; [. ]2 H4 a - void ADC_DMA_Config_Start(void)0 T6 U* g/ c# a O, \
- {
: c& z7 E8 E0 T G0 z/ K% U5 S9 ? - LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对4 S* w6 S! Q- ]4 l q& v6 l$ t
- // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
( l4 L; X. V) U - LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);$ j4 ~1 y+ O3 n+ w& P
- LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);% r* g4 X J* |2 g$ f( g4 T8 _
- LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
' k" T P, |/ n# S: d: w4 Q - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);/ ?; ]& C$ G9 |9 f! L2 I
- 0 s% O5 l* K0 P- E
- LL_ADC_StartCalibration(ADC1);
; I/ I9 t2 {4 h3 T, @2 u - while(LL_ADC_IsCalibrationOnGoing(ADC1));
8 ^6 x' S5 O8 f: [% L - LL_ADC_Enable(ADC1);
6 F: w/ k' v3 B2 h - LL_ADC_REG_StartConversion(ADC1);
( W9 n- t4 _& b2 ^* R4 c+ m: ^ - 2 E! w2 W3 h- }$ p; g. }4 t0 t s
- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);+ o+ C) D7 k8 n5 {
- }
$ Z' n5 V# l* |9 j - & d* S6 S+ E$ Z/ t6 s& y
- 7 a% a2 q7 ^! B K3 M, }9 E+ A! Y
- /* USER CODE END 0 */2 ?& c! ]- m9 z1 Z7 _, I0 @+ b: e+ J+ c4 Y
4 I [% p# m; |/ M9 f- /* USER CODE BEGIN 2 */3 y+ M1 i. C% H" ?* q3 {" \# _& d
- printf("STM32CubeMX Test...\r\n");
" R8 N4 j% X0 z# }7 [9 C - ADC_DMA_Config_Start();
8 G# }! d x2 s. x& O. ~0 w - /* USER CODE END 2 */4 q+ b4 ?9 r: S0 c' q( r
- /* USER CODE BEGIN 3 */9 m5 O9 W: m' D8 }8 M2 b
- for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){
! ?: B" c" Q; U+ D5 y; F+ ^6 E - ad0 += ADC_ConvertedValue[i++];
, J4 w4 }( A- s- c' A2 Z - ad1 += ADC_ConvertedValue[i++];( w* l2 R) e* o C: ~% Q
- ad4 += ADC_ConvertedValue[i++];
5 ]& |9 i, }( Q+ f# t - }; |! \8 M* ~* i8 E2 W- e; e; L1 E
- ad0 /= 50; // 实现均匀滤波
: A7 o; h6 H# n3 x' D - ad1 /= 50; // 实现均匀滤波
8 R' \; L- P( X - ad4 /= 50; // 实现均匀滤波9 v, S1 B* m8 R# g
- // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
3 P# v: Y: }7 Y7 \6 E, X( i+ r ^ - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);' Q \: @0 T V
- // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095); x1 h0 L- d: m7 u- g" l
- printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);( V- o: H8 v. r0 a% O2 u
- }
9 {2 V0 y3 ?& w9 X - /* USER CODE END 3 */# j) @# Q9 E% R6 }4 ~* v$ S+ m2 M
6 s) \' b4 F' V' c e! K+ b1 d
复制代码 # P" i" j/ C/ r& G+ q
|