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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
% ~8 z4 L. h5 H1 l' m6 T  n: g0 t3 e- j( F/ c% `& G
新建工程+ u* x' P" P8 b7 _  P9 S6 s
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
6 O+ \; Q+ I7 |9 _0 j; ~  m- f7 t$ f( u
20200718203500751.png
9 o3 L1 J4 t7 B! P

: L5 w4 x' q% @/ N, u' c
20200718203520493.png

, J/ @+ D5 Y. c2 X7 }2 g. k5 N3 j( ?; E% e/ C( x+ G
2、 设置时钟树,HCLK=64MHz) k4 A0 C( d2 d7 }. f

# n5 E5 W9 x$ z0 A! O9 I# W8 C4 J
20200718203629892.png

  q: p3 F4 j4 `% \$ X( C# m
$ u1 b- b9 b) K5 n- I! X3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
, y! x- t2 @% H) X( U3 h$ x6 p9 n& ]4 A- p; q3 s& w, E  s
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1. H! H' c& h, \( N, ^# a
* E% o1 C% F+ V- r, l0 q5 f
20200718204428382.png
  U% z: q8 G. K% J
0 x+ _! `" C2 ]8 y6 K
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1, a1 X; E$ B; i3 S' \& ]7 J9 t' S
- ^8 i6 y( O9 `: M5 Y
20200718204945809.png
& ~4 ?# T+ i. S
& H4 T* U, U: @8 T/ y
5、 项目管理填好信息。生成代码"GENERATE CODE"" b7 m0 g0 \0 }1 R1 z

0 H4 a# H$ J9 ~+ L. t& S9 a
20200718205222483.png
; g* c: T) Y( A5 ~2 g/ c4 q  y' E. `

1 T' ~' [: ^* p: O! X9 M' `
2020071820534722.png

, K4 c% ?3 M" j9 a! r7 P0 l$ ?2 u7 H' @8 f- p$ v
6、使用MDK打开工程,debug选项中勾上“Reset and Run”. Q1 p3 J  `% x' e
  a+ \' H, ^" a* H7 {8 w% g
代码部分
2 M, F" g3 j% z: Y, O. A1、usart.h中添加如下代码. \, L* G2 o: ^8 O" P2 e
6 `. g9 o: ]; a. Y, N% d
  1. #include <stdarg.h>7 R' I9 D7 W0 e* [% m

  2. , T- N2 i+ m( r2 N$ k. P0 O
  3. /* USER CODE BEGIN Prototypes */# [! i3 J# c! s1 C/ x( @
  4. - C7 X) ]- a( V
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数1 R5 i! `  F' p  ]1 ?* c" m# F
  6. void USART3_printf(char *fmt,...);
    ' j2 \- ^6 c. m- I  @
  7. void USART2_printf(char *fmt,...);: L; C' S7 X' t8 t3 G3 S! f

  8. 5 }3 I% U2 G( W
  9. /* USER CODE END Prototypes */
复制代码

( E0 ?8 |6 d  q" N( V( R2、usart.c添加如下代码
6 G. t: u$ J; a9 q8 a2 h7 d
5 [$ ?0 X) B4 J% K) X9 U
  1. /* USER CODE BEGIN 0 */4 k: R) d; `; x" J

  2. ) k; n  s1 s, ?) Y
  3. #include <stdio.h>7 f9 C: L) L: U8 U& E
  4. #include <string.h>) c8 N; h% h& M4 \
  5. #ifdef __GNUC__
    2 ]# P8 c$ _1 V0 k: ^8 @
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    7 q% J7 J6 q& n, G1 T) Y2 p
  7.      set to 'Yes') calls __io_putchar() */% B# m: n  N4 C7 O
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    3 L; U( [4 u3 G
  9. #else$ g) J0 m8 u& r% m5 f0 y9 n3 N
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    5 y6 ?$ R, p: o
  11. #endif /* __GNUC__ */& T# d; y9 w  Z$ x" C
  12. /**
    1 i0 V" Q/ P1 v/ \# U; K
  13.   * @brief  Retargets the C library printf function to the USART.
    ; O7 L6 T4 q. C+ E
  14.   * @param  None
    , R! S4 S( q/ [8 H) ~
  15.   * @retval None
    $ z  u9 R  }$ G5 G. C$ h: r
  16.   */$ S6 V, M* p7 T8 T  B
  17. PUTCHAR_PROTOTYPE& [9 T- f+ O$ N; r
  18. {
    ' @. C( A& V! A3 e6 a+ O1 r, |
  19.   /* Place your implementation of fputc here */9 J2 O# P3 r& g" A
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */6 R* h8 h/ h, [; w: p) ]
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);* ^# q8 w9 K; V( E6 W. e) F, O& g
  22.   return ch;
    6 S( Z! F; v: p* y& w/ H, }
  23. }
    & g% q2 I; {- g8 Z
  24. 4 K) s/ j$ b0 h3 g+ N
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节, B) s9 P: Z0 P. b, i. a7 z
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区9 v5 m/ }! Q6 z  F1 @% P! m, f- I
  27. . h9 v9 e. y3 G/ W
  28. //usart4的printf(): X& b: M, Q" H8 F' S- f
  29. void USART4_printf(char *fmt,...)
    4 H7 a8 Q5 W6 m% \' {
  30. {
    6 r0 x- }& @3 w8 o3 [
  31.   uint32_t i,length;% m! Q* R! r! o
  32.   va_list ap;
    0 S" {: l. B; V5 l: C
  33.   va_start(ap,fmt);  n% t1 n' P2 d
  34.   vsprintf(usart_txBuff,fmt,ap);
    ) y' l9 ?. b* ]8 q
  35.   va_end(ap);
    " g4 Y* Y  V) a% B( c3 h  [
  36.   length=strlen((const char*)usart_txBuff);8 q8 y2 a& C1 f' j
  37.   while((USART4->ISR&0x40)==0);! z, L2 b; B4 T- @
  38.   for(i=0;i<length;i++)2 u/ ^9 c0 L/ @6 i0 e9 p
  39.   {
    9 g+ }/ e+ B* G+ `
  40.     USART4->TDR=usart_txBuff<i>;' S; P( T' ^& z4 {' t
  41.     </i>while((USART4->ISR&0x40)==0);# y& [# y  M7 s7 V  K; Y
  42.   }$ F& s$ z* C7 t5 q7 s/ a
  43. }* A3 u6 k9 w, Q- P# Z4 f/ [: D$ K
  44. ( [* b1 @0 l) K% U
  45. //usart3的printf()
    9 P$ P/ a( p6 B% H% j! _
  46. void USART3_printf(char *fmt,...)4 F" A* J0 b/ l* T& i& H
  47. {' |" ~! Z; E- F, T* F
  48.   uint32_t i,length;
    / ~  l+ ^5 ~# l; |7 l
  49.   va_list ap;% x( M( W) I2 k+ m
  50.   va_start(ap,fmt);9 [9 t6 B+ t: A! w
  51.   vsprintf(usart_txBuff,fmt,ap);& Y, ?1 h0 W- r& p
  52.   va_end(ap);( y5 S; d1 J& T2 t, |% b* v- @
  53.   length=strlen((const char*)usart_txBuff);
    1 z  n: w. A2 N) h# V) w
  54.   while((USART3->ISR&0x40)==0);
    . u! u0 h% o2 u6 N1 p# L  h7 a
  55.   for(i=0;i<length;i++)' x; l  }% S: N3 ^9 C2 ^
  56.   {' W1 z" e' O1 G  P
  57.     USART3->TDR=usart_txBuff;) f% g" m* K1 B1 ^7 O
  58.     while((USART3->ISR&0x40)==0);# d6 L. h) |8 [, d* Y2 C& j# N3 [
  59.   }+ z0 b  S  C7 W9 R- l" ^) L/ N- f0 Y
  60. }/ b- o# n2 i* ]" @
  61. # {6 v- l, ?4 b! F% E
  62. //usart2的printf()# g) h2 o' i5 G. E8 ~7 n8 {
  63. void USART2_printf(char *fmt,...), Z  Z# _: ~+ l8 b3 H1 m* |
  64. {
    8 d; D& p! K3 \
  65.   uint32_t i,length;8 P- e  C( `: l
  66.   va_list ap;
    ' o; F+ I0 R0 j
  67.   va_start(ap,fmt);
    ' \% M0 C# ]% y
  68.   vsprintf(usart_txBuff,fmt,ap);  ?! [4 y" b8 V. [) i( q
  69.   va_end(ap);
    & M7 E2 h7 h- a
  70.   length=strlen((const char*)usart_txBuff);; g: U! \1 u: h) }2 v* V
  71.   while((USART2->ISR&0x40)==0);6 H, `+ d) }* B: f  u% F
  72.   for(i=0;i<length;i++)7 |) y: a1 D  F; |2 E' r5 F
  73.   {# M& S1 @' `, P% y: {% H- }1 ^
  74.     USART2->TDR=usart_txBuff;
    9 @) I, J; q# }& N4 M8 X7 @8 p
  75.     while((USART2->ISR&0x40)==0);
    4 a8 m; v3 Z/ o1 M
  76.   }
    6 u7 v3 G4 W& ~3 F+ E, C9 ~
  77. }
    " o- I4 K  k. [) P7 A

  78. & X5 e2 U' B7 f) D, P0 }' K, L. `
  79. /* USER CODE END 0 */
复制代码
9 b, n8 H! D) O+ V# ?+ u( r
3、main.c中添加如下代码
9 v+ `# _/ D# i% A$ d3 p0 t2 n  G5 f3 O! S8 G0 n5 l( J
/
  1. * USER CODE BEGIN Includes */
    % r8 v/ n' ~& i' W+ C$ M. r
  2. #include <stdio.h>
    + V: v% l# Z  f5 V& ^  `# _# `, r3 l
  3. /* USER CODE END Includes */
    * W, X8 d, O) P$ p; f! S

  4. ! x8 c( l" p" e# y1 K/ b1 O
  5. int main(void)5 k2 ^4 j, h  n# ~8 e
  6. {# B6 k6 w( Y8 @4 W% T' s1 ?. C1 S8 S
  7.   while (1)
    / C3 |4 b) G2 N4 K4 K& V: \
  8.   {
    ( @8 V4 {, X/ U2 w/ g# b
  9.     /* USER CODE END WHILE */- _  [* |& z7 j, B
  10. % X' X# T- v: U& \
  11.     /* USER CODE BEGIN 3 */+ d0 _3 Y; l5 C. N% O
  12.                 HAL_Delay(1000);4 ]' s0 a0 U  T/ Q$ v5 k! }; }
  13.                
    0 N* F* M. P. A% F
  14.     USART4_printf("This is the signal from serial port 4.\r\n");
    $ e5 x" W; m$ e4 a6 b
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    / X; b- k. `7 ]6 ?8 Q6 I8 z
  16.     USART2_printf("This is the signal from serial port 2.\r\n");8 D0 w/ Q6 ^- L2 B6 S' a. I
  17.     printf("This is the signal from serial port 1.\r\n");  
    ! X  f0 r% n" p
  18.   }
    ( z  m8 F  V. E$ {( w6 i' U
  19.   /* USER CODE END 3 */" E3 k; W- D, T2 m; o) p0 t
  20. }
复制代码
6 u& i/ B. s. C* L
4、最后编译,烧录固件,串口输出如图
! M0 K& R& J3 b3 D: v/ c4 H5 h; d, i; F/ \1 I

/ d6 b2 [( s6 |' g# v3 g. K* T, o; I% ?8 R, V3 i1 x; J6 V5 S
20200718211759162.png
赞 收藏 评论1 发布时间:2021-11-8 17:09

举报

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

学习学习

所属标签

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