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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1. 使用 CubeMx 创建 ADC 工程
3 ]. ?- R3 }" f& L8 s# L打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.( k2 I  _! W; C" y1 ]
/ `/ \" D  {& _5 |4 X/ |
先配置一下串口,用来打印相关信息
7 N. v. t2 Y1 x+ ~6 W4 a& {' Y0 a
20210129082956474.png

) ^" _+ g2 ]; F  q5 [0 M9 J
+ z7 V# F# x% I再来配置 ADC
: k, M9 V& \- L  a
# M4 _* k5 C6 e9 t) A
20210129083334250.png
7 O1 \2 Y! ]* W6 d0 _

2 H# B+ _' q0 M0 n/ @
20210129083449121.png
6 g( B! s* u8 ^! h
9 P! v8 Q/ D# k# t# g7 }9 a
配置DMA
$ f$ r- p/ l! J; S% P
20210129085309510.png
1 n+ V- u7 @" X& p4 [+ `4 [$ V, x

9 K$ U+ ~" w9 ?7 d% N: J  R/ `PS:DMA 需要要配置成循环模式,否则只填满一次缓存数组后就停止工作,需要重调用启动 DMA 的函数.  s; k1 j. A$ u" t4 v- E
2 N8 E8 |; ~: e# j
配置时钟5 o! P3 m7 v8 Z3 T' A6 r

! p7 T/ d- v5 P1 Q! _+ c
2021012908370231.png
( t' b; I9 x6 s7 r% c

5 d2 @3 T' \7 _  ?" s: |ps:本实验使用内部高速时钟,未使用外部晶振,主频设置为最大的64MHZ.
# i: v0 @2 u# Y# M$ M/ X* u1 j/ J% k9 h' X$ i) |8 r. ~
配置工程相关选项
$ |! Z" D4 a# d) d4 V8 a" n, q2 t+ ^
' i' @  [/ T* C3 g$ s6 y  h8 B
20210129083821567.png

8 Z2 v; B; n# l; L! W# w" d( S. [7 Z! c1 }. N# v
配置完成后点击右上角 GENERATE CODE完成工程的创建
5 N$ d1 K8 U% g: E0 w0 C2 h% z
9 G  v9 {% v" k; f* C6 [- i2. 编程
& e, \$ k3 h2 i2 I' s3 ]- h2.1 串口相关的代码
! Y% T- A" Y% O2 T" N6 N因打印相关信息需要使用 printf ,需要包含 stdio.h 的头文件,且需要重新设 fputc 的函数
" s; a; ]/ d0 q# G# m* w
  1. /* Includes ------------------------------------------------------------------*/' s. g5 l- W; K" V! N
  2. #include "main.h"
    . p  w9 r- f9 J3 L- V  O

  3. * z  n' N# s! V
  4. /* Private includes ----------------------------------------------------------*/" \; Z6 M+ D) j- k$ S6 u
  5. /* USER CODE BEGIN Includes */$ l; B$ _' Q# E0 f- h. ]6 |
  6. #include "stdio.h"
    ) Y6 X6 i- w' I, H6 T0 \* D( b
  7. /* USER CODE END Includes */. `. f: f: u7 o6 @

  8. 1 e/ \* l! G; p1 ~! H: e
  9. /* Private typedef -----------------------------------------------------------*/# h/ O, M4 M. |# |" y( X! z) V2 J
  10. /* USER CODE BEGIN PTD */% |& O2 L, v- L* r
  11. # f2 f5 s. P4 T* _
  12. /* USER CODE END PTD */: ]5 g) k5 P! u

  13. 8 y0 ]  T% N! C; N1 H9 H+ C7 o
  14. /* Private define ------------------------------------------------------------*/
    + k( d4 O2 d0 d7 h1 i
  15. /* USER CODE BEGIN PD */
    1 |" Q+ n0 ]. k4 P9 E; b: A
  16. /* USER CODE END PD */
    9 _8 r* v) A( b6 S7 s" o2 o

  17. ! s2 U; Y8 L8 C( U" ~' o
  18. /* Private macro -------------------------------------------------------------*/
    # @2 d2 n' `' F: s) c' i/ o
  19. /* USER CODE BEGIN PM */4 x, ?3 a2 z; K$ l

  20.   ~' A6 i8 {: q8 C2 V
  21. /* USER CODE END PM */
    8 i' P9 Y+ Y: t: `( }
  22. ' ?2 x0 D' b0 o) ^* C% W" o
  23. /* Private variables ---------------------------------------------------------*/
    $ ?3 Z, Y6 G2 T2 y$ m& Z, ?
  24. ADC_HandleTypeDef hadc1;+ H7 O7 |: z0 P
  25. DMA_HandleTypeDef hdma_adc1;# B* q8 T& Z1 |3 r
  26. 5 S3 [* x  q" t  [% N- h# k4 `
  27. UART_HandleTypeDef huart1;
    ! j. B$ O! u* @# Q
  28. $ g: d+ J0 E# G" v4 X- e
  29. /* USER CODE BEGIN PV */
    0 Q% O8 s' p: m* U1 ~3 |7 I' E
  30. . B8 A% y5 J' g+ U
  31. /* USER CODE END PV */
    - Q" a1 R$ f0 X5 B- N
  32. ' P+ F( R  f+ t. j8 a# h
  33. /* Private function prototypes -----------------------------------------------*/
    $ p; ?1 C6 p; W( q3 ]" y- z
  34. void SystemClock_Config(void);
    3 J6 N' l$ x' Q. x1 y
  35. static void MX_GPIO_Init(void);
    / F/ P' g  h$ A# G% y
  36. static void MX_DMA_Init(void);
    4 s4 X9 H' o- z' J
  37. static void MX_ADC1_Init(void);& N& W: O9 J# ?" V
  38. static void MX_USART1_UART_Init(void);4 _( i* K: u5 n. _. p+ e& M. P
  39. /* USER CODE BEGIN PFP */# j4 o7 k" c7 Q8 }4 i
  40. ; R4 t- O; _- d0 O! I
  41. /* USER CODE END PFP */
    - l& `+ \3 n! S( D4 |" O
  42. & A8 t( A7 d+ k0 C7 m9 n
  43. /* Private user code ---------------------------------------------------------*/6 L6 M, }# X; S( X5 `. U2 ^
  44. /* USER CODE BEGIN 0 */* D) E( K3 ?/ m) h
  45. __IO uint16_t adcCovValueBuff[30][2] = {0};        //存放ADC的值 2通道  每个通道存放30个值,由DMA循环写入
    7 {, Q; O) u/ Q. `2 ?& U' O
  46. uint16_t adcAverageBuff[2] = {0};        //对每个通道30个ADC值取平均值
    & Z9 l, l' B( j) P
  47. 0 G: W/ W! q# A

  48. 8 ]& P) H" C" u  J* n( r9 {% F6 V
  49. #ifdef __GNUC_
    4 g* F: e0 E4 V5 ?% a; ?
  50. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    , C3 J) ^7 `; o& Y1 l, H; K
  51. #else* I4 [0 D. Y, n$ v+ I  C( `
  52. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    & _' _. ^0 Z2 ^1 k$ i3 o7 y
  53. #endif/ R4 A* [$ u% E" R
  54. PUTCHAR_PROTOTYPE
    - Z2 I% O1 e1 T1 R
  55. {
    ' g! C5 E1 c6 E0 `) C; h. x/ d
  56.     HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 0xFFFF);
    ! P/ Q/ k- E5 k% a

  57. 6 G  Z0 ~9 s( U: H! d
  58.     return ch;
    : P4 N" Z% D2 J! L
  59. }5 ^9 ]" R+ t' u, r* h

  60. + V5 X, X% O2 O2 f  m; U3 L( ~
  61. /* USER CODE END 0 */
复制代码

* G# O6 \. l* C" ~& v3 c6 b9 I, B0 L
2.2 main 函数
! w8 ]" t" P, a' W2 ^
  1. /**
    2 m/ Y9 A* N, ]
  2.   * @brief  The application entry point./ D4 w( d! `3 d) A3 Q( [
  3.   * @retval int9 g# t( l) |- l9 Q) g
  4.   */
    7 w* A, i$ `3 Z
  5. int main(void)' V) s: H' w5 b( c  _& _+ J
  6. {
      G" ~. C- z" \0 ^! P; o6 O0 U' i
  7.     /* USER CODE BEGIN 1 */
    4 r0 h; @7 _6 Z$ I1 I
  8.     float votage = 0;2 i) S2 `; E& a" s- Q" s
  9.     uint32_t sum = 0;
    5 e1 E7 G. B* _. i# c( f
  10.     /* USER CODE END 1 */  }% s- q5 E3 F( r. H) Q2 K
  11. 9 v6 z. g* \' x: g- R$ H4 b4 ^
  12.     /* MCU Configuration--------------------------------------------------------*/# L# }4 u4 C+ ~4 G( u- w2 i% Y
  13. 7 S# N; `; h+ _( K$ c. @- U
  14.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    " i) W# i9 @! s1 X9 x! q
  15.     HAL_Init();% `3 D/ w' M: H/ J7 ^; d7 E
  16. ; b+ C: A; R0 j, X0 {5 |7 e
  17.     /* USER CODE BEGIN Init */
    % M/ d9 J2 Z8 r4 B

  18. 6 G6 E8 E8 p7 N! f5 d
  19.     /* USER CODE END Init */1 H6 ?9 i4 n/ {5 D: r: ?6 l# I5 a

  20. . L1 ~5 G9 h+ d, f
  21.     /* Configure the system clock */
    6 |1 G# ?4 c. r8 S: x8 I" q! m1 a
  22.     SystemClock_Config();/ W/ ]0 J6 P" W5 G+ e  i

  23. 0 O- |, E# o- _  c2 ?
  24.     /* USER CODE BEGIN SysInit */% s& E% i; m0 E+ M
  25. 7 x& G( S9 u. y
  26.     /* USER CODE END SysInit */
    % r9 F" g/ \" {' H1 F+ h4 n

  27. $ ~+ F  I+ T0 Y" r. C1 }+ r$ n0 n
  28.     /* Initialize all configured peripherals */8 W' x) t/ l7 Q, V
  29.     MX_GPIO_Init();( \& f9 q$ n7 G1 B9 h2 ]) b2 l
  30.     MX_DMA_Init();/ i. C! C% J  ]+ b) y
  31.     MX_ADC1_Init();* n& a3 B4 [% H$ A4 N
  32.     MX_USART1_UART_Init();
    ( ^# f8 u' {2 a- T) \
  33.     /* USER CODE BEGIN 2 */& [# R! d1 Z2 @# @( W( G
  34.     printf("stm32g030f6 adc demo...... \n");
    1 c; B$ E8 o, ]' H: Y
  35.     HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcCovValueBuff, 60);
    3 T/ q5 ]4 V& L% S8 A) v/ N1 y% }
  36.     /* USER CODE END 2 */
    / Z# j3 J% ]9 C# p/ I

  37. + K- Y6 d1 y$ D* F$ u; i3 s
  38.     /* Infinite loop */
    * M; g! u" _1 ]0 E4 M; J. u
  39.     /* USER CODE BEGIN WHILE */! s8 s. r" I2 e  k# n+ g1 {
  40.     while(1)
    4 j* T# e) G* Q0 B2 t
  41.     {
    ' S, y, ]% s+ W6 w& `/ G1 m. G9 F
  42.         for(uint8_t i = 0; i < 2; i++)  }/ w+ X- U* R& n3 i! Z4 l
  43.         {# n0 k( H  M6 x) x$ [
  44.             for(uint8_t count = 0; count < 30; count++)
    ) F8 a& B( `! _3 a
  45.             {
    % K+ b2 |  X1 L% ?, y3 @
  46.                 sum += adcCovValueBuff[count];6 b/ S/ R' j  M/ ]
  47.             }
    7 C3 r* |9 X* _" H( I/ s4 a( T7 y. U9 ~" u
  48.             adcAverageBuff = sum / 30;
    4 o- P  R2 h+ a8 S2 s0 ]+ T7 n
  49.             sum = 0;5 v1 |/ Q. C' k3 s
  50.         }
    . [5 m: k, Y7 q

  51. 1 k2 \2 b- k+ {; L8 `% L, L
  52.         printf("---------------------------------------- \n");4 }* Y5 i8 q3 e" V! C% J$ O+ a, U7 U
  53.         printf("ADC Channel01 Value:0x%04X \n", adcAverageBuff[0]);
    & Y7 f7 X, p% B: U/ P1 _* K
  54.         votage = (float) adcAverageBuff[0] / 4096 * (float)3.3;9 G' k" T2 L' \7 c. x; x
  55.         printf("ADC Channel01 Voltage:%f V \n", votage);' [6 t& r" q# j% z
  56.         printf("ADC Channel02 Value:0x%04X \n", adcAverageBuff[1]);; {  k( N% Q9 Z  ~0 [/ d# i
  57.         votage = (float) adcAverageBuff[1] / 4096 * (float)3.3;
    5 N( t( w/ ]  m' j1 R2 B
  58.         printf("ADC Channel02 Voltage:%f V \n", votage);
    ( k; Q: e% a7 ^+ p/ g$ U! M
  59.         printf("---------------------------------------- \n");4 a( w( y, I: [7 A/ {! H* R, u
  60.         HAL_Delay(1000);
    - ~$ K# {% `2 J! t* t* Q
  61.         /* USER CODE END WHILE */; p) C) V4 z8 S
  62. % R9 ^! |0 U: E
  63.         /* USER CODE BEGIN 3 */' A+ ^: u. |! o& h( ^
  64.     }
    ' K* L+ C- ~! M& {
  65.     /* USER CODE END 3 */
    * g  |- Y/ d' T- m
  66. }
复制代码

( D9 v) M4 n8 w6 f+ K2.3 外设的初始化函数% L8 {; ^% O% k' h/ F
外设的初始化函数都是由 CubeMx 生成的,因为我们只用 DMA 搬运数据,未使用 DMA 的中断功能,故初始化 DMA 时可将中断配置函数注释。! I& D, ~  m' V% ~
- F+ z7 ^5 z' x! ?, w4 w
  1. /**3 n1 T, g0 s" ?0 ^2 G: M$ [, R9 ]: V
  2.   * @brief ADC1 Initialization Function, a/ K* q6 U3 ^
  3.   * @param None
    8 Y3 t" Y& k6 G7 x; x& S( b
  4.   * @retval None
    ! r8 Y4 j6 s8 Q7 o
  5.   */
    2 o4 A) z4 q( {
  6. static void MX_ADC1_Init(void)7 b* L! W" X7 [8 D, T
  7. {
    % a! ~7 A/ y" s% y& d& J  M/ h8 t
  8. + q) R3 h: ^. I
  9.     /* USER CODE BEGIN ADC1_Init 0 */; g; H# u7 Q. i2 b2 C+ M: H9 l5 U
  10. 5 Q& l$ w8 I6 t; c: _3 e
  11.     /* USER CODE END ADC1_Init 0 */4 R7 U, p2 Z, s5 h% [0 P

  12. , E- h! c( F. i' V
  13.     ADC_ChannelConfTypeDef sConfig = {0};2 {9 U  ^2 T- |. a! T1 J& o3 Z+ x

  14. 2 t  J* S" _5 O1 t
  15.     /* USER CODE BEGIN ADC1_Init 1 */# |7 i8 u. r( I, H% I( @

  16. ' n3 J6 @( t! l5 B# c
  17.     /* USER CODE END ADC1_Init 1 */2 `( A7 c% h& d' I: l; ^
  18.     /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion); W  O7 N4 j9 P3 |
  19.     */% X4 L- `' D, Z+ i
  20.     hadc1.Instance = ADC1;
    9 f  O- }1 t' {+ ]
  21.     hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
    % Y0 ]. \6 _4 p2 C4 ^
  22.     hadc1.Init.Resolution = ADC_RESOLUTION_12B;$ z1 @) j+ |' I. z1 _' `
  23.     hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    * `3 ?9 w% k2 E$ |4 a7 i2 [
  24.     hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;3 V8 Y. Z% u+ @1 g1 u
  25.     hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
    * o0 M! Z* y& d
  26.     hadc1.Init.LowPowerAutoWait = DISABLE;" Z7 t/ p3 H' W" C) G
  27.     hadc1.Init.LowPowerAutoPowerOff = DISABLE;0 i: i% t' c* I! o2 y+ H
  28.     hadc1.Init.ContinuousConvMode = ENABLE;
    * h' M7 L7 @( y. T$ X
  29.     hadc1.Init.NbrOfConversion = 2;
    ; O. [/ e0 }! M! ]4 B* R; l( y
  30.     hadc1.Init.DiscontinuousConvMode = DISABLE;0 k# x3 o' T* I8 U( d+ G4 R. t
  31.     hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    $ S% ]) x& m; J% `
  32.     hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
    . @2 w) B: E+ {, f
  33.     hadc1.Init.DMAContinuousRequests = ENABLE;
    ; d/ k% A+ {/ ^7 D7 }* @. l
  34.     hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;
    , @; i. T+ x/ h2 p2 ?& c& o  K) u
  35.     hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_12CYCLES_5;! a$ f3 ]) Q5 |( H% |- ~, v; X* g' q: {
  36.     hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_12CYCLES_5;0 m; A7 P6 o: Y, O
  37.     hadc1.Init.OversamplingMode = DISABLE;% \7 j* [; M8 [1 D' N/ h
  38.     hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
    6 l: N( j1 H7 H/ _: t- U0 x$ g
  39.     if(HAL_ADC_Init(&hadc1) != HAL_OK)3 P9 b+ W0 n, C, J5 B! ?" ^
  40.     {
    3 N7 y4 X4 p/ U6 U# P
  41.         Error_Handler();
    7 K5 d0 s, e+ O0 c5 Y
  42.     }. m$ W+ ^& f7 i; W1 j8 @/ z3 T
  43.     /** Configure Regular Channel
    # `! K2 |( R: r+ S  G
  44.     */
      B1 {6 r) h, V4 M
  45.     sConfig.Channel = ADC_CHANNEL_7;  Z! {! N1 s, R- ]0 L; l
  46.     sConfig.Rank = ADC_REGULAR_RANK_1;! R8 g: X  x: k$ Z  H, i
  47.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1;
    6 a$ L* y4 f  @3 Y) Z' o
  48.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
    ' a/ O7 O# \+ D
  49.     {
    ; A3 f, @7 v" V6 B3 g$ {) Y
  50.         Error_Handler();/ u# b7 `* x5 v
  51.     }
    : i7 T9 w' \2 l! s
  52.     /** Configure Regular Channel+ O+ E& v7 X8 l4 r8 O3 i$ J/ p2 N
  53.     */5 _% m% S/ o5 \( o4 K% B% {
  54.     sConfig.Channel = ADC_CHANNEL_8;* I, R- i* G1 W& h; r( D
  55.     sConfig.Rank = ADC_REGULAR_RANK_2;% _9 T6 C1 \0 r) k
  56.     sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_2;
    4 C  ?% z: {  |8 C( V: `5 t; P# @
  57.     if(HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)* f6 r7 ~8 H2 b4 V
  58.     {
    ( Q' N, E& u) \- W/ s# X2 y! u
  59.         Error_Handler();
    & b) {, z" q. z9 e* n( x
  60.     }! E) B4 R4 [, H/ p7 b  {
  61.     /* USER CODE BEGIN ADC1_Init 2 */
    ' }7 @" Y. u* O; r2 }1 p) M
  62. 3 D( q9 B! E4 h
  63.     /* USER CODE END ADC1_Init 2 */6 i0 A# G& R2 r

  64. % a! x0 B1 I# y$ x8 C2 v7 z
  65. }4 |0 `2 e. P" P5 M
  66. + n' f- N6 Z/ h
  67. /**
    " L9 [' B; u# T: _1 d5 z, i
  68.   * @brief USART1 Initialization Function9 q/ y! p6 |  n" @6 C# s" a
  69.   * @param None# B, `4 C5 {4 i' N) E1 y- s
  70.   * @retval None  j% e  h  t" _5 d+ x/ J$ M
  71.   */
    : U! k, m3 ~# d& `* ~2 j5 t
  72. static void MX_USART1_UART_Init(void)  S3 }( |  R: _& ^
  73. {+ |: e1 l/ O- J, P) ~& E
  74. & R1 \0 `  D1 e, O1 K( G* V9 c
  75.     /* USER CODE BEGIN USART1_Init 0 */( W% S8 [( W7 w' s( x

  76. ! _7 B9 K3 O1 g( t9 G
  77.     /* USER CODE END USART1_Init 0 */
    # k. q  y+ Q1 m6 D4 E) m9 G. l5 l1 ^

  78. 9 _2 X/ ?. s# F' T0 }
  79.     /* USER CODE BEGIN USART1_Init 1 */9 w1 {3 D* M% y2 O+ r6 A% L1 ]1 E; c
  80. ( {1 F( R. e2 G& u( q
  81.     /* USER CODE END USART1_Init 1 *// V5 s& V% n  L2 K- U2 s: S( T
  82.     huart1.Instance = USART1;" `9 _6 }* R5 d, S+ X5 I
  83.     huart1.Init.BaudRate = 115200;# t3 l% i4 b" c% f
  84.     huart1.Init.WordLength = UART_WORDLENGTH_8B;, h+ @# X; G* Q7 o
  85.     huart1.Init.StopBits = UART_STOPBITS_1;
    # Y2 G; W7 T6 {
  86.     huart1.Init.Parity = UART_PARITY_NONE;
    / d! P0 a8 K  Q$ I! l3 ?  Z; F
  87.     huart1.Init.Mode = UART_MODE_TX_RX;0 G( F8 J9 y5 Y3 I, C8 L8 Y
  88.     huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;6 f& \& W% o/ f% _" N
  89.     huart1.Init.OverSampling = UART_OVERSAMPLING_16;0 n4 u3 l$ @/ C* I* ]0 J$ u! F! m
  90.     huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    / s9 u: c9 k- [& s* ~! Y( I% p
  91.     huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;4 K- `; ^0 c' x3 s* D
  92.     huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;2 M% z6 T' S0 |- j$ b% {: e
  93.     if(HAL_UART_Init(&huart1) != HAL_OK)
    ) f# _+ E: X2 O) \3 Y/ H9 L
  94.     {
    - G8 m; z# M2 p+ W8 i
  95.         Error_Handler();2 r7 ^4 b3 Z% \2 K) U7 ^% u4 Z
  96.     }
    7 i( R- T% M( D; a, O
  97.     if(HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
      @1 ~1 M( V/ o. b2 ~. T
  98.     {0 M. J" m1 }$ g
  99.         Error_Handler();0 d+ ]+ d, B) c- {) e: A2 Q# h
  100.     }
    0 @) i, m  A! l0 |
  101.     if(HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)! @# z* B; i5 q1 o& a& |1 q3 X6 x
  102.     {
    # s/ F% U$ E) ?1 N) v6 T5 P
  103.         Error_Handler();8 |$ h5 v" l0 x. V7 z* k1 g" r
  104.     }
    + j9 ~& Q+ M) B. F) i7 i1 T; S3 S
  105.     if(HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)/ W4 [6 I& N% z4 ~6 z
  106.     {
    4 @) i+ C; `4 h
  107.         Error_Handler();
    , w) T' V  [+ Z& Y+ ~* ?/ B8 n  X
  108.     }& Z4 G: J/ y, n. N3 H
  109.     /* USER CODE BEGIN USART1_Init 2 */
    7 R0 k6 E. s+ z

  110. 8 a1 B5 I; V9 \, b0 Y
  111.     /* USER CODE END USART1_Init 2 */
    # h0 z3 j1 h1 w' j" r6 s! P0 ]% T

  112. 1 Q( y0 F5 l3 T' q  j
  113. }+ O% [/ \5 M) u6 p! ~- Z

  114. % G4 O$ B  z! e
  115. /**
    : I$ ~2 {4 x) K/ E
  116.   * Enable DMA controller clock! z( K" D) Z( m( v
  117.   */
    7 q, W* ^0 A- |+ D
  118. static void MX_DMA_Init(void)
    5 P% n+ o8 w) h6 l" {& Q
  119. {
    ! m" S' S' ]; l- d2 i: s, Y
  120. " W4 [- z- m4 \/ X9 ~9 o
  121.     /* DMA controller clock enable */: ~0 ]. ?/ T5 a+ K2 \
  122.     __HAL_RCC_DMA1_CLK_ENABLE();6 S8 d# N* o* u
  123. , v4 w' u  q; b1 J$ g
  124.     /* DMA interrupt init */; j7 j. j( w+ J1 K8 v
  125.     /* DMA1_Channel1_IRQn interrupt configuration */
    " r; y8 o6 ~6 C( [

  126. 4 ]6 X' M, l2 d5 t) _! o7 W
  127.     //HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); //未使用中断功能,故注释 
    8 q) O" d. ^1 S. u; a' z0 R
  128.     //HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
    : l: N! F' ^' s' b+ F/ L7 b
  129. ) O+ ~* B, r8 T7 G9 |# {* F$ O& ?
  130. }
    ( Q  X6 U' C6 A

  131. / t2 R( f1 k: j" b
  132. /**5 o) [5 e& `3 p" ~
  133.   * @brief GPIO Initialization Function
    & a5 Q# K3 u/ @& F9 z; ]+ v
  134.   * @param None
    : X! b+ i; j( Y" ]* f; j8 f
  135.   * @retval None/ Q* l8 V' F% Y) }( m
  136.   */
    : K- M# t$ N# ]: D4 r
  137. static void MX_GPIO_Init(void)3 K8 W6 v4 G+ g( V
  138. {$ y( D% f# M9 c( [. G( a1 }4 i

  139. / n9 F8 }2 r& X2 W& m2 F
  140.     /* GPIO Ports Clock Enable */
    % v. k/ K  i3 a9 d2 w
  141.     __HAL_RCC_GPIOB_CLK_ENABLE();* f% E1 N' M1 c4 {
  142.     __HAL_RCC_GPIOA_CLK_ENABLE();0 W* M$ A' {' |  O0 v! V3 M
  143. - D! L' t8 e4 k
  144. }
复制代码

( Q/ z. M4 S5 d$ F% y. k0 R$ \; [( L9 O) `' W. q
3. 实验现象
! F# N  r: T" N编译并将程序下载到开发板中,连接串口助手并打开;
( t2 G3 ?* W8 {) A# B$ [1 g实验现象:每秒打印一次当前两个通道的 ADC 值及换算后的电压.
% C; B7 {  e4 f) o# J2 K1 D

4 k- N5 I6 u$ B. J" n" B4 R1 I" M, d8 E0 Y3 U- N5 E: e
2021012908502456.png
! k. O! Y8 C. A
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版