STM32G031-使用STM32CubeIDE实现DMA处理ADC3 k" y4 |5 e% r3 X! F7 r6 R. a
一、USART配置
! |7 s, }9 z0 V7 ]& e2 a/ V$ |& x; ]8 _# ~! C- ]" V4 _
6 \+ X2 [3 Q% V. R) s
, S9 r& w+ x2 a; _5 V/ E d8 n5 C6 I二、ADC配置
, B5 i- N9 v& O2 D; P6 c5 \2 W# ]
6 N& `) o( u! p0 D' a3 `* I3 r* J7 n% ~0 S' y
& D! D' x* K c- R
) y3 |4 j8 [) [; C. l8 g7 |: v' @/ \( }; t
4 s* n9 F7 }: d2 Z
3 z% i6 q' \; T3 g% C配置完成后,生成代码即可。。。& e2 x( H) b3 e8 s, x. c, E+ L5 C
# I( j, l0 V @/ c/ `% \& \三、用户代码* o4 S6 R- f% f8 t+ E9 R
- /* USER CODE BEGIN Includes */9 h5 F: Z7 S: j5 ^# {
- ! V4 C! |6 `! \
- #include "stdio.h"
' F3 I9 [ R5 r) \. z - /* USER CODE END Includes */
l; o$ @/ B* G9 m
& T* G+ H: U9 p8 d& Q; {; \ ~- d- /* USER CODE BEGIN PD */
8 l5 f! I! `5 y- A O - #ifdef __GNUC__* ]9 R( W6 D" B6 a' i0 n# m
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
$ n; H: m7 u1 Q8 E- x - #else. ^) d+ ~8 ~. s- ~
- #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)
( b- Y$ b+ n; z8 Z* {. ^ - #endif- y# ^7 }- O5 U8 n& ?3 M k! g
- * |( J- W7 O3 _1 l9 s
- PUTCHAR_PROTOTYPE" P/ W1 {, S c( l1 s
- {& J) c7 V. V6 q! i
- LL_USART_TransmitData8(USART2, (uint8_t)ch);
" b4 B8 H. d/ B( S! s - while(!LL_USART_IsActiveFlag_TXE(USART2)){}% w7 Z& W s: M) S
- return ch;
% z% u! c: {* W# Z' v - }* t1 O# z: Q) o6 s$ k
- /* USER CODE END PD */
* u. ^$ G4 x K+ J [ - 2 T% u, U/ h, R4 t
- /* USER CODE BEGIN PV */. o; v! O" `! r. Y! h- o/ t
- uint16_t ADC_ConvertedValue[150];" Z6 C( M) Z3 e6 O9 l
- uint8_t i;
7 I" E+ {6 a' ^# A6 R - uint32_t ad0,ad1,ad4;: P& z1 G) K2 P# Q" J
- /* USER CODE END PV */
; e; [; K, m( D3 l; I
8 @( ~0 P4 ~ ^# Z- /* USER CODE BEGIN 0 */
5 D$ g; \/ r/ q a8 r - void ADC_DMA_Config_Start(void): C/ M: `9 J% |8 q2 f* S
- {0 }3 ^ M7 C' F( A' J
- LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对
/ p% g2 G6 h+ C. h+ } - // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);8 y, L- I7 |, W+ X
- LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);
. b. y; s2 u. U" w! q9 ~3 C, |: U - LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);
( x O8 j* Z" ?- a& ~ - LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));: c( x+ q/ i7 |* o
- LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);8 i( Y6 E: }! d. d
- + i$ x$ w# D" I: ^" O
- LL_ADC_StartCalibration(ADC1);7 a3 C! e/ p, ]3 b, m2 E- @( b
- while(LL_ADC_IsCalibrationOnGoing(ADC1));& Y @% y, z0 C7 _4 q6 Z
- LL_ADC_Enable(ADC1);
+ H, y& [/ d9 u; D" p1 q7 x) |# N - LL_ADC_REG_StartConversion(ADC1);* A7 z% |4 Q" D) |
- # X$ j- l/ C; x5 D( L9 B: o
- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);# Y/ @0 [' N8 D- V0 d
- } U9 R3 _, u* w7 X( |- h: K& ?5 P
- 5 l8 R8 m. f$ F
- ! u. Q; r" t8 @+ v2 M5 r* X) _
- /* USER CODE END 0 */* {, z" P; X4 q* F' Q
- 0 \% i8 ^+ i! i- I. t& B) Z
- /* USER CODE BEGIN 2 */5 n* n5 y: ^# ~6 W. R
- printf("STM32CubeMX Test...\r\n");# n( ?! z4 g7 k4 _
- ADC_DMA_Config_Start();
, q! R, B9 r6 f4 o3 {- O - /* USER CODE END 2 */* U" z! o: e( @( m& l8 [
- /* USER CODE BEGIN 3 */" Q: {5 j4 m5 E$ _$ T0 o
- for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){) A6 h& v5 Q$ P6 n9 w% E
- ad0 += ADC_ConvertedValue[i++];
9 u3 L/ K0 {* F; S8 A; k - ad1 += ADC_ConvertedValue[i++];! u; X: m2 j- X) E- V1 F' k' Y, l
- ad4 += ADC_ConvertedValue[i++];& Q# ^# `# Q5 L; Q+ Y. a
- }1 K& x% t0 t8 V$ x# K! E3 f* w# A5 ^
- ad0 /= 50; // 实现均匀滤波
, e: y, c9 N2 r8 P! w7 F ] - ad1 /= 50; // 实现均匀滤波2 G9 g, ~+ C7 u( Z, c
- ad4 /= 50; // 实现均匀滤波$ ]- b1 V3 b( W
- // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
+ y- F! D* b# c# m- y5 } - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);
& C# _* P* Q& j - // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);
s3 X; J8 |" |3 s( z - printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);
5 }4 }7 N" G8 D! W8 G - }
' S. D; P9 r6 q2 z0 B. X - /* USER CODE END 3 */
3 j2 H8 ~# L k/ K$ P/ L0 f5 Q - + ?& R2 F2 z, F1 L- O1 e
复制代码 + i1 W! l! P) k5 d
|