STM32G031-使用STM32CubeIDE实现DMA处理ADC9 B7 R$ c9 F4 `% ^1 z" I
一、USART配置
& l* F3 U. ?! f* l3 H4 |# J. }2 Q
6 X' H$ X6 ^. ?0 d5 d
! g3 Q3 G% g% P6 R( J0 @二、ADC配置
. i) Y& X( a& O5 f' A: n
! U6 `9 Y( N' D5 O0 O' T) `4 U: S( e4 }* J9 ]' F. T
" E7 X; ]/ n) Q v0 t+ b
^' v& z( O t! _/ @
" e, o8 H$ ]8 B; C7 u: I
7 Z+ f% G0 L. a9 h) H3 m$ o: B _2 S& q% L6 `/ L4 w6 \9 {- a2 c
配置完成后,生成代码即可。。。
; A% A7 U$ z+ V* Z7 \$ ]) |( t$ A
$ O0 l ^* h" T$ O$ o三、用户代码
" n7 G# e g; {# I+ ]- /* USER CODE BEGIN Includes */; O8 a7 W6 l& ?+ h( C8 \
: s; {; k1 q4 o0 |; _- #include "stdio.h"
; k/ z4 T7 t6 g" Z% x7 h# | - /* USER CODE END Includes */4 d8 M, R" B# \4 S" S
- 1 G" x x& P5 y* }
- /* USER CODE BEGIN PD */- Q; U* z# c4 E5 L; L4 p9 Q
- #ifdef __GNUC__
+ x: G$ v; ?. t8 r: A# e4 c" @; q - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)2 `3 a: B1 k. u) n, N! u5 E B
- #else
; b; V V# a/ `# \ - #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)
3 b( Q: ^/ q3 a! H, t' N! W8 a - #endif! F3 @; m3 o, ^$ ~) m' U' ]& p
- - r7 J4 j& _( h, R6 t% y. P
- PUTCHAR_PROTOTYPE
( N4 X* w7 C8 o1 N; K) J2 {. i - {/ F; g3 I9 e* r
- LL_USART_TransmitData8(USART2, (uint8_t)ch);* U, U/ a+ e3 b3 `: C2 {
- while(!LL_USART_IsActiveFlag_TXE(USART2)){}" A) w6 E8 v8 b4 L+ E- x$ j
- return ch;
# N/ x1 e( z( `. B( M! l: z0 B - }3 [- l( ]. j) r7 i u$ [2 |+ ?
- /* USER CODE END PD */
$ F" h$ a$ N2 W6 ^: _8 e2 {! L. K% H3 ]
5 k! D' F; q( m7 o# H8 e: R- /* USER CODE BEGIN PV */9 q% ?8 k, f- t
- uint16_t ADC_ConvertedValue[150]; Q' D0 m/ i- {/ _: v
- uint8_t i;* ~) C9 _/ ]; y1 E4 R& {7 |
- uint32_t ad0,ad1,ad4;
; g9 S% l# H( r) L* z5 W9 X/ j - /* USER CODE END PV */
; N5 |! F- [4 O* C2 o8 ^ - ! W5 b9 f: J; k2 J1 J
- /* USER CODE BEGIN 0 */
6 g6 f5 c) ?6 L \ - void ADC_DMA_Config_Start(void)# @/ U) B4 R4 a0 R+ e7 m
- {3 O: D; g" L0 r+ T/ a" j# U: Q9 K
- LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对
0 u4 b E u! ^0 C/ w- q& W - // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);8 {) S# v) h% C: D& g* b
- LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);
2 @% i% P% J c0 a - LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);9 K3 z$ ~7 y$ m/ f% x7 G
- LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
: w0 H$ c9 e0 [1 F7 H - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1); u5 C% H- e) E, B4 @
8 s* t, @2 Z, y- G/ \( j, L- LL_ADC_StartCalibration(ADC1);
4 A9 }( }. Y/ y2 v6 W - while(LL_ADC_IsCalibrationOnGoing(ADC1));
3 }1 N! z& ]: {) v# ~8 I - LL_ADC_Enable(ADC1);. w$ }2 y: X& l7 r0 s( B: k
- LL_ADC_REG_StartConversion(ADC1);7 m$ e, x5 A& U! X
- 9 s% L! u) w' a' t5 H1 G8 W. E
- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
# Z# q3 C! t- w. ?4 d8 L7 R* N - }2 N; u/ O$ H7 z4 O/ x' m* W+ P' H
+ h0 e8 K F3 X- g- ! W1 N/ ?' I* q2 a9 {
- /* USER CODE END 0 */
, `- h$ j2 b) J8 ^ l - 6 D- N) g+ Y% d
- /* USER CODE BEGIN 2 */
8 m! g- @1 [! X$ A! }5 O. X; o$ U% e - printf("STM32CubeMX Test...\r\n");
( |! F% o. S4 a$ p - ADC_DMA_Config_Start();& b; Y" Z! a; m2 e# b
- /* USER CODE END 2 */: J- g+ j! n' x1 H3 H
- /* USER CODE BEGIN 3 */1 F% f( x3 m( t% P8 P
- for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){
% d$ R T+ C- c2 f - ad0 += ADC_ConvertedValue[i++];1 z5 |9 ~0 M" z _+ B( l$ D/ v
- ad1 += ADC_ConvertedValue[i++];* Y. m8 t$ a) @7 o5 C! P& c9 ~, p
- ad4 += ADC_ConvertedValue[i++];
0 f' f T8 X: C% @/ }3 P - }# j2 h; G2 T" y3 x) l
- ad0 /= 50; // 实现均匀滤波. u4 ~4 [+ W0 d& Q4 D1 U
- ad1 /= 50; // 实现均匀滤波
5 N0 x/ f# s) w q# B7 T8 P* f8 S- I: Q - ad4 /= 50; // 实现均匀滤波
2 H) F9 O& S& C2 [1 A V - // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
4 t+ |8 Z, ]+ R) _- v# W6 ` - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);
- Q/ `$ N8 z. y' y' V1 b$ @4 S7 c - // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);
Q5 ~* w$ I6 F* D4 N( a - printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);
/ B5 { o+ p& {, e D - }1 ^( j; n* y( m. X3 Y* c" j& D# F
- /* USER CODE END 3 */( O' y' v6 l8 Y5 ~
- % A# D n% G7 ? U6 F, {* B
复制代码
% h( b7 G2 M8 c |