1. 使用 CubeMx 创建 ADC 工程
) w+ d+ U& A( u& B, G( U: ] i0 q打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
4 w& D# \/ Z( Z: D, R0 l7 K& B6 M6 Y$ F W+ s7 ~
先配置一下串口,用来打印相关信息
+ c d" m7 T W4 ?8 Z$ d
: ^0 {/ U5 D* |! G0 q3 ~' T9 Y6 w2 _0 D" {" V4 k: l5 _
5 \9 D. c H" a# t/ N/ U; _0 p5 p
再来配置 ADC4 }4 a: B9 q; E( X! U W0 A! o" u4 X
' j0 q# x/ y- O0 {
, f7 Q! T3 F) F. I# W8 n# z" J& c: c" l2 |9 D
4 N& q0 K" Q+ R% P# Y) l# |
_& U2 b- i8 s( q; ~8 _3 j配置DMA
5 T) A! `, z- t% W* ]( x; ^' c' F9 a( {- ]& j: t& h
8 n9 J- y5 t0 M! O- Z) k
PS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数.
4 I; b( |% n9 G3 h, x1 s8 o( A; ]
0 {6 e) ~3 Y0 Y, D) F配置时钟; y ?. s6 o7 b; K" M, M6 h* I
& E( f* U) v ]3 C0 V( z# U" O( [- D' |2 J- S5 J- q$ d
* m4 N" o. B8 ^" b
ps:本实验使用内部高速时钟,未使用外部晶振,主频设置为最大的64MHZ.
7 W% V$ I( J- V9 l" T5 y
* I* a# ~# K' P4 G3 S" X, U7 A9 F配置工程相关选项
7 H, a! J: v& M, V* @! {- }2 Z
: A% ]/ C8 K9 z* k9 @& h$ M
/ {+ E- v* _2 g- T
- V% B, A1 F+ c8 a1 L% p3 V配置完成后点击右上角 GENERATE CODE完成工程的创建. p! H# N* x" v9 M
8 b& c( ^6 I1 F, Q# t. O
2. 编程
, }! Z" s) L; Z# f2.1 串口相关的代码: d# f% X' q5 Q* `
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数7 s4 q. l6 K9 f, G N
- /* Includes ------------------------------------------------------------------*/
, @% S. H0 g7 Z! x3 x } - #include "main.h"8 F4 x$ r, ?* M; W
- ; M# {& d' O" t" V# |% f$ d
- /* Private includes ----------------------------------------------------------*/
, T+ ]$ Z( I! u7 p4 J' Y( D - /* USER CODE BEGIN Includes */
6 |+ M8 r4 Y* s0 _ - #include "stdio.h"/ a j+ A1 y6 T0 {4 m" D
- /* USER CODE END Includes */* y1 C% P( \1 h9 m
- 1 k6 W. y% x2 V* u6 j
- /* Private typedef -----------------------------------------------------------*/4 e" @; t! m7 ^/ |! e# f2 o
- /* USER CODE BEGIN PTD */
& I }/ O) e* y- ~4 R3 C- ]0 q
$ [) ]+ s6 l3 E7 c5 f/ Q e/ t- /* USER CODE END PTD */
F, \) N. f3 m. }) S) }4 F
1 ]- n- V( A/ z+ C$ k+ Q# X [- /* Private define ------------------------------------------------------------*/. {* S6 v4 G9 O
- /* USER CODE BEGIN PD */
; Q; I5 G w6 l* Q ? - /* USER CODE END PD */
2 e( ?0 S0 M3 H+ \9 z' P- B - 7 U; |+ I5 w5 H3 v9 z' {5 V, }
- /* Private macro -------------------------------------------------------------*/* T, @ k, `) R* [
- /* USER CODE BEGIN PM */: j l: k4 i/ ^& _7 h* o
- * y7 \; }9 a9 R$ w3 q
- /* USER CODE END PM */
% z, t* M; x3 c) j3 u - 1 e: F6 w5 }4 A7 e; I% x. E
- /* Private variables ---------------------------------------------------------*/
" x7 ~# Q: G( a, S - ADC_HandleTypeDef hadc1;
+ ~$ B0 ?$ M e8 W1 I! R - DMA_HandleTypeDef hdma_adc1;
" w3 ~; R: B1 P9 O: M7 b/ h2 N
- Q3 ]6 `7 [( Y1 r! i1 l0 D- UART_HandleTypeDef huart1;
$ I1 q( J* m% S& N. p2 _, h - 1 Q i h. F7 D6 ]" b
- /* USER CODE BEGIN PV */( [, n# {0 U& Z ^; _ V
- 9 u& B5 _( S/ n) G- `+ |
- /* USER CODE END PV */
* N' y$ U8 W4 y0 S
0 I- w0 _6 Z5 P- T( M: [2 \- /* Private function prototypes -----------------------------------------------*/
6 ]0 R, E% Y7 O% A( z2 { - void SystemClock_Config(void);# G1 S0 [8 }6 H) n t. o# E
- static void MX_GPIO_Init(void);
3 j) E1 L: B+ L: ? - static void MX_DMA_Init(void);
% R' O( j B3 E% A: [% Y+ P5 x# o' x - static void MX_ADC1_Init(void);. p# R9 D- G Q$ F$ ]/ I
- static void MX_USART1_UART_Init(void);% i& y/ ?" U. O* ]: Y
- /* USER CODE BEGIN PFP */
5 d$ w3 t8 Y1 c- C1 O$ e { - ; N# V* f1 G; Z) M6 y# g4 ^
- /* USER CODE END PFP */
. Y* G; ]! h5 S" A# i- z
3 m4 H6 i4 q5 p5 ?' i6 C# _$ {- t- /* Private user code ---------------------------------------------------------*/
: `- y) Z+ H4 o% Q - /* USER CODE BEGIN 0 */, x/ D; ~# d# S1 L; t& R
- __IO uint16_t adcCovValueBuff[30][2] = {0}; //存放ADC的值 2通道 每个通道存放30个值,由DMA循环写入
5 m5 B+ n" Y6 l0 A5 K2 [. ?+ A( D - uint16_t adcAverageBuff[2] = {0}; //对每个通道30个ADC值取平均值6 a5 U2 U% J% s* V9 f
1 Z8 |2 ?+ e! q V- 2 D& k6 N' ?/ L& c! {
- #ifdef __GNUC_; D6 T; n2 \& t7 t* D% c. ^
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)% P3 n! Y3 J& t6 x8 [! G& v4 E" g: Y
- #else. t S9 a8 a1 I. |( d$ U
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
- h# O+ ?, O) l- B3 ^/ V$ t: a - #endif8 m7 a: {# s& ~- W8 T# H) [! k
- PUTCHAR_PROTOTYPE" @5 ]3 Q+ \( z# n( l
- {$ ]1 a; g0 k- `, U1 H# z0 M
- HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
0 `0 ?+ n) M/ J* e - 4 }* y; W: N9 @* T) x0 b; j
- return ch;/ F; q* `; f$ l4 n( G2 U9 a2 Z
- }4 }- i! ^- |/ _- F( p5 f
$ B; P$ ?$ t. h- /* USER CODE END 0 */
复制代码
' p* K- B$ V1 d& J6 q9 T7 x- Y3 b/ F0 F! T) h
2.2 main 函数
3 Y9 k, m% @4 v- /**$ s2 R# Q4 C7 V4 m9 f: {9 K; Y+ {
- * @brief The application entry point.
* i" |# |6 j* J7 I6 p" s* T5 V - * @retval int
1 k/ r+ e3 J1 W' Y( `5 A+ Y4 }: L N - */
* G- S7 @- W$ s; v( Q) W - int main(void)
/ G. i2 F1 f+ _3 A8 B) J y - {; [9 ~! J. \+ d9 B
- /* USER CODE BEGIN 1 */+ m: D$ `, x6 E( T
- float votage = 0;
5 U% C/ v/ n3 z* Z1 S1 t; A - uint32_t sum = 0;$ ~. d' M2 G# }% J1 Q
- /* USER CODE END 1 */
/ p8 i6 R8 F8 A1 }* r/ r _* c6 h4 z
5 h; z/ x! l5 ^) S2 |3 f7 r! R- /* MCU Configuration--------------------------------------------------------*/ L( D, E/ w' D o& \7 ^
0 z9 T0 t3 I' ~# u! P& m B6 R- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */9 g7 n, `6 L% b% b0 i/ }
- HAL_Init();
- H, v: h8 J0 [1 q- R1 l P. ~1 |
7 V: {- n3 m9 E! G/ \# H- /* USER CODE BEGIN Init */
; N" X i S5 E) ^/ d8 s - 5 o0 I N0 {) ]5 ^6 d3 |( D
- /* USER CODE END Init */$ o8 T- i2 B$ A7 r" _
- 3 ?& h" l5 `- D( `9 a" c& ?! W5 _
- /* Configure the system clock */5 J; A8 \2 R6 H9 I: g- R+ v
- SystemClock_Config();
4 s% o( p4 d! R C! L/ @2 w$ G4 p
- P( x/ s( Y2 A. a1 m& c5 \- /* USER CODE BEGIN SysInit */
) r. K2 v6 f: H; j1 [9 n6 m9 m
! \% V1 K8 i( s$ y) Y2 Z" X. x3 m- /* USER CODE END SysInit */# j( X1 i; s. |/ k2 S8 }0 R
, z0 v( J- T2 X: i" a+ N- /* Initialize all configured peripherals */; E* R$ h1 M6 l4 ]( N2 m+ Q' n( [2 z
- MX_GPIO_Init();4 |0 f$ ^+ Y7 s. ?1 B
- MX_DMA_Init();
8 }2 N7 e0 u8 P) X/ a j - MX_ADC1_Init();
' @' x0 J" \, X/ b7 Q - MX_USART1_UART_Init();
" T c. v4 X- C" y* L - /* USER CODE BEGIN 2 */9 I2 t! U: i( C# J. i; Z
- printf("stm32g030f6 adc demo...... \n");
8 f5 z( a5 q; r% v. W2 ~ - HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);
5 Q ^ C( N* X) p. F - /* USER CODE END 2 */- Z! ]$ H- f! n* `9 T9 O/ J% _9 l, J
- " Y. ~+ x, |& ]6 [: D, G- z; p
- /* Infinite loop */
1 c0 O; V$ M4 U9 ?4 O* q' I8 `& z - /* USER CODE BEGIN WHILE */: ^& ]4 \! [& B+ _1 C5 w: n* L% n
- while(1)
- N( q- f3 g+ R& S9 W' {4 { - {
8 A4 m) G6 V# W. B" @, j- _ - for(uint8_t i = 0; i < 2; i++)8 C( Z; H8 q* |' g4 E( O* B+ k
- {
7 r9 \# h! ~0 N7 g - for(uint8_t count = 0; count < 30; count++)8 [4 Z& ~7 N! n. Q
- {
) C" B8 O2 v9 v# f4 W, Q - sum += adcCovValueBuff[count];8 b3 h+ G1 i' H$ E0 G
- }
# t4 f2 F1 P1 @; {: R- ?9 Y - adcAverageBuff = sum / 30;: L/ [& Q. h# F i+ V! z
- sum = 0;9 y& r% {' v1 Y( W" ?9 L
- }+ D/ y" w$ V6 s! {
, D( G9 a: f8 w0 p- printf("---------------------------------------- \n");
M; O+ {4 D1 W1 J6 C" } - printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);3 R9 a/ T, ?9 J
- votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;, |: g! V/ r3 v- {8 h
- printf("ADC Channel01 Voltage:%f V \n", votage);
' D$ k. w9 R5 c" c H - printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);
; a5 u) S e5 j# V- O4 W0 N9 O - votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;$ Z# e# `/ [9 u! ]0 L! x
- printf("ADC Channel02 Voltage:%f V \n", votage);) S6 D3 {6 M# f2 L
- printf("---------------------------------------- \n");
8 o& C. d% M4 K/ R6 y& `1 Z - HAL_Delay(1000);
& ?: A* E u1 o& V+ k - /* USER CODE END WHILE */
$ q7 N6 J, F6 A& e& ?' m
/ R3 Q2 A, J3 |' h- /* USER CODE BEGIN 3 */
3 r9 v1 k& F1 m+ k% X" {+ ~ - }1 G/ g/ [0 E; |' L% @. d. S/ I
- /* USER CODE END 3 */
- @7 u) i0 H- y+ W7 t0 q# w& w - }
复制代码
: X- T/ d" q8 e& d7 x" ]/ a2.3 外设的初始化函数! I5 G. v) Y( m) b& c0 a0 Q) b0 B9 Y
外设的初始化函数都是由 CubeMx 生成的,因为我们只用 DMA 搬运数据,未使用 DMA 的中断功能,故初始化 DMA 时可将中断配置函数注释。1 o9 K& i+ L5 F1 | E% R
: t, }8 h5 H" b* M9 V; G6 B
- /**
4 ?" O7 `: a; |8 t# ?( U. N - * @brief ADC1 Initialization Function
) V& p4 d) I% L2 ] - * @param None
1 z) D- j7 P# j# b - * @retval None
; f1 r* z2 Q) u! I3 A9 y - */
6 r& V9 H' w4 ^9 L - static void MX_ADC1_Init(void)6 x3 D2 j2 F6 M( m# p
- {! u" A- N, W& \
6 [ ?# Q* v) i' v$ R: b- /* USER CODE BEGIN ADC1_Init 0 */
" _+ a( S2 k8 p - ' K8 d# w0 B3 K1 ]/ S1 `! _
- /* USER CODE END ADC1_Init 0 */8 S L5 ~7 o# m+ t* v- f
% L+ _! T4 M& u5 i/ X- ADC_ChannelConfTypeDef sConfig = {0};9 A' G2 U/ v" k9 c3 v
3 X2 C, P+ b g+ v B1 d- /* USER CODE BEGIN ADC1_Init 1 */
- I+ d" N1 C6 I# m. y0 k' ` - 3 ~) f _/ b% K1 t1 b
- /* USER CODE END ADC1_Init 1 */! F4 i; f1 I( B5 U& r
- /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
, c9 b* E. O& Y) J; c - */7 C( [4 o8 p6 U5 L
- hadc1.Instance = ADC1;
& V3 V0 l/ ?" ]& B ~3 K c - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;8 E1 u) j" f( ~
- hadc1.Init.Resolution = ADC_RESOLUTION_12B;) ~9 D, d5 _" o& q* B
- hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;0 e! U3 t! a7 ~& l
- hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;1 C' z2 [$ b6 z+ j P
- hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;0 l% s$ S6 Z) r) P! C" j# J
- hadc1.Init.LowPowerAutoWait = DISABLE;
' H: T* _$ P$ a: C5 [3 L! | - hadc1.Init.LowPowerAutoPowerOff = DISABLE;
- i# T; T- G/ d4 B: Z" f - hadc1.Init.ContinuousConvMode = ENABLE;. ~3 n( B# C) X& k% p
- hadc1.Init.NbrOfConversion = 2;
. t d, u+ y0 G* i: q+ l; E& O - hadc1.Init.DiscontinuousConvMode = DISABLE;! } R/ q2 k$ m
- hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- T+ S5 U0 n9 D - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;% b5 K! s# @4 h# H
- hadc1.Init.DMAContinuousRequests = ENABLE;
8 _& s. X! W/ f4 z. ]/ s# [ - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;0 G( H! m4 Z. H5 E
- hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;
6 y1 Y) `% y7 K! ^& @ - hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;
; Q. Z% i* v" {( G - hadc1.Init.OversamplingMode = DISABLE;
' x& m. e" u) K% |1 R" v) p - hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;' J1 a) _: W4 g* n( S
- if(HAL_ADC_Init(&hadc1) != HAL_OK)) q8 r% B5 ?& u% @& g! j
- {
" c0 g' ^# z# B" _& F2 } - Error_Handler();
]' I/ `, q5 m& L) Z, {1 t - }
9 z. N) ^3 m! K3 _0 _ - /** Configure Regular Channel
6 F- K) |( u) k' ^$ b - */1 s) ]7 f; }+ W+ J
- sConfig.Channel = ADC_CHANNEL_7;+ i1 A$ F9 L# i! s1 f: }
- sConfig.Rank = ADC_REGULAR_RANK_1;$ C% \6 U8 D/ X; h3 F
- sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;& M* Q8 v3 u- S
- if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+ L3 U+ K5 D; a& g3 m+ @8 _& i" } - {
; x* g5 W+ e2 Y - Error_Handler();
) c7 M. O* i$ |) S4 l - }
1 z$ [8 |+ G6 [& h; M0 m* F! S5 f - /** Configure Regular Channel
! {: `5 Q% `3 d - */3 O8 j+ s' d7 F. f3 }0 @/ Q' K7 H. H
- sConfig.Channel = ADC_CHANNEL_8;- w+ j, k7 o5 S9 H
- sConfig.Rank = ADC_REGULAR_RANK_2;! M6 ?# D% F! c0 L- S4 }+ |' S
- sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;3 ?( m& \. J. [
- if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
6 T+ y' r4 t8 p2 n - {
; W5 ]' c$ p* F2 y: \; | - Error_Handler();
$ X+ N# ^# C! E. o - }
. L: \$ W# Z$ b9 S; [ - /* USER CODE BEGIN ADC1_Init 2 */4 d3 l2 m4 \" A4 k
/ ]* J2 I J) X- \. y& M2 V- /* USER CODE END ADC1_Init 2 */
- B Z9 i* y! n4 U( g - & {& x, W# @6 [; y4 L' L/ v3 g
- }: D. `& y1 Q8 R& o! Q2 S& R {
7 t/ D) i6 w5 P) \/ L! X X0 x- /**
4 F0 @4 K( S1 w( C3 c - * @brief USART1 Initialization Function
: L9 o' S+ I4 z/ }" g9 L7 t - * @param None
- l+ G- `, t* y6 C' H; v - * @retval None
. x* d; C. C) k7 S7 h - */+ q+ F7 A: E0 X2 q( B( N1 c
- static void MX_USART1_UART_Init(void)
: z! K) B1 ~8 P - {
( I; [/ r: h2 j6 }. N9 ]& ^: b" |2 |
& d, l/ ?6 R% e: i+ _- /* USER CODE BEGIN USART1_Init 0 */5 J m4 X2 Q% \ X$ X' |
/ Q7 N/ R/ ^7 S6 ]& Z/ s- /* USER CODE END USART1_Init 0 */
1 n- z9 L& ~; a. x6 ~/ u' h5 y I
5 e" h8 S$ w- z2 C) g- /* USER CODE BEGIN USART1_Init 1 */) x- t. V! L8 n( ]
3 {. Q% D) z5 `4 B. M/ r- /* USER CODE END USART1_Init 1 */7 D9 z9 {! ?5 e# h0 S: j e
- huart1.Instance = USART1;
A/ W* M0 c2 [ [ - huart1.Init.BaudRate = 115200;5 a( h$ g0 t* A# n5 s6 X3 j
- huart1.Init.WordLength = UART_WORDLENGTH_8B;7 S0 E5 W5 Y: `% X
- huart1.Init.StopBits = UART_STOPBITS_1;
0 U! e5 i* w$ A3 @! y/ j) { - huart1.Init.Parity = UART_PARITY_NONE;
$ W' T' P. L8 r5 X% M$ ~$ R2 t - huart1.Init.Mode = UART_MODE_TX_RX;$ K) B8 B6 }- N/ D$ E
- huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;4 B7 w% `- o( z" @ G: A
- huart1.Init.OverSampling = UART_OVERSAMPLING_16;# @9 X* b7 H/ M" v# k. M
- huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
6 g) N% ]+ a9 s' j" g# u& O - huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;; {! c: d, h* _' f
- huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;: g: g% |5 v2 O) ^; l
- if(HAL_UART_Init(&huart1) != HAL_OK)8 o3 Y- J( X6 E8 d' ^! M- m( D
- {
4 D" [$ A; h! P/ d# j* G, X - Error_Handler();' p1 H3 f4 L6 q; O
- }. A% D5 j- G, C( Y: q
- if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
8 U/ f3 E* H& @. h6 f' H - {0 V) R3 b, u% N! z
- Error_Handler();$ O8 z. A7 Z! I% v$ W
- }+ K8 G! X/ _- H9 @. D
- if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK): n5 k) Y- R& W3 u4 O0 W8 s; h
- {) D: y6 T" @) Z K7 @' f
- Error_Handler();
& z3 n1 I0 {3 i9 F) P1 c& y - }
, `* q2 z9 K# |8 |4 S# q3 K - if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
# `" S I( @; W# d - {
/ o. @1 `; x! g - Error_Handler();
) X1 f/ `/ w7 B# c" H7 e - }4 m+ A( H0 }+ m+ e$ J$ [
- /* USER CODE BEGIN USART1_Init 2 */
/ J" Y! h: T7 _2 N - 7 Q, x0 ?7 I: i+ K, o! W* G/ A
- /* USER CODE END USART1_Init 2 */
% E7 p) Y; ]) L- U - ' M$ H$ O, v4 f* _) I4 M
- }
8 k1 Q) m p. A, _4 Q" @% a. _
' k& v3 e, U2 Q8 e) ^- /**/ w' n9 M; c/ z. J' U& s* i/ H
- * Enable DMA controller clock
Z& D1 C( B( F - */
) D7 U' B0 i) E) t8 @& r/ D - static void MX_DMA_Init(void)+ V+ i. F; U1 ]4 j" o) z* W' ]
- {
+ m; p7 e* W% [% P, W0 z( p; n6 Y8 H - 9 M) a% z" u! {- X# b1 i9 g9 d
- /* DMA controller clock enable */
( K5 f/ a# `4 z+ W+ v* F - __HAL_RCC_DMA1_CLK_ENABLE();/ I! Y i( ? Z. U: Q
0 }/ h6 {- l5 }6 v& w- /* DMA interrupt init */4 a: }+ o/ L7 ]; w9 x2 a7 ^
- /* DMA1_Channel1_IRQn interrupt configuration */0 y4 j+ F A U2 J" E( f9 w3 S
8 h& v; K% O# O- //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释
+ X0 { B8 x6 h( \0 v; X2 J - //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
' N* q1 D, D P! K* I$ m$ h - / { q8 g* b k# Z/ g& i& ^
- }! s; u0 }& j, t7 ?
, y6 L- u8 m% h' J$ j3 n: I2 ?- /**
% C7 t4 U( c) Q: a - * @brief GPIO Initialization Function4 u# q5 h2 V" |5 S* }% @
- * @param None" C: o" v; \7 Y* u. a* _
- * @retval None3 L& z9 z( V. U$ R; y+ F, s, V
- */
: j; \2 Z2 _$ N- s, y- s - static void MX_GPIO_Init(void)
4 I! @" A( E8 A" P5 u- e. `" o' D - {+ U; i" ~+ y, c8 z# R- j/ L
- ) g5 G, N& L8 {. C4 o- h! g' @" m. {
- /* GPIO Ports Clock Enable */
" V) y& C \5 b+ _ - __HAL_RCC_GPIOB_CLK_ENABLE();7 h( X1 J" I; l! c) f
- __HAL_RCC_GPIOA_CLK_ENABLE();
) ^; V8 _) L& a - ) Q9 ]% B3 T$ w8 G# L
- }
复制代码
7 b9 n6 l/ J4 R- ^) Q) G8 j' T% v0 s. }8 q- T7 s
3. 实验现象
& G u* {* @2 X, l编译并将程序下载到开发板中,连接串口助手并打开;
1 l4 {; f0 n0 l4 e; t: r6 k& M6 A实验现象:每秒打印一次当前两个通道的 ADC 值及换算后的电压./ p; @1 ]8 p0 q/ h: I
: q+ w/ I& `- }7 x+ ~
0 j; J/ j- ^8 i1 D% c |, H, t0 _+ u% A" M" d- [1 m; `
|