STM32G031-使用STM32CubeIDE实现DMA处理ADC. z0 U! N& o/ N X6 C
一、USART配置
5 f; J2 z# E' r0 w6 ]. h
: k W0 F( t: O% `8 c6 t3 K. a
* P% i: z+ E; X& W3 k+ p3 x3 G1 u" Z/ x' i7 B9 f8 I. m
二、ADC配置
. E, X: g i+ k0 T: l7 l b" {8 G0 i3 N' Z5 ~0 d, T
3 ]% V/ e1 A5 ^. g
. l/ ^; D$ X5 H" F0 Q( b6 [( v4 G$ D. d
! O5 \* v& r, R4 ^" D0 L4 e
/ o/ _( h; o" L+ y' ]" e; v; B: H
6 U1 a- F( c9 ~) {! a5 \配置完成后,生成代码即可。。。
4 W( b$ x/ u4 R1 l! V
$ X h6 k/ L1 R0 d" N, C; A三、用户代码, F% F) C2 @- ^7 O# K! I& W
- /* USER CODE BEGIN Includes */
2 o3 A3 } `# v8 a' b) i - 6 s" d2 P: z; w
- #include "stdio.h"4 D2 B, L# M: U
- /* USER CODE END Includes */
+ |# z4 @. z; ~ - ; u) S( R0 t& K; B. D5 e9 L
- /* USER CODE BEGIN PD */
2 Y( `$ A- q* ]8 E% K3 m" d7 C - #ifdef __GNUC__
7 D. f* I: q' W* s3 t8 r3 v - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)4 F: v% F3 o. N0 x
- #else
) C; _/ l ~1 W- d, t* i- C - #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F)$ o: B0 o3 W$ ] |- ?2 w
- #endif/ a: x4 B: l1 w5 k& O h8 D
h# m2 A( {6 M! b2 F5 `- PUTCHAR_PROTOTYPE8 j1 C0 J1 f( d5 H, Z! F
- {4 m& I) j6 F8 q6 r3 E
- LL_USART_TransmitData8(USART2, (uint8_t)ch);2 m$ i" i' O$ t, P, g; o' q
- while(!LL_USART_IsActiveFlag_TXE(USART2)){}! z2 g# y# Y+ d/ X* R8 |6 u) ~
- return ch;
* E& n3 |* r: O - }4 l/ J5 x, x$ b8 L
- /* USER CODE END PD */! x5 Q3 y7 ^6 }
$ V" ^" H! p: N* j: ^ h- /* USER CODE BEGIN PV */; @7 ]# O! {8 p: ?* U; @
- uint16_t ADC_ConvertedValue[150];
; |$ j6 r h0 q4 m - uint8_t i;4 } D4 D' g! e/ _' H
- uint32_t ad0,ad1,ad4;! a. _5 O- y& e3 m
- /* USER CODE END PV */
( l$ f) R% N, F+ p( U1 E0 R; G - , ]# ^7 o! F3 a, m; Q5 c( n
- /* USER CODE BEGIN 0 */
( ]/ u$ d0 z! G; E: E/ o( d7 E - void ADC_DMA_Config_Start(void)7 u5 E( I7 b; o* }, c; ]5 ^
- {! I$ v/ @+ Y& n3 f! n: B& n6 r% e7 P9 x
- LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对
3 M# r, ^0 O6 \5 Y# x - // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
- ^% Y* F# t* E7 E! W4 Y- V4 i% w9 @ - LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);% Z8 I% ]. B0 Y5 ] F
- LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);
3 m: ]% t) J B) M - LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
( U9 q% h# G" s O$ A0 h& Z& V/ P/ [ - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
6 R" d2 Q- H% S- |6 W2 f" O/ v
! A1 C$ V' u+ I0 `) \- LL_ADC_StartCalibration(ADC1);
! Q/ a% M4 y" }) W7 h8 A - while(LL_ADC_IsCalibrationOnGoing(ADC1));% R: O- C/ j( l. M; I2 o7 M
- LL_ADC_Enable(ADC1);
9 T7 Y5 ^' V! H$ ~7 v9 o - LL_ADC_REG_StartConversion(ADC1);9 }9 J: D$ t. v! e2 @3 j
8 E5 t( C6 @1 h$ A o9 k/ g- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
}5 [; Z _' {- ]3 }* U - }, N0 C9 J+ R/ h
- |9 M+ T3 T/ O ^7 d K
; d/ }9 J4 v- {, [3 G3 @8 _- /* USER CODE END 0 */
$ o8 h2 s( q3 K0 o+ b' D - 6 n ?* ^( }1 P; J4 y2 n* Q
- /* USER CODE BEGIN 2 */
! I! m8 i4 k8 k0 D' N! i - printf("STM32CubeMX Test...\r\n");
9 @+ H& E: T' P9 v+ E - ADC_DMA_Config_Start();8 e& Y0 u" q! ]4 |1 g: _
- /* USER CODE END 2 */
5 N1 ?6 Y2 Y5 z" s0 D - /* USER CODE BEGIN 3 */( Q" m p. l' e2 _
- for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){! _+ G5 R: G( S; b- \% J2 T
- ad0 += ADC_ConvertedValue[i++];
/ E4 _. B; f# X3 |* C5 x/ L - ad1 += ADC_ConvertedValue[i++];! S( u m( ?) ]; V
- ad4 += ADC_ConvertedValue[i++];; n9 _/ C6 U5 n
- }- ^) K J) A! ? B j
- ad0 /= 50; // 实现均匀滤波
! o) K+ B2 F! q) `1 P8 x - ad1 /= 50; // 实现均匀滤波
+ r) i3 m; \. X8 a - ad4 /= 50; // 实现均匀滤波
) x8 m$ \$ g2 c9 q- y# o: o$ _ - // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
, R0 Y9 |$ E, _$ Z! B" T - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);! A: z7 O- D9 N: D4 I. D& T- K6 D
- // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);
# W4 o9 N; g8 ^ ` - printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);5 G8 H" o" ?8 v
- }
! |$ a+ w& t3 e( } v: l) `* | - /* USER CODE END 3 */) l% Q$ g& x( p4 E* l
- : P0 H! L' c# i1 J, M
复制代码 4 _7 O* q" n2 O$ w- X
|