你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G070xx的flash分布如下图,打算将Page 63用于保存用户数据。

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
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 Y
20210129082956474.png
6 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 {
20210129083334250.png

, f7 Q! T3 F) F. I# W8 n# z" J& c: c" l2 |9 D
20210129083449121.png
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
20210129085309510.png
; ^' 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
2021012908370231.png
( [- 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
20210129083821567.png

/ {+ 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
  1. /* Includes ------------------------------------------------------------------*/
    , @% S. H0 g7 Z! x3 x  }
  2. #include "main.h"8 F4 x$ r, ?* M; W
  3. ; M# {& d' O" t" V# |% f$ d
  4. /* Private includes ----------------------------------------------------------*/
    , T+ ]$ Z( I! u7 p4 J' Y( D
  5. /* USER CODE BEGIN Includes */
    6 |+ M8 r4 Y* s0 _
  6. #include "stdio.h"/ a  j+ A1 y6 T0 {4 m" D
  7. /* USER CODE END Includes */* y1 C% P( \1 h9 m
  8. 1 k6 W. y% x2 V* u6 j
  9. /* Private typedef -----------------------------------------------------------*/4 e" @; t! m7 ^/ |! e# f2 o
  10. /* USER CODE BEGIN PTD */
    & I  }/ O) e* y- ~4 R3 C- ]0 q

  11. $ [) ]+ s6 l3 E7 c5 f/ Q  e/ t
  12. /* USER CODE END PTD */
      F, \) N. f3 m. }) S) }4 F

  13. 1 ]- n- V( A/ z+ C$ k+ Q# X  [
  14. /* Private define ------------------------------------------------------------*/. {* S6 v4 G9 O
  15. /* USER CODE BEGIN PD */
    ; Q; I5 G  w6 l* Q  ?
  16. /* USER CODE END PD */
    2 e( ?0 S0 M3 H+ \9 z' P- B
  17. 7 U; |+ I5 w5 H3 v9 z' {5 V, }
  18. /* Private macro -------------------------------------------------------------*/* T, @  k, `) R* [
  19. /* USER CODE BEGIN PM */: j  l: k4 i/ ^& _7 h* o
  20. * y7 \; }9 a9 R$ w3 q
  21. /* USER CODE END PM */
    % z, t* M; x3 c) j3 u
  22. 1 e: F6 w5 }4 A7 e; I% x. E
  23. /* Private variables ---------------------------------------------------------*/
    " x7 ~# Q: G( a, S
  24. ADC_HandleTypeDef hadc1;
    + ~$ B0 ?$ M  e8 W1 I! R
  25. DMA_HandleTypeDef hdma_adc1;
    " w3 ~; R: B1 P9 O: M7 b/ h2 N

  26. - Q3 ]6 `7 [( Y1 r! i1 l0 D
  27. UART_HandleTypeDef huart1;
    $ I1 q( J* m% S& N. p2 _, h
  28. 1 Q  i  h. F7 D6 ]" b
  29. /* USER CODE BEGIN PV */( [, n# {0 U& Z  ^; _  V
  30. 9 u& B5 _( S/ n) G- `+ |
  31. /* USER CODE END PV */
    * N' y$ U8 W4 y0 S

  32. 0 I- w0 _6 Z5 P- T( M: [2 \
  33. /* Private function prototypes -----------------------------------------------*/
    6 ]0 R, E% Y7 O% A( z2 {
  34. void SystemClock_Config(void);# G1 S0 [8 }6 H) n  t. o# E
  35. static void MX_GPIO_Init(void);
    3 j) E1 L: B+ L: ?
  36. static void MX_DMA_Init(void);
    % R' O( j  B3 E% A: [% Y+ P5 x# o' x
  37. static void MX_ADC1_Init(void);. p# R9 D- G  Q$ F$ ]/ I
  38. static void MX_USART1_UART_Init(void);% i& y/ ?" U. O* ]: Y
  39. /* USER CODE BEGIN PFP */
    5 d$ w3 t8 Y1 c- C1 O$ e  {
  40. ; N# V* f1 G; Z) M6 y# g4 ^
  41. /* USER CODE END PFP */
    . Y* G; ]! h5 S" A# i- z

  42. 3 m4 H6 i4 q5 p5 ?' i6 C# _$ {- t
  43. /* Private user code ---------------------------------------------------------*/
    : `- y) Z+ H4 o% Q
  44. /* USER CODE BEGIN 0 */, x/ D; ~# d# S1 L; t& R
  45. __IO uint16_t adcCovValueBuff[30][2] = {0};        //存放ADC的值 2通道  每个通道存放30个值,由DMA循环写入
    5 m5 B+ n" Y6 l0 A5 K2 [. ?+ A( D
  46. uint16_t adcAverageBuff[2] = {0};        //对每个通道30个ADC值取平均值6 a5 U2 U% J% s* V9 f

  47. 1 Z8 |2 ?+ e! q  V
  48. 2 D& k6 N' ?/ L& c! {
  49. #ifdef __GNUC_; D6 T; n2 \& t7 t* D% c. ^
  50. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)% P3 n! Y3 J& t6 x8 [! G& v4 E" g: Y
  51. #else. t  S9 a8 a1 I. |( d$ U
  52. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    - h# O+ ?, O) l- B3 ^/ V$ t: a
  53. #endif8 m7 a: {# s& ~- W8 T# H) [! k
  54. PUTCHAR_PROTOTYPE" @5 ]3 Q+ \( z# n( l
  55. {$ ]1 a; g0 k- `, U1 H# z0 M
  56.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    0 `0 ?+ n) M/ J* e
  57. 4 }* y; W: N9 @* T) x0 b; j
  58.     return ch;/ F; q* `; f$ l4 n( G2 U9 a2 Z
  59. }4 }- i! ^- |/ _- F( p5 f

  60. $ B; P$ ?$ t. h
  61. /* 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
  1. /**$ s2 R# Q4 C7 V4 m9 f: {9 K; Y+ {
  2.   * @brief  The application entry point.
    * i" |# |6 j* J7 I6 p" s* T5 V
  3.   * @retval int
    1 k/ r+ e3 J1 W' Y( `5 A+ Y4 }: L  N
  4.   */
    * G- S7 @- W$ s; v( Q) W
  5. int main(void)
    / G. i2 F1 f+ _3 A8 B) J  y
  6. {; [9 ~! J. \+ d9 B
  7.     /* USER CODE BEGIN 1 */+ m: D$ `, x6 E( T
  8.     float votage = 0;
    5 U% C/ v/ n3 z* Z1 S1 t; A
  9.     uint32_t sum = 0;$ ~. d' M2 G# }% J1 Q
  10.     /* USER CODE END 1 */
    / p8 i6 R8 F8 A1 }* r/ r  _* c6 h4 z

  11. 5 h; z/ x! l5 ^) S2 |3 f7 r! R
  12.     /* MCU Configuration--------------------------------------------------------*/  L( D, E/ w' D  o& \7 ^

  13. 0 z9 T0 t3 I' ~# u! P& m  B6 R
  14.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */9 g7 n, `6 L% b% b0 i/ }
  15.     HAL_Init();
    - H, v: h8 J0 [1 q- R1 l  P. ~1 |

  16. 7 V: {- n3 m9 E! G/ \# H
  17.     /* USER CODE BEGIN Init */
    ; N" X  i  S5 E) ^/ d8 s
  18. 5 o0 I  N0 {) ]5 ^6 d3 |( D
  19.     /* USER CODE END Init */$ o8 T- i2 B$ A7 r" _
  20. 3 ?& h" l5 `- D( `9 a" c& ?! W5 _
  21.     /* Configure the system clock */5 J; A8 \2 R6 H9 I: g- R+ v
  22.     SystemClock_Config();
    4 s% o( p4 d! R  C! L/ @2 w$ G4 p

  23. - P( x/ s( Y2 A. a1 m& c5 \
  24.     /* USER CODE BEGIN SysInit */
    ) r. K2 v6 f: H; j1 [9 n6 m9 m

  25. ! \% V1 K8 i( s$ y) Y2 Z" X. x3 m
  26.     /* USER CODE END SysInit */# j( X1 i; s. |/ k2 S8 }0 R

  27. , z0 v( J- T2 X: i" a+ N
  28.     /* Initialize all configured peripherals */; E* R$ h1 M6 l4 ]( N2 m+ Q' n( [2 z
  29.     MX_GPIO_Init();4 |0 f$ ^+ Y7 s. ?1 B
  30.     MX_DMA_Init();
    8 }2 N7 e0 u8 P) X/ a  j
  31.     MX_ADC1_Init();
    ' @' x0 J" \, X/ b7 Q
  32.     MX_USART1_UART_Init();
    " T  c. v4 X- C" y* L
  33.     /* USER CODE BEGIN 2 */9 I2 t! U: i( C# J. i; Z
  34.     printf("stm32g030f6 adc demo...... \n");
    8 f5 z( a5 q; r% v. W2 ~
  35.     HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);
    5 Q  ^  C( N* X) p. F
  36.     /* USER CODE END 2 */- Z! ]$ H- f! n* `9 T9 O/ J% _9 l, J
  37. " Y. ~+ x, |& ]6 [: D, G- z; p
  38.     /* Infinite loop */
    1 c0 O; V$ M4 U9 ?4 O* q' I8 `& z
  39.     /* USER CODE BEGIN WHILE */: ^& ]4 \! [& B+ _1 C5 w: n* L% n
  40.     while(1)
    - N( q- f3 g+ R& S9 W' {4 {
  41.     {
    8 A4 m) G6 V# W. B" @, j- _
  42.         for(uint8_t i = 0; i < 2; i++)8 C( Z; H8 q* |' g4 E( O* B+ k
  43.         {
    7 r9 \# h! ~0 N7 g
  44.             for(uint8_t count = 0; count < 30; count++)8 [4 Z& ~7 N! n. Q
  45.             {
    ) C" B8 O2 v9 v# f4 W, Q
  46.                 sum += adcCovValueBuff[count];8 b3 h+ G1 i' H$ E0 G
  47.             }
    # t4 f2 F1 P1 @; {: R- ?9 Y
  48.             adcAverageBuff = sum / 30;: L/ [& Q. h# F  i+ V! z
  49.             sum = 0;9 y& r% {' v1 Y( W" ?9 L
  50.         }+ D/ y" w$ V6 s! {

  51. , D( G9 a: f8 w0 p
  52.         printf("---------------------------------------- \n");
      M; O+ {4 D1 W1 J6 C" }
  53.         printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);3 R9 a/ T, ?9 J
  54.         votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;, |: g! V/ r3 v- {8 h
  55.         printf("ADC Channel01 Voltage:%f V \n", votage);
    ' D$ k. w9 R5 c" c  H
  56.         printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);
    ; a5 u) S  e5 j# V- O4 W0 N9 O
  57.         votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;$ Z# e# `/ [9 u! ]0 L! x
  58.         printf("ADC Channel02 Voltage:%f V \n", votage);) S6 D3 {6 M# f2 L
  59.         printf("---------------------------------------- \n");
    8 o& C. d% M4 K/ R6 y& `1 Z
  60.         HAL_Delay(1000);
    & ?: A* E  u1 o& V+ k
  61.         /* USER CODE END WHILE */
    $ q7 N6 J, F6 A& e& ?' m

  62. / R3 Q2 A, J3 |' h
  63.         /* USER CODE BEGIN 3 */
    3 r9 v1 k& F1 m+ k% X" {+ ~
  64.     }1 G/ g/ [0 E; |' L% @. d. S/ I
  65.     /* USER CODE END 3 */
    - @7 u) i0 H- y+ W7 t0 q# w& w
  66. }
复制代码

: 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
  1. /**
    4 ?" O7 `: a; |8 t# ?( U. N
  2.   * @brief ADC1 Initialization Function
    ) V& p4 d) I% L2 ]
  3.   * @param None
    1 z) D- j7 P# j# b
  4.   * @retval None
    ; f1 r* z2 Q) u! I3 A9 y
  5.   */
    6 r& V9 H' w4 ^9 L
  6. static void MX_ADC1_Init(void)6 x3 D2 j2 F6 M( m# p
  7. {! u" A- N, W& \

  8. 6 [  ?# Q* v) i' v$ R: b
  9.     /* USER CODE BEGIN ADC1_Init 0 */
    " _+ a( S2 k8 p
  10. ' K8 d# w0 B3 K1 ]/ S1 `! _
  11.     /* USER CODE END ADC1_Init 0 */8 S  L5 ~7 o# m+ t* v- f

  12. % L+ _! T4 M& u5 i/ X
  13.     ADC_ChannelConfTypeDef sConfig = {0};9 A' G2 U/ v" k9 c3 v

  14. 3 X2 C, P+ b  g+ v  B1 d
  15.     /* USER CODE BEGIN ADC1_Init 1 */
    - I+ d" N1 C6 I# m. y0 k' `
  16. 3 ~) f  _/ b% K1 t1 b
  17.     /* USER CODE END ADC1_Init 1 */! F4 i; f1 I( B5 U& r
  18.     /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
    , c9 b* E. O& Y) J; c
  19.     */7 C( [4 o8 p6 U5 L
  20.     hadc1.Instance = ADC1;
    & V3 V0 l/ ?" ]& B  ~3 K  c
  21.     hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;8 E1 u) j" f( ~
  22.     hadc1.Init.Resolution = ADC_RESOLUTION_12B;) ~9 D, d5 _" o& q* B
  23.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;0 e! U3 t! a7 ~& l
  24.     hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;1 C' z2 [$ b6 z+ j  P
  25.     hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;0 l% s$ S6 Z) r) P! C" j# J
  26.     hadc1.Init.LowPowerAutoWait = DISABLE;
    ' H: T* _$ P$ a: C5 [3 L! |
  27.     hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    - i# T; T- G/ d4 B: Z" f
  28.     hadc1.Init.ContinuousConvMode = ENABLE;. ~3 n( B# C) X& k% p
  29.     hadc1.Init.NbrOfConversion = 2;
    . t  d, u+ y0 G* i: q+ l; E& O
  30.     hadc1.Init.DiscontinuousConvMode = DISABLE;! }  R/ q2 k$ m
  31.     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    - T+ S5 U0 n9 D
  32.     hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;% b5 K! s# @4 h# H
  33.     hadc1.Init.DMAContinuousRequests = ENABLE;
    8 _& s. X! W/ f4 z. ]/ s# [
  34.     hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;0 G( H! m4 Z. H5 E
  35.     hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;
    6 y1 Y) `% y7 K! ^& @
  36.     hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;
    ; Q. Z% i* v" {( G
  37.     hadc1.Init.OversamplingMode = DISABLE;
    ' x& m. e" u) K% |1 R" v) p
  38.     hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;' J1 a) _: W4 g* n( S
  39.     if(HAL_ADC_Init(&hadc1) != HAL_OK)) q8 r% B5 ?& u% @& g! j
  40.     {
    " c0 g' ^# z# B" _& F2 }
  41.         Error_Handler();
      ]' I/ `, q5 m& L) Z, {1 t
  42.     }
    9 z. N) ^3 m! K3 _0 _
  43.     /** Configure Regular Channel
    6 F- K) |( u) k' ^$ b
  44.     */1 s) ]7 f; }+ W+ J
  45.     sConfig.Channel = ADC_CHANNEL_7;+ i1 A$ F9 L# i! s1 f: }
  46.     sConfig.Rank = ADC_REGULAR_RANK_1;$ C% \6 U8 D/ X; h3 F
  47.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;& M* Q8 v3 u- S
  48.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    + L3 U+ K5 D; a& g3 m+ @8 _& i" }
  49.     {
    ; x* g5 W+ e2 Y
  50.         Error_Handler();
    ) c7 M. O* i$ |) S4 l
  51.     }
    1 z$ [8 |+ G6 [& h; M0 m* F! S5 f
  52.     /** Configure Regular Channel
    ! {: `5 Q% `3 d
  53.     */3 O8 j+ s' d7 F. f3 }0 @/ Q' K7 H. H
  54.     sConfig.Channel = ADC_CHANNEL_8;- w+ j, k7 o5 S9 H
  55.     sConfig.Rank = ADC_REGULAR_RANK_2;! M6 ?# D% F! c0 L- S4 }+ |' S
  56.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;3 ?( m& \. J. [
  57.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    6 T+ y' r4 t8 p2 n
  58.     {
    ; W5 ]' c$ p* F2 y: \; |
  59.         Error_Handler();
    $ X+ N# ^# C! E. o
  60.     }
    . L: \$ W# Z$ b9 S; [
  61.     /* USER CODE BEGIN ADC1_Init 2 */4 d3 l2 m4 \" A4 k

  62. / ]* J2 I  J) X- \. y& M2 V
  63.     /* USER CODE END ADC1_Init 2 */
    - B  Z9 i* y! n4 U( g
  64. & {& x, W# @6 [; y4 L' L/ v3 g
  65. }: D. `& y1 Q8 R& o! Q2 S& R  {

  66. 7 t/ D) i6 w5 P) \/ L! X  X0 x
  67. /**
    4 F0 @4 K( S1 w( C3 c
  68.   * @brief USART1 Initialization Function
    : L9 o' S+ I4 z/ }" g9 L7 t
  69.   * @param None
    - l+ G- `, t* y6 C' H; v
  70.   * @retval None
    . x* d; C. C) k7 S7 h
  71.   */+ q+ F7 A: E0 X2 q( B( N1 c
  72. static void MX_USART1_UART_Init(void)
    : z! K) B1 ~8 P
  73. {
    ( I; [/ r: h2 j6 }. N9 ]& ^: b" |2 |

  74. & d, l/ ?6 R% e: i+ _
  75.     /* USER CODE BEGIN USART1_Init 0 */5 J  m4 X2 Q% \  X$ X' |

  76. / Q7 N/ R/ ^7 S6 ]& Z/ s
  77.     /* USER CODE END USART1_Init 0 */
    1 n- z9 L& ~; a. x6 ~/ u' h5 y  I

  78. 5 e" h8 S$ w- z2 C) g
  79.     /* USER CODE BEGIN USART1_Init 1 */) x- t. V! L8 n( ]

  80. 3 {. Q% D) z5 `4 B. M/ r
  81.     /* USER CODE END USART1_Init 1 */7 D9 z9 {! ?5 e# h0 S: j  e
  82.     huart1.Instance = USART1;
      A/ W* M0 c2 [  [
  83.     huart1.Init.BaudRate = 115200;5 a( h$ g0 t* A# n5 s6 X3 j
  84.     huart1.Init.WordLength = UART_WORDLENGTH_8B;7 S0 E5 W5 Y: `% X
  85.     huart1.Init.StopBits = UART_STOPBITS_1;
    0 U! e5 i* w$ A3 @! y/ j) {
  86.     huart1.Init.Parity = UART_PARITY_NONE;
    $ W' T' P. L8 r5 X% M$ ~$ R2 t
  87.     huart1.Init.Mode = UART_MODE_TX_RX;$ K) B8 B6 }- N/ D$ E
  88.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;4 B7 w% `- o( z" @  G: A
  89.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;# @9 X* b7 H/ M" v# k. M
  90.     huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    6 g) N% ]+ a9 s' j" g# u& O
  91.     huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;; {! c: d, h* _' f
  92.     huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;: g: g% |5 v2 O) ^; l
  93.     if(HAL_UART_Init(&huart1) != HAL_OK)8 o3 Y- J( X6 E8 d' ^! M- m( D
  94.     {
    4 D" [$ A; h! P/ d# j* G, X
  95.         Error_Handler();' p1 H3 f4 L6 q; O
  96.     }. A% D5 j- G, C( Y: q
  97.     if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
    8 U/ f3 E* H& @. h6 f' H
  98.     {0 V) R3 b, u% N! z
  99.         Error_Handler();$ O8 z. A7 Z! I% v$ W
  100.     }+ K8 G! X/ _- H9 @. D
  101.     if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK): n5 k) Y- R& W3 u4 O0 W8 s; h
  102.     {) D: y6 T" @) Z  K7 @' f
  103.         Error_Handler();
    & z3 n1 I0 {3 i9 F) P1 c& y
  104.     }
    , `* q2 z9 K# |8 |4 S# q3 K
  105.     if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
    # `" S  I( @; W# d
  106.     {
    / o. @1 `; x! g
  107.         Error_Handler();
    ) X1 f/ `/ w7 B# c" H7 e
  108.     }4 m+ A( H0 }+ m+ e$ J$ [
  109.     /* USER CODE BEGIN USART1_Init 2 */
    / J" Y! h: T7 _2 N
  110. 7 Q, x0 ?7 I: i+ K, o! W* G/ A
  111.     /* USER CODE END USART1_Init 2 */
    % E7 p) Y; ]) L- U
  112. ' M$ H$ O, v4 f* _) I4 M
  113. }
    8 k1 Q) m  p. A, _4 Q" @% a. _

  114. ' k& v3 e, U2 Q8 e) ^
  115. /**/ w' n9 M; c/ z. J' U& s* i/ H
  116.   * Enable DMA controller clock
      Z& D1 C( B( F
  117.   */
    ) D7 U' B0 i) E) t8 @& r/ D
  118. static void MX_DMA_Init(void)+ V+ i. F; U1 ]4 j" o) z* W' ]
  119. {
    + m; p7 e* W% [% P, W0 z( p; n6 Y8 H
  120. 9 M) a% z" u! {- X# b1 i9 g9 d
  121.     /* DMA controller clock enable */
    ( K5 f/ a# `4 z+ W+ v* F
  122.     __HAL_RCC_DMA1_CLK_ENABLE();/ I! Y  i( ?  Z. U: Q

  123. 0 }/ h6 {- l5 }6 v& w
  124.     /* DMA interrupt init */4 a: }+ o/ L7 ]; w9 x2 a7 ^
  125.     /* DMA1_Channel1_IRQn interrupt configuration */0 y4 j+ F  A  U2 J" E( f9 w3 S

  126. 8 h& v; K% O# O
  127.     //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释 
    + X0 {  B8 x6 h( \0 v; X2 J
  128.     //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    ' N* q1 D, D  P! K* I$ m$ h
  129. / {  q8 g* b  k# Z/ g& i& ^
  130. }! s; u0 }& j, t7 ?

  131. , y6 L- u8 m% h' J$ j3 n: I2 ?
  132. /**
    % C7 t4 U( c) Q: a
  133.   * @brief GPIO Initialization Function4 u# q5 h2 V" |5 S* }% @
  134.   * @param None" C: o" v; \7 Y* u. a* _
  135.   * @retval None3 L& z9 z( V. U$ R; y+ F, s, V
  136.   */
    : j; \2 Z2 _$ N- s, y- s
  137. static void MX_GPIO_Init(void)
    4 I! @" A( E8 A" P5 u- e. `" o' D
  138. {+ U; i" ~+ y, c8 z# R- j/ L
  139. ) g5 G, N& L8 {. C4 o- h! g' @" m. {
  140.     /* GPIO Ports Clock Enable */
    " V) y& C  \5 b+ _
  141.     __HAL_RCC_GPIOB_CLK_ENABLE();7 h( X1 J" I; l! c) f
  142.     __HAL_RCC_GPIOA_CLK_ENABLE();
    ) ^; V8 _) L& a
  143. ) Q9 ]% B3 T$ w8 G# L
  144. }
复制代码

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
2021012908502456.png
  |, H, t0 _+ u% A" M" d- [1 m; `
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版