1. 使用 CubeMx 创建 ADC 工程. i4 t+ N- D, {
打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject." O! l3 a% a4 V! f4 q
. P* I, h5 \" v# ?4 Y. i& u先配置一下串口,用来打印相关信息4 r r2 h9 P- r% x2 i) S4 \* W
- e: ?# U# v' M `
+ P' R* K- t4 f1 P2 ]: w1 B6 J, y( j6 r7 {9 n- G B7 {
再来配置 ADC
3 |3 E7 u% E" C: H: X& z6 W9 O( b+ q/ n: y
- _1 P) {. u6 ]4 Y i/ x) E y {' u2 T9 S
, O; W2 R& e0 b) w5 ?0 W
1 C1 ~1 i0 W) F& K3 k配置DMA/ s B$ r5 Q6 T! n
- \* S* o' B1 ?0 W
* F N- B/ D6 _4 Z" m1 F. NPS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数.$ S& z6 T# `7 O$ f+ [( y
2 H6 P( Y+ o9 X3 H配置时钟& u% g0 T: J, Z- W+ I3 |( j
$ B; H/ w, p$ m: }' n
, i" O- L6 g, I( _: U
) J) }7 a6 M) _% p, p/ b2 `1 i- d
ps:本实验使用内部高速时钟,未使用外部晶振,主频设置为最大的64MHZ.
, g8 d: R4 N- U6 X6 i" \3 F3 I$ A4 u x) }
配置工程相关选项8 N, v; d. C& k' D( b) f
5 u% F& c4 ~+ x" D2 r
! t; s$ |: _0 m J. H* U9 J, ^) u l. @% }
配置完成后点击右上角 GENERATE CODE完成工程的创建7 D/ Y1 L% s" a7 ~2 Z; J
3 y) A- V0 L6 J4 P( p2 i& e; m2. 编程7 Z; v$ ^& ^) y- B5 O5 Q+ U. V
2.1 串口相关的代码
6 ?; {/ A* p e' W- m因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
5 N: e' h7 Q" C- /* Includes ------------------------------------------------------------------*/) t' y* p& K; i* ~1 l- Q
- #include "main.h") T1 i! N0 J u, L# B$ T
- & q% {, z: p1 t
- /* Private includes ----------------------------------------------------------*/
9 }. F6 |" n- r; h. C9 t, a( i6 W" V - /* USER CODE BEGIN Includes */
. L% o: l5 P8 H& A' _ - #include "stdio.h"
* \) B0 C1 N& h- Y1 w, O - /* USER CODE END Includes */+ |* ~3 Q1 J! u% C" z* J. e( Z, {
- - o- e0 ?2 x: j# q6 z* T& Q
- /* Private typedef -----------------------------------------------------------*// t: T7 w7 A1 I# q+ n
- /* USER CODE BEGIN PTD */: O6 o( C3 Q* q6 c; {
& A+ j* q- z% G* T$ G' M4 u- /* USER CODE END PTD */
3 G5 f% D" w; z L' ?0 ?; J - ; Q. s& k8 S! K. S9 t
- /* Private define ------------------------------------------------------------*/7 E' Y. N2 S6 T+ R9 k
- /* USER CODE BEGIN PD */; G; l- @. h! A* u
- /* USER CODE END PD */7 q8 i1 e9 Q! b
6 m, g, I* y9 b J- /* Private macro -------------------------------------------------------------*/( c+ d1 o( C" o, q4 U: L0 q
- /* USER CODE BEGIN PM */
1 @3 S+ e! K7 S% c- ~3 b* \ _
+ K1 P- d9 {! _8 L- /* USER CODE END PM */
) c" F O% w( `; X! U A - ' W5 G0 [5 u- L. z" x+ {* b
- /* Private variables ---------------------------------------------------------*/
2 _) K' j0 I' R - ADC_HandleTypeDef hadc1;' E, U4 U; v: S3 @' Z6 k) F3 K
- DMA_HandleTypeDef hdma_adc1;
- }5 Z7 _; i7 K1 R; K% z, H - 0 f& e) m" S' ?* i
- UART_HandleTypeDef huart1;2 z. E* G9 z" |6 k* h D
) Q7 h, ~+ [9 c& Q- /* USER CODE BEGIN PV */( I- O- _6 [: J
+ r# y1 {9 U& Y4 y: M( o- /* USER CODE END PV */
( D: ?9 \/ M4 ? - 1 G; w$ t) ^3 J/ `: q: f' m
- /* Private function prototypes -----------------------------------------------*/! c: C& N J4 e- J& c
- void SystemClock_Config(void);
( v) a5 _5 H @ - static void MX_GPIO_Init(void);/ B. k6 Q$ Q4 f$ `
- static void MX_DMA_Init(void); K! i% y. w- ]! Y/ A* q1 T5 R* \
- static void MX_ADC1_Init(void);+ l$ ]7 Z9 t' `0 m; _# H
- static void MX_USART1_UART_Init(void);
$ ^* e: \6 G) s; I, I - /* USER CODE BEGIN PFP */
; _5 F5 H/ \+ N0 @2 I( ^* x$ y/ N
1 k% ~2 V% p( }, R- /* USER CODE END PFP */* ~! i9 m4 r z8 w- |
6 N" W- ^2 K9 j3 N& n3 r- /* Private user code ---------------------------------------------------------*/
5 Z: N }! a$ L/ _# ?9 Q* D. f; I - /* USER CODE BEGIN 0 */2 t; S' W5 B' u9 b: ~
- __IO uint16_t adcCovValueBuff[30][2] = {0}; //存放ADC的值 2通道 每个通道存放30个值,由DMA循环写入) @8 ^0 ^ V( n
- uint16_t adcAverageBuff[2] = {0}; //对每个通道30个ADC值取平均值
$ Z% C) }. B" n# ~ f# k. S' U# [
& Y/ k6 v9 W9 |' m6 M- H
. s! N1 p+ q/ N. I8 [- #ifdef __GNUC_
/ m8 n6 s) S" H8 T! z. A - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
; [6 b) h O6 j! [ - #else8 n+ F8 J) P" R g1 ~/ r6 m! M h
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)6 l3 ?+ C) k4 y0 n$ }4 ]+ A
- #endif
1 Q g+ z( c- g) b" Q+ e. p - PUTCHAR_PROTOTYPE. p; ~4 {( w9 l
- {. w4 t, m' f: ?! X$ X- C
- HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);% r2 g0 ?- \ O+ r% {7 l
- 8 b7 t) I* c3 v
- return ch;
* T* j% c8 V8 y s& T {5 }& E - }* m$ `5 T! |; f' F
1 ^, G) N! |9 \! a- /* USER CODE END 0 */
复制代码 7 J$ _1 S- h0 j4 n
i( o1 @9 O1 e5 M+ K! h( W2.2 main 函数
% q) x) I, d k* I6 a7 S0 U( h: n- /**
$ M- Y5 k; y0 F% L7 l& {( H - * @brief The application entry point.
9 N$ r5 E" S- w+ u - * @retval int3 o: t) b0 \) d
- */
) R( o+ M( N; T0 x! q ^$ y - int main(void)3 j8 {' k2 D+ g0 M) g) w# d
- {( R% I, v/ T0 T6 c7 L: o
- /* USER CODE BEGIN 1 */
1 {& J. R" @" N5 W* m+ o% c) b - float votage = 0;
! r8 M* d% b8 ?" F; G! c9 B) |5 I' H# X - uint32_t sum = 0;
& p1 R1 Q% m' c7 }( x7 G" K - /* USER CODE END 1 */
0 s% C( z( L& [2 ? - 7 z( X7 S3 ^% R1 M+ z0 R, R
- /* MCU Configuration--------------------------------------------------------*/
( C$ N$ R' g' p' ~
; r+ D% _3 A* p8 D- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
6 c2 Z. h# D7 I/ j* ~2 y# N - HAL_Init();/ u8 _5 J$ p2 L* a
- , l( X' w2 v* C* |; O+ O$ s
- /* USER CODE BEGIN Init */" d) F3 D8 r5 C5 O/ h; D
6 H; N% w" m* D# v" Q- /* USER CODE END Init */
4 p- S" a9 T, r0 `$ I - 0 |, C0 o# a$ C3 i U
- /* Configure the system clock */8 @% i$ T" A; V6 s0 D$ g
- SystemClock_Config();
5 O; f8 j8 ]- K7 r
8 x" R }/ A/ _. L/ E- /* USER CODE BEGIN SysInit */, L8 z; h) |( V% F4 N% D$ U
- a/ B' z6 Y3 j) ?
- /* USER CODE END SysInit */' G, e( b$ J5 v
- 2 r& [: K" e7 [8 C# |4 F
- /* Initialize all configured peripherals */0 F$ D: l: Q, `. T/ B; u+ l
- MX_GPIO_Init();
7 p f1 Z5 D( `6 {( D - MX_DMA_Init();6 c( q7 C# S: d) b+ O- P P f
- MX_ADC1_Init();5 d( O( z+ V# Z7 i
- MX_USART1_UART_Init();
& H) V6 D5 P9 T$ j6 t - /* USER CODE BEGIN 2 */
$ v+ p( X' Z# Q. I+ j& x2 { - printf("stm32g030f6 adc demo...... \n");
% E' s9 g7 J" t, b% O" m ] - HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);% E% i1 y: M' |+ W& y
- /* USER CODE END 2 */! o( f# ?' r) L9 ]7 {' n0 i
- ' V2 C+ ^( M% h7 l7 f, h6 x8 v0 C
- /* Infinite loop */
9 y) }7 z" z- d4 Z$ i - /* USER CODE BEGIN WHILE */# |, Y8 ]) W! p
- while(1)
& L% h* O) _$ d3 q2 U - {
% V9 @) ]) O7 p, v4 P - for(uint8_t i = 0; i < 2; i++)
5 _6 ?" E$ L7 ]' _1 c2 N- e - {
& w4 O# {" C- Y3 Q( z - for(uint8_t count = 0; count < 30; count++)# J/ p7 @% }7 s; n1 a
- {
2 K2 F$ |9 k; C7 ~, d - sum += adcCovValueBuff[count];$ g w! ~& q2 Q% l. O1 p' j5 C/ E
- }
! @/ q9 D! f& d0 t - adcAverageBuff = sum / 30;
& r3 I* }; ?" i$ D - sum = 0;2 L U. s5 ~9 r; d. } b, b
- }
/ k$ J* _7 v( D; V+ h! |2 v
7 E. a i' G0 L6 C0 b; U- printf("---------------------------------------- \n");
! V) w8 z) A# q, P+ [$ Z0 \. f - printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);9 p. ]0 K) ]0 Q" ]+ D& }% S
- votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;) H+ Q7 f$ [( b4 s
- printf("ADC Channel01 Voltage:%f V \n", votage);5 T3 B' X. }0 |0 ~; w. o. z
- printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);+ n# E+ z6 H0 d6 z4 ]
- votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;9 E+ i) y& o* z3 i7 V2 d
- printf("ADC Channel02 Voltage:%f V \n", votage);0 x# a! t+ ^' H
- printf("---------------------------------------- \n");
* F- W" n/ n% I- ~' c7 k: U - HAL_Delay(1000);* `7 l% M& f7 p5 G3 m8 ]; r/ o
- /* USER CODE END WHILE */4 f/ n; ~8 }3 {" G3 ?! X6 _# G
- * ^) {4 l; K: Z$ x7 C: o
- /* USER CODE BEGIN 3 */, _( a7 w+ K1 r. {" I& Q7 |
- }/ g& X) \5 l( H0 X$ }' e
- /* USER CODE END 3 */
3 x- v5 T, ~3 m2 `* h# h - }
复制代码
, _) l' c" `* u1 |. f/ m7 ~3 s2.3 外设的初始化函数* I. k( n# f7 f' E* h
外设的初始化函数都是由 CubeMx 生成的,因为我们只用 DMA 搬运数据,未使用 DMA 的中断功能,故初始化 DMA 时可将中断配置函数注释。6 h1 _' W6 ?* [# y P
2 f6 _3 `# J" J2 N- /**
* I2 [! u2 U" e5 f7 h R - * @brief ADC1 Initialization Function1 \" i8 { i: Y# l9 P$ ?
- * @param None
) w5 ?( X& C7 f( Y2 }! `- h9 @ - * @retval None
8 b/ q( s" R! F z" t - */# T4 K8 Y) o0 M6 U# Y+ h
- static void MX_ADC1_Init(void)
7 g4 ]* j; T) a9 w9 p: d - {
$ D+ {9 J5 e' [& j# P6 Y2 {% u
! ]" g' v8 \. y0 A/ |- /* USER CODE BEGIN ADC1_Init 0 */" d8 L% n x$ K8 B' _
- & o: a$ Y" P9 n
- /* USER CODE END ADC1_Init 0 */
6 P' b6 @) K2 H
0 e0 v( K/ D7 i0 C: S" c. w% ?; _- ADC_ChannelConfTypeDef sConfig = {0};
- p- U4 N3 b4 L6 a$ L" Q4 E3 s - 0 e: ~( X ~) v, {) v- i# X! ~ O
- /* USER CODE BEGIN ADC1_Init 1 */
) \% d7 k) F/ M6 d5 l! [& o - % c$ ]: s* |8 q3 o/ m ?2 C
- /* USER CODE END ADC1_Init 1 */# e, D9 h0 f, n! L* _3 d& }' ~! R
- /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)6 A; `: P* i9 N) p3 }- Z
- */+ f3 D# u- |6 z" z& G# L
- hadc1.Instance = ADC1;
6 J, s8 c. f/ l. I% D; H - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
& l U: J- ]% l; ~3 b - hadc1.Init.Resolution = ADC_RESOLUTION_12B;5 l7 e0 B% M+ H- }& F
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
R; [& s; |0 G5 r# N. h - hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;- g4 E R: j0 U5 B" C
- hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;3 S* j0 n% m* J( H' v
- hadc1.Init.LowPowerAutoWait = DISABLE;% F+ `4 w [: m
- hadc1.Init.LowPowerAutoPowerOff = DISABLE;& f7 P1 Q0 |! Z
- hadc1.Init.ContinuousConvMode = ENABLE;( q; N2 }& y! K% a! M# Q
- hadc1.Init.NbrOfConversion = 2;- ?& v; a: t! `- k. ]# ^
- hadc1.Init.DiscontinuousConvMode = DISABLE;
6 E) J3 g$ I+ }) h: ]" }9 j - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;) ^% Y0 ]0 p e7 N3 _! s
- hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
) o( }* E: a3 B& z - hadc1.Init.DMAContinuousRequests = ENABLE;
' e5 T& h5 q4 S% k - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
9 G \1 y X; C7 R* S - hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;
- ~+ q# o; P! P( O3 \ - hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;5 |1 g7 X! q) N; |$ k
- hadc1.Init.OversamplingMode = DISABLE;
( y) A' h% [; x; U - hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;) @! i7 L' L N
- if(HAL_ADC_Init(&hadc1) != HAL_OK)7 i; ^1 a8 w+ e( I
- { t) @; ~1 [$ y) @6 `
- Error_Handler();
! h9 ~" }2 A! B) C - }' u( j2 y' [! B5 U, R
- /** Configure Regular Channel2 G+ W) U0 ?2 Z1 n7 @3 o
- */
5 z8 _& h5 R- o& } - sConfig.Channel = ADC_CHANNEL_7;
! Z0 f1 j! [ _ - sConfig.Rank = ADC_REGULAR_RANK_1;
' U$ n1 n; Q, ^; {7 r - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;" k0 L8 X& A+ m; ]( x0 Z
- if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
' I, h5 `+ B$ E* [' V8 O- M - {
" x7 ^' Q' E- G1 \" m4 a5 R% w0 { - Error_Handler();) ~0 v9 q' R8 m6 @
- }
\) S2 o# `" i, a) d - /** Configure Regular Channel
9 {( P3 D8 _0 ?7 y# `1 \: E - */! A6 c+ Z6 d4 a& O7 U: Z, P0 t
- sConfig.Channel = ADC_CHANNEL_8;" q7 f6 x& C: C4 a1 y
- sConfig.Rank = ADC_REGULAR_RANK_2;
- i5 c6 a) @) t# N( Y - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;/ m" |/ G' M7 A/ o7 o4 u; F3 {
- if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK): Q/ v& F5 @% ^) d' W j# t
- {% E* w G8 q5 h O8 w# P
- Error_Handler();1 l5 \* E E/ L) J
- }
1 E/ s1 I& o6 j5 D4 I% y& g$ V - /* USER CODE BEGIN ADC1_Init 2 */
1 ^* N5 v3 G( \: r1 R Y - 8 c' r# H% N4 ^
- /* USER CODE END ADC1_Init 2 *// L2 ^2 @' x7 M" S& n8 Z+ w
$ A, f+ b, @8 j( \: A: \0 x2 x- }% Y6 t! W5 n' x+ S3 \( K; m
5 ?. c2 S* U# u( R' [- /**2 m1 A' w3 S: ~& N7 w$ O+ i
- * @brief USART1 Initialization Function* g! u v& |1 `' T: J
- * @param None6 i) K/ d! w n3 |+ w
- * @retval None% D' F8 K- q) D0 A. d" W& i
- */' B$ f5 d6 v7 i6 o
- static void MX_USART1_UART_Init(void)
( h" m# |4 E) _: I) l" G7 V. _ - {
8 u. l1 x! S1 v1 o5 t; Q
7 s& _2 M0 f# H" ?: n! ^: q- /* USER CODE BEGIN USART1_Init 0 */% E* t; t. G5 F+ z& M) p, q
& E) u& t% G5 o6 A, L$ P, o# T- /* USER CODE END USART1_Init 0 */
: E: t) x9 a* J" W1 Q - 5 p! o$ y9 Z! c- B/ _
- /* USER CODE BEGIN USART1_Init 1 */
4 ~' f5 R& v# w* b; d u! w
: B" d: _/ z5 t# r8 \! o- /* USER CODE END USART1_Init 1 */
1 f) o! J1 }, I& ~ e0 v' [ - huart1.Instance = USART1;6 @+ \; P+ q) C2 w5 _: O- `
- huart1.Init.BaudRate = 115200;
" V4 ^# _0 v. F$ x# a) U _ - huart1.Init.WordLength = UART_WORDLENGTH_8B;
& \) |( L0 i' w) B - huart1.Init.StopBits = UART_STOPBITS_1;6 J/ P" J- ~+ ^' u$ {( u
- huart1.Init.Parity = UART_PARITY_NONE;
: |, e. N! R4 g - huart1.Init.Mode = UART_MODE_TX_RX;$ d( ?% t# T& |
- huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
$ X$ ^" o. e5 n6 J - huart1.Init.OverSampling = UART_OVERSAMPLING_16;' ^8 ]# Z# N# Q: S, }* X
- huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
}1 H$ X) S/ v9 ^6 B5 ` S8 \6 m* M1 Z - huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
( x5 }7 Y0 S& R2 v, q ~# I4 F. I: r - huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;" Q) s& @; I4 b' C
- if(HAL_UART_Init(&huart1) != HAL_OK), n. Z- b3 {2 f' k$ Y
- {
+ ]0 i" _3 L1 H5 l! Q - Error_Handler();. A0 n7 T& ~/ F i) \+ r7 O
- }
8 I6 g; d9 W/ I/ z& w5 V0 } - if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)- H: o @# h3 d i
- {
( q- W P8 ^! h: I+ J5 h - Error_Handler();7 M* w' ?# L3 Y# W L& w4 @' v% O
- }1 q( `5 C5 J& ]+ j' D W, Q; x
- if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)& G/ V2 y+ Z) y$ D+ ?
- {
* \- a4 V) s0 M5 N" `- H - Error_Handler();
8 I' e1 w& K c+ f - }- u* p5 K- l; z3 D% z q
- if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)) F$ w0 t! l4 k+ E: G& L2 } q( E
- {( o$ |2 d2 Z' ~0 G, w2 k; X
- Error_Handler();/ K$ v' e! u7 {0 @" C
- }5 \ b0 S: F% U( A; M2 N! }, M
- /* USER CODE BEGIN USART1_Init 2 */- u# d' y" p3 N
- $ T' I3 C. a4 U
- /* USER CODE END USART1_Init 2 */
7 l8 v2 B2 s2 R7 |
\; f! L. A/ a2 Q5 q3 [- }
1 d% T/ t/ Z: e5 w
5 C4 B9 ]* z3 \- v- /**, C/ U) e. i* _+ T C( }7 E
- * Enable DMA controller clock
6 f( g8 T5 f% _2 R: c - */
. C" m) ?; n& k/ j; ?: p8 h! u - static void MX_DMA_Init(void)
5 e4 l5 |, E! q9 S& f' b6 Y7 W - {$ P0 x8 {7 p6 z3 B o: M
3 l' O* D: A, ?* m& l h- /* DMA controller clock enable */
$ L$ l' H/ F, j2 p. E3 b( { - __HAL_RCC_DMA1_CLK_ENABLE();
2 n9 C7 e2 ^- E$ s1 @ - 4 P! Y g7 F, Z6 p% R+ k: `
- /* DMA interrupt init */
' d+ t& \& A+ F - /* DMA1_Channel1_IRQn interrupt configuration */6 n0 ^! O: w+ Q0 C6 F1 v
5 Z% V# _4 M* H; k. t- //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释 2 T3 ~ Z6 V5 o! d7 \8 p0 @' c, A8 I
- //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);) S$ [6 C. f6 D
( {* _' @3 r0 m" ~- } u2 L0 O" Q8 c5 M M* g
- / K) ]1 J, b( R/ O2 w# ]1 O0 B
- /**5 D5 C- u5 r/ u9 l' t
- * @brief GPIO Initialization Function+ o% P) f! g+ g% m
- * @param None
$ s5 Z9 m2 D& @: l/ \ - * @retval None, U; L2 T" W$ X: [- P
- */6 z) E9 L' Q7 X3 o$ }, U' g. o$ `
- static void MX_GPIO_Init(void)- ~& T- s, Q& Z9 B
- {
- A L. R, H& k - 3 D* Y1 \; ~0 S$ L
- /* GPIO Ports Clock Enable */* ?% C; R3 k+ X
- __HAL_RCC_GPIOB_CLK_ENABLE(); V! I4 i% O! D0 F# R
- __HAL_RCC_GPIOA_CLK_ENABLE();
7 h7 l- e$ A# ~7 x* N9 \3 K9 b
. J$ R) v+ C* _9 A, o- }
复制代码
: s& T; t9 ?- i. i& m* w; ~4 F: V7 q3 e" Q( S
3. 实验现象: A+ Z5 H" Q `! C
编译并将程序下载到开发板中,连接串口助手并打开;
$ t# @/ l# L0 K1 w4 E实验现象:每秒打印一次当前两个通道的 ADC 值及换算后的电压.
3 _. @8 f( |8 w
6 e! L g3 ]- ^$ Q" q
$ \: D# j, R b8 K' l( G: j! ?' D' E: b4 w- T
|