1. 使用 CubeMx 创建 ADC 工程
5 ~+ d5 K4 G9 j0 z. y6 _! h6 { W打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
" A5 l, |9 w5 r: v/ o' S8 p/ j! g% i( R3 B, S
先配置一下串口,用来打印相关信息
3 a5 W s& Y1 K" y5 n' Y3 }1 X
5 }- l4 n2 R& t: z% M" L9 o, ^; _" z$ X( T. M
3 z- K+ r! A+ G+ _+ d再来配置 ADC& s% m3 p5 D: z5 v; H( X' ^
! F. n8 X' C* l4 n% o* T. x9 {% f
, a6 A) m0 r# E+ {# n3 B' d
- j$ x) F- R) R! b
e/ g7 Y+ a/ V$ {$ e
% U1 [: z7 a4 Z: v4 H1 _+ v5 _7 {, ^配置DMA; T9 I+ l; I! w
8 c3 m* ?5 T( f0 E5 x3 U; J7 q
$ y% |4 |! H" p+ hPS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数.
& Z5 a" x1 @' C. t# d! ?/ e$ G9 z/ z) M2 J1 }
配置时钟
' ~! N4 W; D) y3 R* A1 O/ y' y, z
/ p% \: {! v/ d8 ?$ e; {* U; ^; x( D6 d: V
0 r9 B+ `4 m/ \# [. U, W( ?$ qps:本实验使用内部高速时钟,未使用外部晶振,主频设置为最大的64MHZ.
# b2 b- G- `+ R% A7 ^4 Q$ H; o+ U6 x" J; ~' ~/ k4 U
配置工程相关选项
( q# v% I( T# S1 A6 I" `, K# Q# a/ o i5 g8 s8 k/ t& P& O
! Q; N5 b, n8 ^% ~. @: `* R& @( q- l3 H7 {( |, g ?
配置完成后点击右上角 GENERATE CODE完成工程的创建- e, X! ?4 T5 N- v8 J
% j2 z5 p( j" L# A8 Z
2. 编程
* _# q2 R; z3 t6 C2.1 串口相关的代码
1 y7 P9 x: e& m* f2 r, x6 ^4 a因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数- y9 Y6 U# W; ~, P' g1 m
- /* Includes ------------------------------------------------------------------*/: T. u, I, ~# F) }) @* a' G
- #include "main.h"' o, d8 Q& H) D0 p. E
- + r4 I& v) a u2 n
- /* Private includes ----------------------------------------------------------*/
) ]% g! o, J& ]0 l c. |% X8 o - /* USER CODE BEGIN Includes */' |4 J, o6 r/ A0 }* d6 k% V
- #include "stdio.h"
5 Z. e' l9 l5 g6 R% ~/ u* @4 g - /* USER CODE END Includes */# O) E( t0 _- V4 y! X, Y2 r! O* R
3 H% M1 S6 m7 d( Z$ x( i4 N# ]- /* Private typedef -----------------------------------------------------------*/
2 @' h% D4 L: s9 g% J& d - /* USER CODE BEGIN PTD */- V/ ]8 u9 i) |
$ P% @4 [! R& k+ w8 `- /* USER CODE END PTD */
0 L) A( P' `% C& T5 r I5 D5 F
1 X0 L8 @+ Q( I- /* Private define ------------------------------------------------------------*/ M( W7 z+ l& g- V( n( G
- /* USER CODE BEGIN PD */' \0 Q0 O! a1 V' f/ ~8 ?4 c
- /* USER CODE END PD */4 ?/ ?9 Z: r2 |' |8 H9 y
- / }' O* F* z' U- x, V# }
- /* Private macro -------------------------------------------------------------*/
1 W& G/ ~) n! _ c( b - /* USER CODE BEGIN PM */
+ a1 i# ^; [/ e1 s' G- I' \
4 x( Y% S7 C% M6 S {3 H& b- /* USER CODE END PM */0 v: ]* c& w4 r5 z
! t3 v2 D" J8 x- V$ ~" l1 V- /* Private variables ---------------------------------------------------------*/
+ F/ `; ?" V1 S5 H f$ u - ADC_HandleTypeDef hadc1;
: `" U6 \+ e5 |5 N1 f' @ - DMA_HandleTypeDef hdma_adc1;
( G. b; V& s3 |" A( w: Q
# X$ w6 p" m. l% F7 }- i* x, x- UART_HandleTypeDef huart1;3 ]+ d: {/ T$ h* i
9 t* f1 D5 t- m9 n- /* USER CODE BEGIN PV */
/ q) H; ^, e8 B3 e9 j* \
" E3 b {0 C/ g' M- /* USER CODE END PV */
6 c2 w. R# ]9 C$ Q
. u7 F! v5 z# |1 Q K" F5 v( t- /* Private function prototypes -----------------------------------------------*/4 n, a" U: }7 I1 B! z1 v$ N
- void SystemClock_Config(void);" j, o' O7 F8 m
- static void MX_GPIO_Init(void);
7 O m; t- l" U - static void MX_DMA_Init(void);
/ v+ S7 r$ P9 q: i& J - static void MX_ADC1_Init(void);0 E7 G* M q; ~4 l/ c" ~
- static void MX_USART1_UART_Init(void);
. b! A4 ?9 _+ { o - /* USER CODE BEGIN PFP */* h5 @) X3 w) h; u3 M/ O' M
; Y N$ |2 W* m$ a! @, O! G; l- Q- /* USER CODE END PFP */
2 \4 ^6 ^4 H) v" H3 Z
8 u) }& Y0 z* T( {4 C' a$ v- /* Private user code ---------------------------------------------------------*/: j6 x- j1 S* I5 Y1 {
- /* USER CODE BEGIN 0 */3 s; j, D H a3 Z
- __IO uint16_t adcCovValueBuff[30][2] = {0}; //存放ADC的值 2通道 每个通道存放30个值,由DMA循环写入
2 N' U O4 c7 U2 P2 D; ~; D; d2 W - uint16_t adcAverageBuff[2] = {0}; //对每个通道30个ADC值取平均值1 W2 n4 D$ g( u9 y, J2 T
- t* S2 V9 ?! b& Q' f' P* T4 H, K) {
- : e7 Z' h% x! ^
- #ifdef __GNUC_2 R! ~0 p# {# C8 g/ a2 E3 F8 }( o
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
* A. Q% O: e# R; h0 q' D; T - #else
0 S# o5 y) ^) w. a( `4 b - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)0 ^) b, @5 R4 `4 h
- #endif
1 k8 W+ n( \: j+ J - PUTCHAR_PROTOTYPE6 M/ S9 r, l" B' N0 I
- {
8 p$ m z) j1 c7 _/ J* R0 X6 k - HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);$ C4 X! b# Z7 R
8 {4 |$ K6 Z/ Y- return ch;
5 }' e$ k2 I; f0 R' j3 E) k6 c - }
7 \ j! `" s# J. O5 x: I5 H - ( d: }; h5 Y4 _6 G G
- /* USER CODE END 0 */
复制代码 - |4 `$ r- Q0 A2 b1 b
( z& s& }* _5 F' q4 S0 e- T
2.2 main 函数
5 t" q7 R5 p! O; r* x8 G: I- /**
* `1 O( |" [0 P0 E - * @brief The application entry point.; f1 c0 f- L/ n& Z* @' G* C
- * @retval int
' ?9 N" U% L! n. M - */! n7 J/ k, ?% r& J9 W' k
- int main(void)6 Z8 F$ C' m8 x( x# G6 o2 ?
- {
9 a) L: ?! S7 Y9 \0 N - /* USER CODE BEGIN 1 */, c6 M3 N* }# T. |5 }4 \' C0 u
- float votage = 0;3 _6 e I. o4 O+ v& p
- uint32_t sum = 0;: }- ?( i2 U1 h+ q4 z `
- /* USER CODE END 1 */& d/ w# E; r1 Z. \) F7 N3 X# G5 J
- : C+ N7 G4 M. G" [
- /* MCU Configuration--------------------------------------------------------*/1 ?. y9 k/ |6 [+ T: Y: C
- 4 g( N) _6 A# p. _
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */3 q p) ]/ a1 L( Y) X
- HAL_Init();
% B& B! d( ]+ }9 R5 K# F0 {9 c - 2 l v, ?7 k" Q9 U7 C2 M6 c
- /* USER CODE BEGIN Init */
( e# z E; \2 @ a1 e1 T8 t
6 g0 F) a% B/ [3 ^% r9 V% T- /* USER CODE END Init */
) @/ X# S8 w8 N; ~8 K
! }; W+ K: Z1 N/ i# X' Q- /* Configure the system clock */+ c' T/ q9 v9 y; L) H# B
- SystemClock_Config();
7 D4 S. t, t# }0 M! E. p [# X - ' q6 R& S( x# b1 S U& J
- /* USER CODE BEGIN SysInit */8 }9 W, i! a4 ]! H8 i; r
- : Q t% j) R# g- Y% X; {9 @
- /* USER CODE END SysInit */
2 X( S& R2 i' ~, r/ Y
" ]! ]8 L' x2 l' ~) n- /* Initialize all configured peripherals */" V. ]9 @0 \' W$ [2 L* B
- MX_GPIO_Init();7 z$ o" G4 ?- k& Y2 Z
- MX_DMA_Init();) `" D6 O: a, m2 y3 z1 E$ i0 i8 |
- MX_ADC1_Init();
4 o8 Q6 P- S$ v' \0 T; f4 B - MX_USART1_UART_Init();: i* y5 l: }! H9 q5 L
- /* USER CODE BEGIN 2 */7 U _9 o, ^8 e; A
- printf("stm32g030f6 adc demo...... \n");7 Y9 c" ]' d( Z* j( w; }8 n' W8 U
- HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);
+ u3 m0 Z2 ~& U; J' A& B9 F3 g. e - /* USER CODE END 2 */; M0 W+ B" w6 j% | E9 q8 H
- 8 X' a8 h& v8 m* W+ I1 w5 J" Z5 u
- /* Infinite loop */
, ^* J& |9 y5 ?) W4 E% p: p. ~ - /* USER CODE BEGIN WHILE */% ^0 w& q- G2 I$ B! f
- while(1)8 X! J% T+ `9 k/ A# f' f
- {! w3 }. w' `# \9 k; f) a
- for(uint8_t i = 0; i < 2; i++)
3 a6 d" j! S# e0 B4 e4 m - {/ Z v W+ c0 f7 L6 A- u
- for(uint8_t count = 0; count < 30; count++)0 ^9 j- t" i, a9 }: y* S0 c# `* e
- {
6 J, Q# v L6 l# G t2 j/ l4 n5 R - sum += adcCovValueBuff[count];
1 ? ^4 v$ O: T2 ^& ]+ B4 X$ o, z2 L. n - }# N" i: B/ `+ p2 ^
- adcAverageBuff = sum / 30;; Z2 e1 n" Y3 p% t$ P8 K
- sum = 0;
/ B% a' ?7 h9 f$ T$ u - } s& e$ ]+ G5 A0 u4 U% J
- # {9 C. v0 u/ K
- printf("---------------------------------------- \n");
6 ^* o2 [/ O: U/ L* P# [1 W7 r5 u - printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);
/ l! S& L) y7 ` A5 O - votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;- X5 i( c# z6 L X' K) Q
- printf("ADC Channel01 Voltage:%f V \n", votage);
$ y, T9 D2 Q( @3 F# ?2 J& ^* ? - printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);3 |7 E: S% W6 ]! s9 u) p
- votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;
$ @ \0 w4 D2 Z1 I) ^ - printf("ADC Channel02 Voltage:%f V \n", votage);9 n' w& w2 t( b- I. ]8 K, D4 H: q
- printf("---------------------------------------- \n");
& K: W/ ~$ t5 d8 I - HAL_Delay(1000);
! S1 E4 }2 l! _# W" `. S - /* USER CODE END WHILE */1 f1 _$ v. P+ \2 R
- + Q u9 w1 ^3 `! P
- /* USER CODE BEGIN 3 *// U2 B: \; b' |& }: U8 x
- }* o* \+ i7 w) r2 K6 w: n
- /* USER CODE END 3 */
; }8 R! Z5 r. J9 l& b - }
复制代码
0 n8 d( r! {5 J- m; Q9 I& Q" ?5 I2.3 外设的初始化函数
: n* J. Q% W( Q$ @" C外设的初始化函数都是由 CubeMx 生成的,因为我们只用 DMA 搬运数据,未使用 DMA 的中断功能,故初始化 DMA 时可将中断配置函数注释。( {, w, v- a; A' ?
( I" l0 D5 G5 l! O* R- /**
. R9 e: o/ S% l% B: D& K - * @brief ADC1 Initialization Function
. p+ d6 H& [) m- G6 H3 d& _ - * @param None
: n s1 G2 R) D8 n8 @" m - * @retval None
2 I a$ k' u) q3 t- | - */
# |5 S$ s! b( b - static void MX_ADC1_Init(void)
: f* D1 B M/ E' Q7 w' [2 u - {
2 L& \0 _/ t+ V( k
" r7 o# ?/ P. D9 ?2 W9 }' E4 t7 e: T- /* USER CODE BEGIN ADC1_Init 0 */
; I' {) \* ?! }$ O7 L) e
+ h7 i& o2 t$ a- /* USER CODE END ADC1_Init 0 */* l! @: e. Q! B- D- p/ m3 d- z
- 7 X5 O0 o- t$ h: d
- ADC_ChannelConfTypeDef sConfig = {0};" h9 u% N- k5 Y* E6 P2 p5 l, @; C
2 E' D9 x3 g+ B, i- /* USER CODE BEGIN ADC1_Init 1 */
$ ^; [7 @0 W$ n) L
0 Z; m: z0 _( o, g( I" o B6 ~- /* USER CODE END ADC1_Init 1 */
3 b ]0 Q" ?" O$ L; I! R: m - /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion), o% [6 C' b" G% q% _( ?& I, m+ e
- */
) B. E; @7 [+ `$ ~$ r% v - hadc1.Instance = ADC1;
+ H4 p9 g, u& S+ ~! C. Y3 c - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;) W/ v8 }, M" V4 m/ h( S$ C* ?
- hadc1.Init.Resolution = ADC_RESOLUTION_12B;9 G) l/ H3 j* s
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
4 q' ^( X% ?3 O7 I - hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
+ n7 M( v; \) X" x - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;" Y1 F( r' u* |( S; D
- hadc1.Init.LowPowerAutoWait = DISABLE;
) ~7 l: s3 C- {1 [1 |1 u$ U - hadc1.Init.LowPowerAutoPowerOff = DISABLE;3 P) D$ u& I: \% E
- hadc1.Init.ContinuousConvMode = ENABLE;
H' n% k3 d! |& J& S0 v - hadc1.Init.NbrOfConversion = 2;# @* @+ D" z# F H. S# Z0 N
- hadc1.Init.DiscontinuousConvMode = DISABLE;- ]- q7 j" v& t/ ?6 u8 b9 M
- hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
" T( }& Y# A; D- W. q- f. t - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
$ F' P3 F9 ?1 B4 [: E - hadc1.Init.DMAContinuousRequests = ENABLE;
. s% z9 E4 [' r# j- E4 S9 e% @ - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;/ H; S# A% y9 \7 b2 S; \
- hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;7 c! O3 B1 u* Y# Z
- hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;
9 O$ d. x" i8 a - hadc1.Init.OversamplingMode = DISABLE;6 W! n& T/ ]& d, Z
- hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
1 `. z5 n p0 X; e4 V# l& t( n6 C - if(HAL_ADC_Init(&hadc1) != HAL_OK)1 W. ~( z6 U$ n6 ]( a1 m8 t- Z( h
- {
) q9 ]1 T4 i' z! D+ A: c - Error_Handler();! B( o! I, S) i U5 y4 b# O, I
- }4 N3 V3 a; k5 G
- /** Configure Regular Channel
8 O; O3 }* {, J9 o' v$ \ - */
* T" h5 L9 D! {- Y) Y2 E - sConfig.Channel = ADC_CHANNEL_7;
5 u! r7 j; W! Q( w# K - sConfig.Rank = ADC_REGULAR_RANK_1;0 P2 R: U3 ^) p( _& {1 o7 e o. T
- sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;# [0 ` ]' z/ K q3 I. Z
- if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)$ n. o) H/ G N5 i% e2 e) K8 a1 z
- {
' }$ e- R5 \3 ?$ A - Error_Handler();
5 l4 y. z( _% T* G - }& j4 O% R8 b3 M G8 j% d
- /** Configure Regular Channel
' \+ ]3 z! `, k. Z. _ [# a - */
" K; X* x: h1 `, G" i0 Q - sConfig.Channel = ADC_CHANNEL_8;
0 X' A+ I' K7 i R4 l2 j - sConfig.Rank = ADC_REGULAR_RANK_2;
; I+ t9 t' H( u$ Z' Y1 K$ A$ A1 k6 T - sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;3 F9 Q7 |0 U! z
- if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)1 t3 v: ^/ {( J: ?
- {
t$ E! K( L! l* L - Error_Handler();# O% E0 `! i; g' H' P; \
- }
, B7 V9 n! _+ I! G9 r - /* USER CODE BEGIN ADC1_Init 2 */( w' f- b' T( G k$ v1 T
- ! i+ S/ }' L' W
- /* USER CODE END ADC1_Init 2 */. u& I. a. m- \# d. z
: F+ u1 B0 a* Z- e9 h: j8 u* r- }& B) Q5 j1 P3 V# T
- 4 f& A! E, P# P. J
- /**. ?" Q# h+ y, P$ N
- * @brief USART1 Initialization Function1 W9 {; b5 f o
- * @param None
6 h" D6 K( P, N4 C" H - * @retval None l- r5 Q2 \. h9 r. J9 x
- */
3 l; F3 H. v+ ?- e* M2 H - static void MX_USART1_UART_Init(void)7 f6 K7 F4 ?% G7 R
- {
9 t8 u: i8 q' R% t) k6 W
& [- f1 T3 z0 {" C$ r& h7 k- /* USER CODE BEGIN USART1_Init 0 */2 t% @4 I8 L$ Q0 L- R4 q. \
* l, A/ [: U+ h9 @- /* USER CODE END USART1_Init 0 */
4 ]* y" X) Y9 e! {: T+ H! P - * H: ?& O5 B; C# C4 E) m
- /* USER CODE BEGIN USART1_Init 1 */
: ?" |' k4 J" W$ d; f
9 P5 N# I9 z& F0 C' v$ m" l4 ?- p, P- /* USER CODE END USART1_Init 1 */
4 K8 k, n9 n; M7 o8 q2 _ - huart1.Instance = USART1;; d& W+ r0 s8 `9 c, o
- huart1.Init.BaudRate = 115200;
+ u% z, o M1 B0 y, Q8 ] - huart1.Init.WordLength = UART_WORDLENGTH_8B;
6 N( H- e! X6 i5 t - huart1.Init.StopBits = UART_STOPBITS_1;0 `# J$ u5 I# i4 k
- huart1.Init.Parity = UART_PARITY_NONE;
+ z- h8 {9 |1 k+ C. R! E( i6 M; o - huart1.Init.Mode = UART_MODE_TX_RX;
, i- K, T( N3 g+ {: E - huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;4 u6 } E5 E4 x, J* c2 m
- huart1.Init.OverSampling = UART_OVERSAMPLING_16;
3 r( \3 V5 g/ E1 i - huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
- T2 n/ k* X+ _6 { - huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
4 y9 h0 L) @; s( w W) A2 T - huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;, e0 s+ ~) j6 \2 x! D
- if(HAL_UART_Init(&huart1) != HAL_OK)
6 v8 j6 l4 A2 d$ ?! p1 t - {
& a0 s3 B$ I* _% L A1 g8 { - Error_Handler();
9 H: t: i/ f% O7 s" W - }
# d& E' A5 K4 B. f - if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)* U2 q- k( U1 G% y
- {
/ Z8 H9 a& B! P2 A' d - Error_Handler();0 v# O$ H- q6 l& Q$ a/ x
- }7 j3 \; _7 l0 J* Z
- if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
) B3 G8 @+ C3 ?( Y9 O4 }* n - {
5 X7 i; |4 P6 Z2 V0 E" F2 j) b# Q - Error_Handler();5 ]0 c6 N2 h/ O9 t7 A1 o
- }6 `6 k" j$ L6 |: j& a
- if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
' ^/ p1 \3 x0 Q8 j& c - {
" ^& e) k# |3 D - Error_Handler();1 P/ q" ~- D$ }. v
- }$ D- ?% |/ d" E" w! }4 _
- /* USER CODE BEGIN USART1_Init 2 */! i8 f8 K0 B8 g' ?; M
( o. w, ^: x# L' x9 C+ |- /* USER CODE END USART1_Init 2 */& J! W0 R6 _$ v# w6 r3 ?
4 m. j5 |# P- h# c+ k9 J8 t- }
W& e( P9 A! I Q# h - 5 x6 G; Z2 y1 n/ P2 |$ H
- /**
- b! `" S; B0 e, ` - * Enable DMA controller clock
& {! ~& ~0 {3 j7 C! M - */. X, `$ n( h4 Q, k5 U
- static void MX_DMA_Init(void)
) V' y) U1 c6 `7 S; w - {
& p* X5 T o; R2 O9 h, ?1 f
7 B- c, D* i+ E- /* DMA controller clock enable */, ]" ~, K6 D! t5 S7 c8 f
- __HAL_RCC_DMA1_CLK_ENABLE();
7 Y* b+ ~ f/ D# N& n' U
; |4 G8 }( c' b$ Q: Y6 z0 Y+ V- /* DMA interrupt init */& |& l& w7 n7 o' _; d
- /* DMA1_Channel1_IRQn interrupt configuration */4 x# Z' O2 d; b4 |) W
- & o/ ^% ?6 h$ {1 @* g
- //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释
8 q. I( C |& K0 p - //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
: M% F! {3 O: D/ l: \1 R6 y7 F - & \1 K4 J6 \2 n* j1 B
- }3 |' `) x( k' Q1 [: F
- % U/ v& ?) d4 j. H$ h0 b
- /**
# |5 r0 a: V" f/ i - * @brief GPIO Initialization Function2 O6 m2 C# a7 G
- * @param None
* G. ~" M; q6 c n - * @retval None
1 U/ I0 G) E! }& S' { - */
0 F) D C5 z% c7 t5 h0 R, R - static void MX_GPIO_Init(void)
6 G, V3 \" C" o1 I5 s5 G - {. h% V* T! `- B0 r
; F3 ^5 G/ j" Y- /* GPIO Ports Clock Enable */
" @& b. G9 e# z - __HAL_RCC_GPIOB_CLK_ENABLE();
2 Q; |2 E) L% C& | - __HAL_RCC_GPIOA_CLK_ENABLE();7 p$ b7 c- J' x/ M( A% r
- % `+ ^* c- @: }# J
- }
复制代码
/ d( E- M: V; @+ b' }# z
) c7 u' V6 Q a# ~' _3. 实验现象
3 `/ ?8 b, B7 `6 `# b编译并将程序下载到开发板中,连接串口助手并打开;
+ h8 H, T( e5 p/ g实验现象:每秒打印一次当前两个通道的 ADC 值及换算后的电压.# G4 @; m# A E7 t; E, [
4 `6 A* x9 s( F* Y: p; i' n% \1 g8 k3 i
5 I% r9 V# f( i- j |