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

【经验分享】STM32G0学习手册——多串口同时使用printf输出

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。' o. D7 X5 w3 p6 K: R. s+ h
4 Z% x- {& c" a2 g& n* f$ @
新建工程0 F6 K8 b, e6 G' D
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE( C$ B; G4 ]6 O1 F" K4 F/ Y

) L7 I1 K$ X! o" _: w$ Q
20200718203500751.png

, f3 @# \* t. B" k; B$ f' t5 Y9 \
8 {/ d  U9 T6 U8 l( U
20200718203520493.png

3 C+ V% O$ V+ `4 g+ |! F$ J, s; B7 ?0 i6 I" N. y
2、 设置时钟树,HCLK=64MHz- H( N; I1 n9 @, g1 k: E9 B
1 x: v! Q( \3 d% N# Y! ~
20200718203629892.png

5 X: f0 T" l* Q( p+ E/ b  _2 l$ v! n) a% C& b0 w+ {# n
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX1 W4 L+ f2 ~# z2 j4 m) {9 Z; g/ ]
  T) F! V5 }: h( A5 Q3 T  U! a" l4 a
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1" n$ \4 u0 s2 H* t$ `

# ~5 T9 y+ b1 g) ^) O" z/ _* x
20200718204428382.png

5 z3 u2 D  y8 K. ^! r
% V, ~% j2 m# Q, c4 {, L+ V6 `4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
- A0 D( X! I5 [. Y  U+ ?# J: G
! e. }2 W% [% b/ W/ N$ |4 u
20200718204945809.png

6 V# o! Y$ F- X; L# M' V) Z4 {" b
* z% o# Y1 s2 |7 r5、 项目管理填好信息。生成代码"GENERATE CODE"1 u8 t! D- v7 L' f1 s$ k; b

# ^! y7 X4 v+ q: r* `
20200718205222483.png

- Q8 r, ^/ g) W. w0 C& J
9 m" m2 U# M; S
2020071820534722.png

9 O) a8 U  b& {
& T4 n3 i2 q* O$ X3 ~$ B6、使用MDK打开工程,debug选项中勾上“Reset and Run”
5 X; ?/ U- O1 v
9 J# S. a( r. w" n) E, ^& ?代码部分
: |- h' b! }% B/ o) n1、usart.h中添加如下代码! y0 ^- {4 v- v6 @
! O' i. S) t9 Q/ P
  1. #include <stdarg.h>0 [7 X$ E! v( d/ D! |

  2. 8 {( B! E* Q) v* Q3 O4 c% t- P
  3. /* USER CODE BEGIN Prototypes */5 p1 ]: E6 `$ m! v( S( q8 |2 l  y3 `1 C

  4. ( F5 j2 [+ r/ o4 {1 h* A
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数
    + S! U" s; R, w# m' r9 {6 N
  6. void USART3_printf(char *fmt,...);* u$ I% u) N1 l+ s4 l( A$ _- R
  7. void USART2_printf(char *fmt,...);2 n1 O, K. v; I

  8.   u+ {( o- \, i9 U' o
  9. /* USER CODE END Prototypes */
复制代码

: f) B2 d4 P9 @9 [! x" Q2、usart.c添加如下代码
' b% @& g: I  g6 `! q, g) J
, T" u! f' \% ^
  1. /* USER CODE BEGIN 0 */4 e/ F3 k0 [! e: h# l. B, d- O" |
  2. 6 B5 i. u, ]8 k  u4 \) w; t1 X
  3. #include <stdio.h>4 F7 c6 L: R" l! b  @* E
  4. #include <string.h>
    4 z; S. O2 [. s, A' Y/ {' o; \
  5. #ifdef __GNUC__, s- m/ b% E9 F8 M& |. i9 P/ R
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    ' d( |$ `! p/ Q9 k3 z
  7.      set to 'Yes') calls __io_putchar() */3 ^3 W# g! R1 P; S: D# _$ h5 n
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)0 ?3 ?+ X+ ]5 s& q, {: d
  9. #else
    ( Z9 S9 f) u) T$ y% J3 C
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    + j- P+ e, N% V3 I
  11. #endif /* __GNUC__ */
    7 G$ X; a# ~2 u+ i' d& Z
  12. /**+ }% x* Z) j4 E6 W9 R" z
  13.   * @brief  Retargets the C library printf function to the USART.6 S# o! ^* Z6 A, F- N& T
  14.   * @param  None
    , q8 `& {& J5 i
  15.   * @retval None
    * X& x( u4 s. m3 N: L
  16.   */
    9 ~& _  B- O1 A
  17. PUTCHAR_PROTOTYPE
    * x2 f* W! x5 a$ r
  18. {
    5 v" \, D: p$ Q$ f8 I$ T+ r, M
  19.   /* Place your implementation of fputc here */
    / l  r$ ~& L* i9 z% k
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    1 R) o! b0 t* h
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    % t: B8 |- _+ }
  22.   return ch;
    " w: a1 a" D" l
  23. }* z- P5 l1 n. C$ Q% }5 m1 h
  24. 5 m* a7 W  E" K# P" g
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节- W4 V1 ~, I3 X# i
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区
    & V9 Z; k) d2 B/ @9 ^( M' t
  27. + P( r1 r" g+ m% Q6 q+ D4 s6 t7 T" ?
  28. //usart4的printf()
    . _. r% M5 }, y' o+ T# L# `
  29. void USART4_printf(char *fmt,...)
    # X2 t0 e6 v3 u
  30. {* N- n# m0 ^. ~% r  ?
  31.   uint32_t i,length;5 E8 `, I  y7 w6 a9 u' L
  32.   va_list ap;' ~' u! l, ?2 r, ^' }; `& W, M
  33.   va_start(ap,fmt);
    " e' p) S- V- K
  34.   vsprintf(usart_txBuff,fmt,ap);
    . `! d1 i6 c8 F6 U+ B* B, s
  35.   va_end(ap);. }$ t& ^- H+ a: O. t; |
  36.   length=strlen((const char*)usart_txBuff);7 [0 l. l, `2 z1 y6 t
  37.   while((USART4->ISR&0x40)==0);. Y4 {+ a1 w) Q" [
  38.   for(i=0;i<length;i++)
    " N/ ?( B9 R8 G& t" R8 p
  39.   {
    $ k. t2 `7 D; v6 s
  40.     USART4->TDR=usart_txBuff<i>;
    : d" J+ G2 n/ N: J1 B) H" a, X7 z0 v
  41.     </i>while((USART4->ISR&0x40)==0);0 a8 Y; a) X" ^
  42.   }& m5 x! T3 \# t: A4 ~
  43. }# H& E( L3 `% }8 h  O

  44. / J- a% y4 g# x7 P3 h
  45. //usart3的printf(); C; T8 N/ [& }+ Y
  46. void USART3_printf(char *fmt,...)
      `4 V" K- D! {  P# ?
  47. {
    + d8 @: @$ n) C6 h6 c
  48.   uint32_t i,length;
    ! i: C2 _  C' l2 l7 U- z
  49.   va_list ap;$ B  p+ T  S. M2 ?
  50.   va_start(ap,fmt);  J: h* }' [4 V0 g5 z: b$ W( K
  51.   vsprintf(usart_txBuff,fmt,ap);
    ; t5 `% L+ I" k
  52.   va_end(ap);3 Z; U6 n* `0 f
  53.   length=strlen((const char*)usart_txBuff);
    # U0 B. B% c# d4 B* z, U6 ~: X. p
  54.   while((USART3->ISR&0x40)==0);% f" j0 u5 @2 O
  55.   for(i=0;i<length;i++)
    2 M) ^1 \, M! H. {% h1 x9 [1 s6 Q
  56.   {' m3 ]2 T$ [) D) T6 w6 a
  57.     USART3->TDR=usart_txBuff;, \. F- @; f" E) C3 H5 C( c! A+ X& G' e
  58.     while((USART3->ISR&0x40)==0);
    ' Y6 n; F  b' F0 q/ V
  59.   }4 S, q3 s6 c0 a$ ?+ }4 d
  60. }
    7 E7 T  }+ c+ w+ J2 ?
  61. ; Y4 [* P' a1 U/ b! _, [; C& P
  62. //usart2的printf()
    # p( l) c( l. N+ e2 t  Q! D& m
  63. void USART2_printf(char *fmt,...)
    5 \# i( a( d+ \; m# c, a$ Z
  64. {
    % b$ h6 J- C1 B& v0 O" r
  65.   uint32_t i,length;* z: e; F! _( W9 \
  66.   va_list ap;
    & f: I, L; |7 |+ }9 x/ `! h3 Z. `
  67.   va_start(ap,fmt);8 \. `3 M! l# x' ]% k% d1 `
  68.   vsprintf(usart_txBuff,fmt,ap);* v/ P7 `: N( }! ^) x' d
  69.   va_end(ap);0 y3 S. \% H6 z+ p& Y% D" g, g
  70.   length=strlen((const char*)usart_txBuff);& z+ I% |% J+ \, I
  71.   while((USART2->ISR&0x40)==0);5 G  u0 {6 v$ |) Z: e) w% @/ o
  72.   for(i=0;i<length;i++)% |  f) m) r" _5 h4 B
  73.   {
      r& |* W8 N. _: V( i
  74.     USART2->TDR=usart_txBuff;
    7 q5 m, q# w  j
  75.     while((USART2->ISR&0x40)==0);
    9 P0 A6 p$ f" r9 T% J
  76.   }
    + Y4 ?  {% P* {" z5 O
  77. }# }9 f0 {4 _' l+ Y4 ~- A

  78. 9 g2 n4 [$ [2 L8 d
  79. /* USER CODE END 0 */
复制代码

) v. g3 A& X' S& V6 m8 Y( b" a6 e3、main.c中添加如下代码
& T+ A/ l$ I4 R5 {' `% H
: E7 W, W; w  l8 Z. H* n; g/ A1 _1 N/
  1. * USER CODE BEGIN Includes */( s1 V1 O$ Y0 Z% [8 w  m0 I* [
  2. #include <stdio.h>, P& R3 b$ X3 G; ^2 b, B) P7 I
  3. /* USER CODE END Includes */
    3 _' V- r5 I$ Q" Q8 A& ]

  4. 1 G2 \  q5 _7 ~# a! B* z$ y
  5. int main(void)
    / B- {! s- c& u* ]& @
  6. {
    : N3 p* T7 y0 i( p
  7.   while (1)5 m+ F7 I* o6 X/ z  z4 j
  8.   {
    2 `' u/ g8 A* P8 V8 y; y) ]
  9.     /* USER CODE END WHILE */
    3 g# U" S: z  U! G8 T
  10. 3 @4 l; L9 ]/ M2 B
  11.     /* USER CODE BEGIN 3 */
    0 t/ b% D4 B- N- `$ Z: l% @
  12.                 HAL_Delay(1000);+ @! A4 C7 H" |4 X/ H
  13.                
    - G+ m5 {9 i- _; t$ _9 c  C
  14.     USART4_printf("This is the signal from serial port 4.\r\n");
    ! K4 k2 u/ a! N" {1 v" W
  15.     USART3_printf("This is the signal from serial port 3.\r\n");7 Z1 @4 \" b4 t  K- K# H" G
  16.     USART2_printf("This is the signal from serial port 2.\r\n");7 C8 q- _1 `/ K" R2 L2 b
  17.     printf("This is the signal from serial port 1.\r\n");  % A8 Z- ~3 G- f- M+ C
  18.   }
    ! o) j5 m4 a* I/ R
  19.   /* USER CODE END 3 */
    : Q6 Q! N6 X9 N
  20. }
复制代码
( P% f9 o3 v1 U9 T8 I! [. g
4、最后编译,烧录固件,串口输出如图
8 f* |/ s, h4 w6 a
+ x( T, i( y* c1 p0 T% w8 e& l& _+ b5 `% m1 g
5 @' {+ r4 k8 w
20200718211759162.png
收藏 评论1 发布时间:2021-11-8 17:09

举报

1个回答
落花又见流水 回答时间:2021-11-9 17:01:37

学习学习

所属标签

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