STM32G031-使用STM32CubeIDE实现DMA处理ADC# q u" q% h& b6 X1 [
一、USART配置# M0 P" C! d: d0 T( G
8 c5 ?. y3 i- s7 ?1 t/ V v- s- Q, L ^4 y
3 E9 Y% S( C* Z S. y9 L0 p3 i
二、ADC配置$ s; R+ w8 B: m: n4 }1 ^
2 y6 z$ P, t" d. ~
) L! F' f6 z4 C% L; C) I
* M6 I% O5 I( ]% w0 i% w2 C$ v/ N: T0 n( M. W) a6 @
8 ^" s, U" c8 j% e
5 f Q5 e6 G! _7 Z9 G/ I1 p- S/ T
. t# ~, g q8 N" Q
配置完成后,生成代码即可。。。
" e$ Y. M: j7 D6 j. D" g; |% D6 _; |! }# U# t, X( _
三、用户代码% Z0 f8 `. J* c0 Y& I$ s# I
- /* USER CODE BEGIN Includes */
' I# |! @7 P# d- I/ e7 g
% l% {( a/ U4 w2 t/ ~ `, I8 W# v- #include "stdio.h"! F2 r+ ^5 F7 ]" k2 _6 a. m0 J5 j0 e
- /* USER CODE END Includes */
& |7 h4 r( s) Z8 V2 A+ Y' C - & m4 J; Q [, J$ x, z8 Y
- /* USER CODE BEGIN PD */
$ l- [% {4 C4 M \ - #ifdef __GNUC__% M1 f" Z9 U8 z' R6 f" Z7 [
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)' W* G! ~, @+ f. I* s
- #else
+ L5 |0 i, S) f - #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)& w* J+ d) n! [% r0 D: D
- #endif
& k3 D% l( P6 V) N# p8 \( h; s - * a0 S2 L$ r0 E5 {% Q) }( s$ _" P- b' r
- PUTCHAR_PROTOTYPE- q8 i r& u8 N* i: M" D! _
- {
9 @ t, }. C. k" ~2 [5 B7 [9 Q5 L& L - LL_USART_TransmitData8(USART2, (uint8_t)ch);
* t5 h# i# w- k; Y: ` - while(!LL_USART_IsActiveFlag_TXE(USART2)){}, t7 ~6 ^$ B% A
- return ch;2 w w; ?9 \; G5 x
- }+ G7 b7 E9 X( A# R2 {9 U( d
- /* USER CODE END PD */* M7 ]( K7 e" ^$ J9 Z" ]
- 1 S, r) L( |: M" B# h7 u
- /* USER CODE BEGIN PV */: F3 u! D- J+ P1 L: b, ^
- uint16_t ADC_ConvertedValue[150];! h n9 ]' S! h! w: w# G
- uint8_t i;
9 Z8 b$ r" O+ h: N - uint32_t ad0,ad1,ad4;" a7 p' n- m+ v5 T" [' {
- /* USER CODE END PV */
' f# o& ~, D& c1 W - 1 T% _. }: [# p3 ^9 @( v: {/ z) C
- /* USER CODE BEGIN 0 */
. z" A/ `( l. w; F2 z- {" p - void ADC_DMA_Config_Start(void)
( m8 ?4 r8 i" z$ a- `' C+ v - {
f+ o$ y$ }' \6 O/ P+ _& w - LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对
5 H) U, P, Z1 I7 J, C% v - // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);! ~5 r- V2 Q' Q, r+ f
- LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);
8 W1 l" Y8 y' Z5 _2 @6 t$ |* @ - LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);
$ N- Z' |+ @% z' a" w! z - LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
* p) I1 E$ s: g1 X7 i - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);* ^! z0 i4 N% X4 f
3 v% L. |* Y; s! i- LL_ADC_StartCalibration(ADC1);
: |+ i2 k, r) Z, [/ C - while(LL_ADC_IsCalibrationOnGoing(ADC1));5 a3 F5 n. h$ |9 U& m
- LL_ADC_Enable(ADC1);
V; G% C k" p# w+ {# d# p+ G# X5 i2 a - LL_ADC_REG_StartConversion(ADC1);
5 I; T; k5 J, \: h
/ A6 H* j4 V( E( ~+ W: y& E2 v- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);: j% t- [ S# i: a, q F
- }. o7 g" F s! \" p) b# ~2 _& s! j
' `/ Z& M* }1 y$ |- [1 S+ Y- 0 O5 p7 n$ k" N
- /* USER CODE END 0 */- a! \% ]& N2 V) }) v- A1 H
- 9 J* r' `+ }9 u: I* s4 E. E k
- /* USER CODE BEGIN 2 */: n- Y, z8 f% x8 y
- printf("STM32CubeMX Test...\r\n");
( G6 k& o* b- W, K* O - ADC_DMA_Config_Start();
- D) h4 @ B" B5 a$ ?" N - /* USER CODE END 2 */2 d z% a* D2 n2 O* P1 I
- /* USER CODE BEGIN 3 */1 b5 |/ X2 k3 t( \7 {
- for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){
2 F/ D0 J6 v! G - ad0 += ADC_ConvertedValue[i++];
2 F: W: \+ `) A - ad1 += ADC_ConvertedValue[i++];
p6 h) T7 U/ g# z& I+ ^ - ad4 += ADC_ConvertedValue[i++];
2 C7 |1 u: `2 H - }8 e6 Y. f: n$ A' Z( s
- ad0 /= 50; // 实现均匀滤波
" m. V% J( j) R- G5 p, L2 s4 y - ad1 /= 50; // 实现均匀滤波: \: a n5 j* }1 e0 @& r
- ad4 /= 50; // 实现均匀滤波
3 q$ T, B- G |' K" D - // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
$ _1 C: J, @- T T. }( F - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);+ b8 `- G% ~0 f) v! _1 F0 r
- // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);
}& Z$ ]9 f3 D$ A- n: e - printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);
- z/ G4 t# Z6 H8 F! n/ Q! k7 ], L - }) i' F# _9 k. h( b/ T' Z7 x
- /* USER CODE END 3 */5 g5 q6 a: F0 \4 e
3 n3 @1 n% @: f2 l: V! g; ?/ F
复制代码
( Q$ I' H) U) j0 `" Y! c; } |