STM32G031-使用STM32CubeIDE实现DMA处理ADC
) p J: O( e4 s6 n) H, P; R# N一、USART配置5 w& K- Z6 y6 K8 \0 G" g
" {: k- M+ j9 ?' l8 e! V2 Q! P0 s$ A5 E
! \3 N! p5 a j2 `# O二、ADC配置; v# O" |; G/ J! \. W" q
. e5 t+ R+ W# }/ p
. r7 u0 W4 d" O& y/ }/ F/ _% q1 R; Z4 E/ P) ^& f
3 x! r: Q7 O2 H+ k/ q. u5 B2 h' G8 o
- U5 x2 K* @! [$ i6 o7 h& H/ o5 u
/ \9 Q: y% T9 f2 T3 ~! c, d$ q0 @. V) I& V* { t& {9 a
配置完成后,生成代码即可。。。
, r c) T) k2 b6 Q' T
2 `6 ~6 `& K6 J$ X* t, ?三、用户代码3 z9 k/ {$ i5 K! j+ e4 H
- /* USER CODE BEGIN Includes */
' s) t; ^) w- o% k3 ^8 w" z. l - + a' R% Y# `( l) G8 h3 H) t* N
- #include "stdio.h"! }& \. S# _( [: ?
- /* USER CODE END Includes */+ i$ T2 Q( \0 M3 {* ?
- 9 t0 O/ g! k+ g& W6 G! f# Q
- /* USER CODE BEGIN PD */: |6 m5 R, d& K+ C* t& h; O( m
- #ifdef __GNUC__
# Y- N1 @) `' E+ |. x. g4 t( V - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch); g/ ?7 U2 n9 i M3 E4 L, H6 z8 _, d
- #else
2 C7 W, Z6 a: _- [& b" P% U' o \! N8 q - #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)
3 d) r/ p, a! S2 T5 C - #endif r' Q" e# p3 i! Z* f
4 L$ Z2 @+ l7 B5 j- PUTCHAR_PROTOTYPE
~. \ X1 [1 q* O: u - {
" S! `- \% }7 @ - LL_USART_TransmitData8(USART2, (uint8_t)ch);. T2 g5 L9 @& O% S3 L* `
- while(!LL_USART_IsActiveFlag_TXE(USART2)){}
d+ Y$ h( [/ n y0 f/ f - return ch;
, v8 i3 \. w# m8 j! p - }
6 |! y1 z, v: H9 k f! V, S - /* USER CODE END PD */
3 d) [% ^$ u# L9 O
7 w$ j' F/ i0 f- h; P( Q1 J, q" Z- /* USER CODE BEGIN PV */7 O- W: m2 A* s2 P! |" o. p% d% E
- uint16_t ADC_ConvertedValue[150];
% y: R' P$ {# q/ N - uint8_t i;2 @3 `; h6 T, y2 @& D2 i' o2 W
- uint32_t ad0,ad1,ad4;# `" A7 r" S- O9 c+ ]
- /* USER CODE END PV */+ P5 U% x' J- b$ P: i+ a" V
- 8 ]& Z4 J1 h8 d' N" I% @; n
- /* USER CODE BEGIN 0 */7 P, j% ?, z! t" i- i- L- o$ D$ X
- void ADC_DMA_Config_Start(void)0 t- S6 Z) U8 d( E6 C; c
- {
) ^8 A ^: ^3 L$ A - LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对3 D5 w V% R, d, Z5 u) L
- // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
- ~( p* d% g0 V7 J9 e7 W4 w" D - LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150); _7 R- n/ {( O8 B$ F
- LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);* c* _( X. m9 X) o* z
- LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));& `* q7 i# ^ X0 L# f5 [" W% G
- LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);" t) A$ D8 W% `' U1 x% U
5 |1 h- `6 D: v( ?5 O- LL_ADC_StartCalibration(ADC1);) e4 N3 Z9 E8 q5 g4 R$ u
- while(LL_ADC_IsCalibrationOnGoing(ADC1));, a" J& t! d; d) h$ z! Y7 a7 K
- LL_ADC_Enable(ADC1);
% y5 W( O8 U/ H7 S$ p. z) \; A) H - LL_ADC_REG_StartConversion(ADC1);
0 v3 c$ a* |/ V) L, ~ - P9 t- F2 l" t' B% i U* b
- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
" F/ ?$ S" ~8 W( `3 w; `; r - }' _3 b3 ^5 i* n5 ^
- ; N: d' Y* q5 {; E( b- @
/ X- U. J# D& _0 ~- z e! n- /* USER CODE END 0 */- _0 X, v* w/ v- A* P
) h5 g! B" S# Z" q- /* USER CODE BEGIN 2 */
# ]: _2 f h! K% T - printf("STM32CubeMX Test...\r\n");
0 S6 w% B- V5 j: }' N - ADC_DMA_Config_Start();6 Q& ?( J) W; |. r
- /* USER CODE END 2 */
, }9 i; @1 ]9 `; Z - /* USER CODE BEGIN 3 */
$ `+ F5 K0 K; C% X/ S! v - for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){
2 v7 Z( f+ o( m' \) }( i+ [ - ad0 += ADC_ConvertedValue[i++];
9 S: j5 v* }3 X - ad1 += ADC_ConvertedValue[i++];; s+ A7 U7 m$ w; @$ ?( t# e: v
- ad4 += ADC_ConvertedValue[i++];( f+ t4 s5 E$ F, A, Z5 j
- }& Y, a u# r% A3 g
- ad0 /= 50; // 实现均匀滤波2 P5 E! r1 j7 v+ O
- ad1 /= 50; // 实现均匀滤波
9 E2 s+ z5 [) ]9 D& `# e0 j9 Y1 w+ O# x - ad4 /= 50; // 实现均匀滤波
, i- n/ Q+ ^- S5 a0 B2 m - // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
8 N; O, V$ c% g6 n, v; a$ T; H7 s, ?& ] - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);
6 |# Z+ h) I4 b' H7 y7 b2 ] - // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);% e' c' G7 P+ E" M' u2 o
- printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);4 s; S4 Y& O, O' K+ ^8 D B
- }; h* |/ E% L5 Q
- /* USER CODE END 3 */' D' s; \+ o7 x; w) e
5 N) p# F: \+ H
复制代码
' Y+ |" c; E( e1 \/ y4 h |