STM32G031-使用STM32CubeIDE实现DMA处理ADC( ^) K; O/ A, O: u' D+ Q. n
一、USART配置. U. K2 C0 Y/ s9 {
# k: {4 b0 M2 L1 j* n
" x( g7 S( a7 d% l! G
. B0 | D4 K6 F! r. ]4 J8 _二、ADC配置1 z% e- O+ e1 a, a
: f" g; j R6 i) w9 a, G3 K
9 I4 C9 H. d0 p9 |; K
' q8 ~! s* b/ O8 U+ X
* ]$ @* H% d7 p# h! r
4 ?! y# O$ e' c. B3 P0 H$ q2 R0 u" }& m8 f' T( j9 C
. a* X, U; O* t: ^' z+ l0 U配置完成后,生成代码即可。。。
( d) L* J3 Y. M5 m7 v/ y9 y: `6 C2 A$ L1 {* z: u
三、用户代码! D* K7 J/ o& |) `
- /* USER CODE BEGIN Includes */' P! q+ V6 M( a% w( M$ Y
- ) I( ^ H. w" Y2 H
- #include "stdio.h"
1 X) f% G2 M6 ^- d. K - /* USER CODE END Includes */+ K F6 v6 g7 m+ z2 a) c! M
- 5 q* S# m; e5 [" K
- /* USER CODE BEGIN PD */
+ W; A$ q4 C" }( n - #ifdef __GNUC__7 Z0 l! T4 p( k# T4 _/ k- D" E
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
F5 ^, Y& F- h - #else% m, }* i: `1 @8 L7 v# r+ h2 Q* K
- #define PUTCHAR_PROTOTYPE int fputc(int ch,FILE F), h0 G, M* N$ D! X) l) ~7 B" S
- #endif
$ d+ ]1 O" i0 U6 n
2 c% @0 l# S: {/ }5 A- PUTCHAR_PROTOTYPE- b/ W* N. N9 o! N) G
- {' M Y) v: O; N3 {5 F U
- LL_USART_TransmitData8(USART2, (uint8_t)ch);
1 S+ r' K2 l8 v. _* k6 | - while(!LL_USART_IsActiveFlag_TXE(USART2)){}5 N- b9 c+ ?5 n* L. T
- return ch;
: v+ T6 J! _4 [ - }
5 g! M* N4 k7 U# A5 G - /* USER CODE END PD */% r8 B( H# f3 c2 A# U
- * s; N6 N. Y9 W
- /* USER CODE BEGIN PV */" @0 M( E! O/ ~; m4 Q
- uint16_t ADC_ConvertedValue[150];* @/ ^- U/ l' H" V$ Q! O6 m8 c6 c; a
- uint8_t i;
4 m! q: ~! P6 k2 {: O) c - uint32_t ad0,ad1,ad4;# o3 y% A( Y# u# p3 p% U
- /* USER CODE END PV */
' \3 X! D/ _: O4 W - ) {0 P0 D# |1 [/ \7 c3 r/ c$ S
- /* USER CODE BEGIN 0 */
1 O, U* D$ }1 T" _6 P9 M, V* x; @$ J - void ADC_DMA_Config_Start(void)
4 A2 W/ i$ l) z7 K' G" d - {, B$ x! L& @ L' v9 a) Q
- LL_mDelay(2); //延时2ms,避免DMA读取数据通道不对# Q3 Y9 Z9 f9 @' r+ j; C
- // LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);
/ z8 Q" n$ a7 ?+ g5 R$ B3 D& m - LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, 150);1 E3 y5 [! ?! I" b
- LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);# o% P* g7 \" V' C! A3 q! H
- LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
8 t! N4 C1 L) w1 _7 A2 `/ p! m - LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);; b" _. ^( g0 S' _1 t
- 8 t+ }2 _+ I) n0 `
- LL_ADC_StartCalibration(ADC1);0 @7 {7 e [/ J5 z) O* S% t9 ^
- while(LL_ADC_IsCalibrationOnGoing(ADC1));# h- x) n( L" {: B" {% U
- LL_ADC_Enable(ADC1);" L0 p# D4 x7 G) `. G; L
- LL_ADC_REG_StartConversion(ADC1);/ i( D3 x4 O! T- W) y
9 S5 B" K. x' @- p- LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_UNLIMITED);
D/ }. E' R5 I- I- B - }) F3 `. f6 E# V2 E: {
- 9 v# o& j3 G& B, s& C
- % @6 W0 p# B1 }2 c) o, Y: l3 j Y9 C1 C
- /* USER CODE END 0 */
; J: t2 c" o9 O" k( X( j4 p/ I - # b* }8 w! H4 _* v
- /* USER CODE BEGIN 2 */
3 A5 m# [- o' G& b% x, i - printf("STM32CubeMX Test...\r\n");" j9 T9 X- j$ u- B; t% k" U
- ADC_DMA_Config_Start();" `" w7 v: ^+ R/ g: l
- /* USER CODE END 2 */* H& C8 f2 Q* t( N9 u) X9 d2 A
- /* USER CODE BEGIN 3 */
3 G/ C% X1 z: l/ p& X0 o. Z8 z& b/ } - for(i = 0,ad0 = 0,ad1 = 0,ad4 = 0; i < 150;){
+ Q3 y. n+ v+ ?% c6 t# p7 F - ad0 += ADC_ConvertedValue[i++];! t1 J9 ~: w5 {/ q
- ad1 += ADC_ConvertedValue[i++];- y7 W4 [ F% B
- ad4 += ADC_ConvertedValue[i++];# ^$ L0 C% T% N" {$ {
- }) z8 o$ ?) R! U4 }' e m
- ad0 /= 50; // 实现均匀滤波& {4 C0 m; @0 k- O5 r0 T( \3 w
- ad1 /= 50; // 实现均匀滤波 Z! X$ ]( W3 [) p
- ad4 /= 50; // 实现均匀滤波, k/ V& g! @( S' l' C! B3 `* Y& s
- // printf("ADC->CH1 Value:%lf\r\n",(float)ad0*3.3/4095);
4 z: i3 `5 s8 t9 [- A# J: q0 e - // printf("ADC->CH2 Value:%lf\r\n",(float)ad1*3.3/4095);
; s( k' i7 G3 q. F - // printf("ADC->CH4 Value:%lf\r\n",(float)ad4*3.3/4095);
8 M: k- S! b8 k9 X* S) w1 P - printf("ADC Value:%lf,%lf,%lf\r\n",(float)ad0*3.3/4095,(float)ad1*3.3/4095,(float)ad4*3.3/4095);
# t1 v4 }. f1 ] - }3 E2 ^& M& h1 b0 x4 L$ }& V- u' p
- /* USER CODE END 3 */* Y8 v6 v4 ^8 e$ i
1 Q) H5 h/ f' U$ d1 t
复制代码 / s! E4 f. w% S7 V; r! z; G9 T5 ]0 B
|