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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1. 使用 CubeMx 创建 ADC 工程
& n! s# d! ]$ E+ s& Z4 d打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
; n% V1 c5 F* D+ i  X4 \8 ^3 S& e1 V6 W) r% [6 u
先配置一下串口,用来打印相关信息
. Y; Q& R" B9 j9 j2 n# Z1 Y7 Q9 M& F+ {
20210129082956474.png
, q1 P6 ?- J4 `6 C8 T

9 R/ Z8 _" V( H: A+ ?6 l再来配置 ADC6 V  k0 w& X. d
: H; o- G6 i1 L7 c
20210129083334250.png

6 v+ Y1 j" J! n& A, ]2 \
( L, k& D. S& g7 r9 J% X; V0 R
20210129083449121.png
% N7 \- N; h" D

. N9 a& [8 w3 C" O' f配置DMA
. `1 t  u' M9 W) h; d
20210129085309510.png
7 g& E. ~/ J& I1 N; O" C, V

' u. G) d) a/ |, @! lPS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数.
' o4 f, j- L* O, O& Y- I! _# C
, D, ^# q. n( F, u配置时钟: z9 E; B; A! e' [
& z1 L( h5 S  y4 K7 i: K9 Q/ `3 |
2021012908370231.png

* l- L3 O/ u9 L- Q
' i! h# W1 S0 U: Z) ^ps:本实验使用内部高速时钟,未使用外部晶振,主频设置为最大的64MHZ.
* j/ \$ l% ]+ U2 Q* R
) A1 f9 [0 Q& {8 F" j9 @配置工程相关选项; }. ^* z% j5 L) m% m
) }* m4 `8 J, d% A/ U
20210129083821567.png
, q2 B) R$ m' Z( _4 B6 J. x+ z1 c

' Y  M4 U8 Y* e配置完成后点击右上角 GENERATE CODE完成工程的创建( ]% B% Z6 K, \: \% V5 r

4 b$ r1 r, x( M- X* e2. 编程
( Q! E' F  f9 C; }( N0 D6 k( i2.1 串口相关的代码) P2 C. w0 j2 d/ q# p
因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
# g$ s* @8 m( o1 _8 l8 \1 d3 r( X9 w
  1. /* Includes ------------------------------------------------------------------*/
    1 h' T6 s9 @/ W' a3 c) R3 `
  2. #include "main.h"
      R8 w8 i  b5 Y! y5 N% C
  3. + T  b9 E4 ^9 n' C7 @
  4. /* Private includes ----------------------------------------------------------*// A/ i; A) U  g" m$ h" P
  5. /* USER CODE BEGIN Includes */8 ]8 |6 @/ J$ ^1 ~" T8 e
  6. #include "stdio.h"2 i, p2 S  S. K) k
  7. /* USER CODE END Includes */
      Z* {7 `4 d( b, k# Q

  8. 9 \$ D0 l+ w4 g6 n0 V
  9. /* Private typedef -----------------------------------------------------------*/1 n3 o' W- S: ]" I) \
  10. /* USER CODE BEGIN PTD */, E; E) y: u6 @4 i$ O- u8 U( B

  11. ' X" X4 N- ~, f- t3 @
  12. /* USER CODE END PTD */
    5 o/ _7 ]4 j/ z6 {( Q

  13. / W8 o4 v( Q  W8 d
  14. /* Private define ------------------------------------------------------------*/, x/ C7 D2 p. j6 `
  15. /* USER CODE BEGIN PD */' @; V7 I% b; |0 E/ `# p; V# a+ j
  16. /* USER CODE END PD */
    % ?3 r/ R! g9 S5 E: w* P  `/ x8 S

  17. ) k+ H. d# A4 N- s# I4 r
  18. /* Private macro -------------------------------------------------------------*/
    & e; s" r+ b3 v$ Q* H1 j
  19. /* USER CODE BEGIN PM */
    & s5 e4 |" x( u; Z7 t2 |0 X
  20. 8 D8 s; l: Y1 }. L
  21. /* USER CODE END PM */
    , I6 r- C( v% c. \. B7 x# f
  22. : Q( O8 M8 l2 c7 z2 r3 W1 T
  23. /* Private variables ---------------------------------------------------------*/
    , y) A6 j8 {* |2 E- h
  24. ADC_HandleTypeDef hadc1;
    3 \# A* R/ \2 t* S8 K4 K
  25. DMA_HandleTypeDef hdma_adc1;* {3 \& r8 u" U: u, }
  26. 1 G/ E5 w( F: |1 i; C
  27. UART_HandleTypeDef huart1;9 c. }7 O: D) k, U  ?5 }; o
  28. ! P$ i" w, k- y! h# g
  29. /* USER CODE BEGIN PV */0 i' M( d& B7 R7 a. @8 I
  30. 9 U% I. c4 q. x8 o7 t
  31. /* USER CODE END PV */
    2 a) m/ y. R) u1 a

  32. 9 z! z6 z+ }3 L7 ^8 c9 z5 p0 [
  33. /* Private function prototypes -----------------------------------------------*/" Q; b) {- y. G
  34. void SystemClock_Config(void);4 {; ]: F; s! V& Q  f
  35. static void MX_GPIO_Init(void);! B) f/ F1 m7 o0 i
  36. static void MX_DMA_Init(void);
    $ [1 B( S& q0 M8 M
  37. static void MX_ADC1_Init(void);
    - c- J+ @$ p% @8 U; S
  38. static void MX_USART1_UART_Init(void);
    : {% H- m) B9 c, i* r5 i0 ~, Z. w
  39. /* USER CODE BEGIN PFP */
    " s* `( y% c9 R1 I: z- o

  40. - D9 Q' Z1 z3 }3 ?
  41. /* USER CODE END PFP */8 }" U7 H' K4 Q; r% j& m7 f

  42. / }* ]* y* C+ @$ i& s& U' P. l- r
  43. /* Private user code ---------------------------------------------------------*/$ h5 R! j/ e' ~0 V9 C3 m5 P) ^
  44. /* USER CODE BEGIN 0 */0 B4 {# i& v6 T9 M4 v# o
  45. __IO uint16_t adcCovValueBuff[30][2] = {0};        //存放ADC的值 2通道  每个通道存放30个值,由DMA循环写入
    7 Z5 u" T) X" G4 ^" U4 w8 e8 r8 i6 U6 P
  46. uint16_t adcAverageBuff[2] = {0};        //对每个通道30个ADC值取平均值- W+ `) K, C2 U7 z6 `1 n+ A/ |. F

  47.   \. N& i; I: N1 m. x
  48. 6 G: J: J9 n5 I, t1 N
  49. #ifdef __GNUC_
    : p9 W& r2 d* p
  50. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)% `  N* Z1 {% `) R4 P3 Z/ p
  51. #else
    ; Y; E4 ^) Z! t* W6 M5 F
  52. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)# r, D" E7 V# W+ t9 Q
  53. #endif. E9 {# \# e! f. C1 q
  54. PUTCHAR_PROTOTYPE
    6 H& B: I$ ?( h) A$ j. d( v7 |
  55. {) [+ e( h& ~8 Q1 i( s4 Y
  56.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    9 _( w+ Y. U; M+ i

  57. ' A( e0 \# @9 Y) s/ z
  58.     return ch;
    & d1 T* u9 m* G: T, l8 p4 Q3 B' k
  59. }
    . `! p9 n  ?) h- M% K( w
  60. 2 {* Z, ?9 M$ `
  61. /* USER CODE END 0 */
复制代码

! E5 u2 W& ~' E, B9 x5 E/ U9 z7 l
1 n& ^  h8 l2 H! n9 g0 j5 S1 x8 j+ L2.2 main 函数
% o8 u! `2 a. w$ E8 |
  1. /**
    6 G8 u* {, T7 C9 N$ j( y% j
  2.   * @brief  The application entry point.
    " O: [2 e  Z$ O' b( t
  3.   * @retval int
    : V8 \3 `8 Y" f* ^( R
  4.   */! G: I1 z: h9 t* R& R
  5. int main(void)
    . {  B$ A) b5 ?, S# z' d
  6. {% e* r- Z# R7 u& W+ ^
  7.     /* USER CODE BEGIN 1 */& @  U, P7 H9 s9 G* o
  8.     float votage = 0;7 }/ C* R* q7 ]% g# b: w
  9.     uint32_t sum = 0;- Y% N0 d4 X# R+ ?) T
  10.     /* USER CODE END 1 */% }' g* j( ?8 q/ Z1 Q6 N7 V

  11. " M& |# e' [! M) y( D+ d9 b
  12.     /* MCU Configuration--------------------------------------------------------*/$ b5 k0 {) w/ }$ P8 v: @

  13. 4 B7 _4 h' ?& L
  14.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    2 R# S0 _9 g, m7 z) }$ ^, Q( s0 g
  15.     HAL_Init();. D" O4 B; Q5 K3 _/ G
  16. + X9 s. ]- T. h5 g* J
  17.     /* USER CODE BEGIN Init */
    8 J+ U5 m$ W# i; u8 i
  18. 8 d" \2 u$ U" p, c3 q9 r
  19.     /* USER CODE END Init */! P, G. a1 `( c3 O5 C6 i$ ?
  20. * V# }3 ~2 j: `9 {" ~8 i
  21.     /* Configure the system clock */7 z% S  v: \. R+ x5 ~  t
  22.     SystemClock_Config();- h7 O5 p8 ]9 j+ c# I
  23. 8 F0 e; a3 h; A
  24.     /* USER CODE BEGIN SysInit */" p; I0 S- h. F# a  n

  25. ' b: y' b( J6 o1 N0 n  @6 `
  26.     /* USER CODE END SysInit */
    ) D; z- e" w, h4 t* y; v

  27. 7 [8 \4 n% `& I7 \
  28.     /* Initialize all configured peripherals */1 o  v/ [6 @7 i2 V& g
  29.     MX_GPIO_Init();3 v: y4 A9 C1 O
  30.     MX_DMA_Init();
    3 c+ o' t+ x" [' ]$ r+ o
  31.     MX_ADC1_Init();
    + y- @  C$ k- p  O4 k
  32.     MX_USART1_UART_Init();
    : m: Y+ c$ y/ c* U9 V
  33.     /* USER CODE BEGIN 2 */
    9 J" ]( I: S5 R) y5 M( j
  34.     printf("stm32g030f6 adc demo...... \n");: t* A9 g- D/ T
  35.     HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);! l9 W6 a5 N) Y4 i0 T
  36.     /* USER CODE END 2 */
    / p) K' @& `0 G2 @1 E7 R$ m
  37. % s, R0 U9 m. X, g
  38.     /* Infinite loop */! W' d  {( \! [/ F; D1 I: [
  39.     /* USER CODE BEGIN WHILE *// J- _. R- x/ a; ^6 u
  40.     while(1)
    : L( b  L' S' M/ Q' i( E. `7 y
  41.     {
    : I4 U  O2 }) B, M: X- T4 N* V
  42.         for(uint8_t i = 0; i < 2; i++): G; k7 \5 X, M- n+ V8 ]( N
  43.         {4 h, M4 G  @- o/ x0 G- G
  44.             for(uint8_t count = 0; count < 30; count++)! l; g* B4 \2 q, {7 [% {( I6 t9 h( _
  45.             {
    / k: B! P- v. M
  46.                 sum += adcCovValueBuff[count];+ o: I) R' [" ]. z
  47.             }
    9 ~  v, d. [) p8 I
  48.             adcAverageBuff = sum / 30;
    + o3 b; @  ^' u# |: C7 z
  49.             sum = 0;
    ; [& {% J+ S& m, _/ f
  50.         }. N( ^( y1 W6 V; L. J7 a
  51. & b4 ^' N% O  V: v# n( b$ b
  52.         printf("---------------------------------------- \n");
    7 Z6 P' B/ J1 a5 S
  53.         printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);
    3 H# ~8 Y( W2 h  }! y. `0 a3 v* c
  54.         votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;( G" @/ l- c0 I4 X' n
  55.         printf("ADC Channel01 Voltage:%f V \n", votage);
    . [1 f9 k6 d3 @4 c$ N9 n; G
  56.         printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);) p+ @' A3 o$ c9 y
  57.         votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;
    9 L- _  `$ f6 d" K8 O( ]/ j  U
  58.         printf("ADC Channel02 Voltage:%f V \n", votage);
    3 h- u. a2 {' t( ~- c5 `2 P
  59.         printf("---------------------------------------- \n");
    5 s/ N% c- O- G1 b. w
  60.         HAL_Delay(1000);' {+ D6 j6 L0 [9 F
  61.         /* USER CODE END WHILE */
    8 a, ]& N. j% i) w( h5 |# Y

  62. $ Z1 C3 [2 c. M! Q- B
  63.         /* USER CODE BEGIN 3 */
    / r, x& ?$ N$ P! _: }7 L# W4 `
  64.     }
    4 E. K$ ^  ^( r( ^# X4 w- a: O
  65.     /* USER CODE END 3 */$ Y- F3 t5 d! R8 R' b
  66. }
复制代码
. C+ ~9 |% ^  C& }+ `
2.3 外设的初始化函数& B( p+ X; }! L& e
外设的初始化函数都是由 CubeMx 生成的,因为我们只用 DMA 搬运数据,未使用 DMA 的中断功能,故初始化 DMA 时可将中断配置函数注释。
1 p6 B6 f! f* i) m% J; o( G( n2 t7 K& s- ?
  1. /**
    . w& d+ C& M/ |+ G, n$ u
  2.   * @brief ADC1 Initialization Function; g+ L- W5 z  h
  3.   * @param None
    + i- `- z( V  i8 Q4 R, j$ Y, ]
  4.   * @retval None$ }  \9 F0 @% `3 s7 X7 q" q
  5.   */
    2 I% M" p5 x$ v- L
  6. static void MX_ADC1_Init(void)* }( a2 }6 K) c* L. Q7 }* Z$ m  l& |
  7. {
    % V$ Q$ x; d" n' g9 Q
  8. * p3 n, _# d; i1 [7 J& S7 I
  9.     /* USER CODE BEGIN ADC1_Init 0 */4 \7 a9 F3 A1 X# g1 g5 i9 W) H* o
  10. ) N' g# E" e  T- v# I) B+ J/ T0 k
  11.     /* USER CODE END ADC1_Init 0 */
    8 s! D/ F" h1 B6 A; a1 e+ }
  12. & w$ G- m8 D( X; v$ p7 E$ q
  13.     ADC_ChannelConfTypeDef sConfig = {0};& ?/ ?" I/ H2 l  r; a

  14. % s1 g, ?. x5 s/ ^# B
  15.     /* USER CODE BEGIN ADC1_Init 1 */& @: v  g7 Z2 D* ?1 g

  16. 5 @' l  ~% x5 x7 h% M
  17.     /* USER CODE END ADC1_Init 1 */
    & C+ M  B3 K( {2 R/ F! d6 Z; O6 n
  18.     /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
      b1 x8 V, `( Q- K
  19.     */
    % J+ M6 U0 ^6 m) A5 K
  20.     hadc1.Instance = ADC1;
    % M; f1 \$ X, x4 Q; E& r8 D
  21.     hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
    ( `$ C6 ~0 H0 f, @4 h8 c$ R
  22.     hadc1.Init.Resolution = ADC_RESOLUTION_12B;
      c/ v7 }+ E, K) Y! o! _! x
  23.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;9 c! L* T" q2 F# g3 `4 B4 O
  24.     hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
    ; n: ?  K5 Y. _
  25.     hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;- H: i0 _# S+ g1 d! ?. s
  26.     hadc1.Init.LowPowerAutoWait = DISABLE;1 Z! X$ T2 `# e) M+ j0 e0 ?
  27.     hadc1.Init.LowPowerAutoPowerOff = DISABLE;
    ! f% I6 x- D8 G2 p! p  \! W
  28.     hadc1.Init.ContinuousConvMode = ENABLE;2 m2 w1 E, b+ Q8 W9 {
  29.     hadc1.Init.NbrOfConversion = 2;  [% |5 W+ b+ S& |
  30.     hadc1.Init.DiscontinuousConvMode = DISABLE;
    + P$ c  g! Y/ w. E0 S0 j  T
  31.     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;% J% s- x( ?9 I8 F& e3 i; D1 H9 {
  32.     hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    7 d2 O, E' @2 d1 A8 \$ S
  33.     hadc1.Init.DMAContinuousRequests = ENABLE;
    ( ?% G) O3 b; y7 `
  34.     hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;9 K( g' N& d9 x" w& R! }: r3 d
  35.     hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;4 ^5 y, P0 X& S9 z  C
  36.     hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;# I" O7 Q: M- D8 w0 X
  37.     hadc1.Init.OversamplingMode = DISABLE;
    ' r- f! j. `  p" d5 V
  38.     hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;8 w, Z6 B6 u, `) v- ]
  39.     if(HAL_ADC_Init(&hadc1) != HAL_OK)5 [) @4 H7 O! s. k" ?
  40.     {
    4 ~% l4 Z8 H0 [/ G  J
  41.         Error_Handler();
    0 b8 U- Y2 l2 l
  42.     }6 H* H2 L" @. p+ K" N8 X
  43.     /** Configure Regular Channel
    : |  h, y( I7 g0 b0 i/ C& a
  44.     */
    % ~) v7 O" C  c" A* e
  45.     sConfig.Channel = ADC_CHANNEL_7;; \$ }4 g8 V+ q9 @6 r
  46.     sConfig.Rank = ADC_REGULAR_RANK_1;# t7 k0 S2 S. q
  47.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;) f0 W( R" ^4 t. s$ ], h
  48.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    9 ?" j6 W2 e& j1 k5 `7 }0 e
  49.     {
    9 q- v7 B: y% k% m0 N" _3 U( i
  50.         Error_Handler();5 f6 U/ r6 ]" F, y* N. w% Z, i; _2 U
  51.     }9 Q4 U* g! X+ K: t% r0 Q3 K
  52.     /** Configure Regular Channel
    " A! I& {3 q7 a* O5 [9 }" L' Y
  53.     */
    $ R$ h* a. `; C6 ^0 H2 b# K
  54.     sConfig.Channel = ADC_CHANNEL_8;
    - j* _6 }3 v6 V& v; d0 k; Q
  55.     sConfig.Rank = ADC_REGULAR_RANK_2;( N) ~- e5 W9 `% _
  56.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    5 n2 J- q; c6 K
  57.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)* V- x3 W6 y7 h% H" p* p
  58.     {
    $ F) Y5 G5 I, S$ G7 H$ N
  59.         Error_Handler();
    6 U/ V$ [, I, F1 _/ L9 ~) `( w5 m
  60.     }
    ! e( q5 A; ~# d& O: ~6 I
  61.     /* USER CODE BEGIN ADC1_Init 2 */
    6 v1 r9 ]# o$ W) C
  62. . V, c- X/ |0 q, _3 _. N7 {6 `8 ~
  63.     /* USER CODE END ADC1_Init 2 */: A9 P7 B; j3 }! [; X

  64. . C# p7 u4 T# C6 P$ c
  65. }7 ~) t: b7 z: `

  66. ! \# o* M, n* p8 U& t( K
  67. /**/ a5 Z, E. A# k! [5 h- p( h- [
  68.   * @brief USART1 Initialization Function9 M" I( {' ?; g8 D! h
  69.   * @param None3 e  B( v& S# b& y) `. V
  70.   * @retval None. j, ~. W- w" D. v6 I5 N
  71.   */2 g4 ?2 q+ L. I, }6 M
  72. static void MX_USART1_UART_Init(void)% P+ m* [3 v. N% a# A! @  S1 n/ j
  73. {# e* }, k5 ?6 a& g4 _
  74. . y9 [: X! t) v  I
  75.     /* USER CODE BEGIN USART1_Init 0 */
    ' H" |. {( Y& O( V1 h7 |
  76. . B/ V3 B4 [; m" {/ m5 ], I
  77.     /* USER CODE END USART1_Init 0 */
    0 r7 s" M8 F& w8 j; p% F
  78. 9 L+ V; Q+ A- H* L
  79.     /* USER CODE BEGIN USART1_Init 1 */; w4 G* j- L8 d( y" h; Y3 ?/ {; @

  80. ! j+ a4 ]& N; ?6 K
  81.     /* USER CODE END USART1_Init 1 */
    4 j: t# d0 D; _' ^$ g, Z
  82.     huart1.Instance = USART1;" Y; z! }. y. L7 C6 H' w& R+ |
  83.     huart1.Init.BaudRate = 115200;
    1 V  ]5 @! Z/ g3 r% o0 Y+ S
  84.     huart1.Init.WordLength = UART_WORDLENGTH_8B;
    " D0 ~3 B+ ?$ c+ O
  85.     huart1.Init.StopBits = UART_STOPBITS_1;
    " ~: X! D, I/ M$ P. w, H
  86.     huart1.Init.Parity = UART_PARITY_NONE;2 n: `. @* }/ k7 V: k- @
  87.     huart1.Init.Mode = UART_MODE_TX_RX;
    $ f: K5 ^- ~# ^: Z% A; J7 O- O) Q
  88.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    0 d4 z5 d' g5 r1 s. A
  89.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;
    # Y+ D9 [+ F- }2 [
  90.     huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    " A/ o) H( o6 |
  91.     huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    3 Q; @# v" [8 z; Y6 e* c; N8 g8 F
  92.     huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    / L$ t/ v& U, n# d2 m  T+ T$ z
  93.     if(HAL_UART_Init(&huart1) != HAL_OK)0 x! l  T0 a3 Q  @6 k/ j
  94.     {
    + h# f3 r: a5 }, z0 e
  95.         Error_Handler();* {3 t  Z6 I+ ^8 x
  96.     }* R9 C' m$ R! i$ O! r- ^9 @
  97.     if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)4 e8 z3 M4 v  _5 v
  98.     {
    ! a) @. j! p; J, e9 ~/ G  E! [) W
  99.         Error_Handler();
      I) D. z& j. B8 K: d" E
  100.     }: i) h, Q% a% q' ^
  101.     if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
      P4 V/ Y9 w, q0 `" p6 @9 r0 K
  102.     {
    : F" H8 H, {: c( z! c
  103.         Error_Handler();
    . _9 \( P$ @6 M) M7 n' r
  104.     }
    4 c# j& e. E2 g7 c! z% \9 n  |
  105.     if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
    - t, I+ ^$ F, G% n- X$ [/ ~. k
  106.     {- O" K. j# u9 F
  107.         Error_Handler();
    2 G/ Z8 c: z- p* z/ d6 q3 h
  108.     }9 M" R, ^" a1 U' U
  109.     /* USER CODE BEGIN USART1_Init 2 */
    3 W3 D& p* I2 e" _- o2 q
  110. 2 y# t" V5 d3 r( j
  111.     /* USER CODE END USART1_Init 2 */
    ) ?- N2 B- b% d( ~: X
  112. $ {+ n  ^+ q! a6 S' x0 ~
  113. }
    $ x; y. f5 u% |5 E$ V0 y

  114. 0 K/ X* ]1 T$ R0 Z5 Y& b3 ]
  115. /**
    ( S, N6 W9 U8 F% p8 N% v  ^& e  _
  116.   * Enable DMA controller clock
    % T& R6 `: n8 F6 {% N
  117.   */* S9 h. v' o  S/ N4 G
  118. static void MX_DMA_Init(void)
    7 m: M) \$ W; H9 e, o" w# c- s
  119. {
    ( Q# i$ X- P3 R  A

  120. ' b* a" u+ @" Y& o
  121.     /* DMA controller clock enable */
    9 d$ r, B* g& F
  122.     __HAL_RCC_DMA1_CLK_ENABLE();
      C0 N* @, Z! \7 w4 C9 }2 x/ ]
  123. $ D. P: p6 L6 a2 j  i8 y
  124.     /* DMA interrupt init */4 X' f! h* j# c( X! x, _; X
  125.     /* DMA1_Channel1_IRQn interrupt configuration */( a/ l' ^' g! \6 ~

  126. 0 K) U$ @5 D: `, i5 s! Z
  127.     //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释 " ]: G3 ?6 U+ G! X& ^( V! e
  128.     //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);2 L4 @( \( S* C3 X

  129.   g- E: b' M$ k0 i
  130. }
    7 x7 y$ A9 v$ O2 k
  131. 2 f; P8 v/ ^+ T  u9 s* E( l- k
  132. /**1 q) b; R8 @$ D2 p9 `: K
  133.   * @brief GPIO Initialization Function) }; V: u- I1 U
  134.   * @param None5 \0 X8 k9 K- D% m& x# V; L
  135.   * @retval None
    ' f& l% N' ?- m1 r/ f" `
  136.   */" t8 E/ ~) {8 k/ f( Z
  137. static void MX_GPIO_Init(void)
    8 k$ j1 P7 C% s% d
  138. {
    0 y1 v% L& X. b% A$ q

  139. + ^$ Y  l0 r0 g4 |& N/ q- ?
  140.     /* GPIO Ports Clock Enable */( u% O; O. B0 D8 |' I: M$ G- t: g5 |+ l
  141.     __HAL_RCC_GPIOB_CLK_ENABLE();; L; c' K$ r9 w0 Y- m
  142.     __HAL_RCC_GPIOA_CLK_ENABLE();+ N4 p! p! h# [

  143. . \, V" L7 h$ w4 q  R+ ?: A7 t7 }
  144. }
复制代码
6 T3 ~3 I# G5 k$ B3 _: y
  ~$ Z+ v( q3 b7 |7 `, m
3. 实验现象
: O* l$ X6 y: S/ I1 k! s: }编译并将程序下载到开发板中,连接串口助手并打开;) l7 z" W) }; y4 `
实验现象:每秒打印一次当前两个通道的 ADC 值及换算后的电压.
# `- I' [$ S- ^# M1 i

4 [& |# @, R' f: {
6 G  y0 Q0 A* @4 S3 a- z, p
2021012908502456.png

4 B) V6 j# ]' R6 y; U
赞 收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版