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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。  L5 L7 E$ G. X6 Z8 h1 c* ]! k
1 b1 m  [' N& Z% l3 m
新建工程$ B& Q! }- D5 Q2 d. y! i. ]7 |' J8 R
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
7 ]/ e) Y- t2 h. K: ~# X3 D( N5 W% Z2 N2 Y
20200718203500751.png

8 G: F0 |' x3 ^% v% Y( W5 u0 w! P9 b3 s' q- _1 h
20200718203520493.png

) g$ X$ Y) @9 M: z
: h7 P- W, b  Y8 ]2、 设置时钟树,HCLK=64MHz
# \, U/ k" O# ^) [
( k/ ^2 Z; h5 V  E4 @8 |; B  Y( W
20200718203629892.png

/ U* e4 }+ D/ R* p& x$ A' s6 A. E
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX/ ~3 X4 C- c+ {0 z: Q4 I) C8 Y) _

0 k, o7 H: `7 J% o6 B) `. uUSART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1% p8 _7 q1 `0 Q1 v) A! k
0 x" R# k1 ]  X$ J* J
20200718204428382.png
' j$ D& A- ]( I
: V! }* ?) Q% t( {. b' D
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
( z  @0 X4 Z$ e2 D& _+ g+ Q3 H- I% h3 h5 ^  b
20200718204945809.png

. N& ?% K) e: K
$ O6 a$ W# r  x5、 项目管理填好信息。生成代码"GENERATE CODE"2 N+ K! p4 N' g. @1 C
; ^/ k$ b+ ~* Y8 z" s( T
20200718205222483.png
; P( H6 d$ b+ G8 ^7 w9 R" Q
( }/ y) E! `& p: S
2020071820534722.png
2 c# e5 g9 K  l

& [' \5 ?- l1 e9 M! ~6、使用MDK打开工程,debug选项中勾上“Reset and Run”5 U7 V& T2 G8 n+ F$ E6 j9 n& h

7 Z5 O% w0 B. ^8 r3 X! f8 n代码部分
8 v+ i+ F0 o( z7 p1、usart.h中添加如下代码4 G9 q) k& \3 q: ^: I
5 F8 `+ r$ u; |
  1. #include <stdarg.h>- V( t) N: g" |) B  B
  2. : I- M& T# M5 p) `% ^2 Z
  3. /* USER CODE BEGIN Prototypes */
    , a. `) n( R3 b) o
  4. $ s6 d; ~! i- \) n# P
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数
    : m" l* W7 ^$ j) `6 v$ F1 \
  6. void USART3_printf(char *fmt,...);
    4 n% I4 D2 m# y# a- }- W
  7. void USART2_printf(char *fmt,...);7 W; N0 o  p8 q) b
  8. 9 {5 c# Y8 t0 w. |8 t
  9. /* USER CODE END Prototypes */
复制代码

2 o: F# z% [& a0 U% p2、usart.c添加如下代码
2 T/ T. p" J) t" g3 Z6 R
: U" `9 B% U0 S7 j# [& E" M
  1. /* USER CODE BEGIN 0 */
    ' c4 y1 F* Y3 s% @3 J+ H0 y$ R
  2. ! G1 g% S$ _8 d( F5 f) c
  3. #include <stdio.h>
    . D/ h0 p" M7 o
  4. #include <string.h>+ m, w4 r/ D3 d& \" Y3 ]
  5. #ifdef __GNUC__" t( A2 l. m. e
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    ; I' u- x  I0 n& `8 X
  7.      set to 'Yes') calls __io_putchar() */4 v8 H. h' m* O4 l
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    $ _9 Z& I1 w! X8 n, L
  9. #else" i2 P3 w! Y# ?6 t( e/ A* G3 X. A
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    " S* O6 p- ~7 n4 y2 A
  11. #endif /* __GNUC__ */7 ^* w1 C7 T4 X6 t* }4 D3 w7 z
  12. /**; p, D  Q+ `3 d8 f5 R
  13.   * @brief  Retargets the C library printf function to the USART.
    ; [; u9 @1 Z% v1 X
  14.   * @param  None, e$ t) |& `# r; S
  15.   * @retval None3 h0 h- \$ k2 {) J( y5 z& d# m
  16.   */
    4 n& N, A2 ^6 w  c
  17. PUTCHAR_PROTOTYPE
    5 J5 a! `4 \( H! ]
  18. {
    2 J8 Y" n+ ]4 Z; I
  19.   /* Place your implementation of fputc here */' w! y1 N0 W$ ?2 D  G
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    * P8 |( e0 h% ]% O& ?1 S) W
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    8 J. W, ]3 L- b- j3 O5 n
  22.   return ch;
    + l3 L! ^, y) \, w
  23. }' _% _- D* S5 k8 n% S5 W) h

  24. + d/ ~' A4 v6 M$ d* q/ }/ ]0 ^
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节1 N5 k# P' |, `0 m
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区' ^2 i8 U& ?5 ~0 _9 a
  27. , D1 ~% a3 O- ^9 _& R9 r- ^, T8 M1 L
  28. //usart4的printf()
    . H1 Y9 ~9 S  y1 G2 e) ^8 Q% M
  29. void USART4_printf(char *fmt,...)# Z5 A0 D% w6 D
  30. {
    . e, ]- O  e+ ]/ E/ w  w, V
  31.   uint32_t i,length;0 u9 W+ K8 j7 ]1 s  H9 X% p, U, j
  32.   va_list ap;$ V/ ^( J8 Y  `0 V; \
  33.   va_start(ap,fmt);
    / ?# W9 i0 L* K$ m: I
  34.   vsprintf(usart_txBuff,fmt,ap);5 r6 Y/ n0 u4 `6 f6 w) O& @/ [
  35.   va_end(ap);0 q/ a; x3 u' L
  36.   length=strlen((const char*)usart_txBuff);; `# H0 n, t, H
  37.   while((USART4->ISR&0x40)==0);3 r' {# ^* m" F' A% H4 I; J. O
  38.   for(i=0;i<length;i++)7 _" H' |# L% D4 W7 c
  39.   {
    & O% u2 S1 e: Z$ @) j; E
  40.     USART4->TDR=usart_txBuff<i>;5 S8 D. e2 {: |1 G% b$ D
  41.     </i>while((USART4->ISR&0x40)==0);
    ) v$ T; ^  c+ Z0 H- S
  42.   }! c7 s+ ^, W" U3 s1 D6 d6 r
  43. }' G1 n( x; U! _' C0 p* x
  44. # `2 Y  }$ |# k1 }8 }
  45. //usart3的printf()3 ]3 G) O5 b1 m. n
  46. void USART3_printf(char *fmt,...)
    2 p$ o1 \& \& w( d
  47. {
    ( e( @0 y5 `$ x# O! I+ ^5 V) ]5 v) r" A
  48.   uint32_t i,length;
    % B) m! D+ [5 ^9 G/ }) X
  49.   va_list ap;( h" b; [; @6 _+ k+ S
  50.   va_start(ap,fmt);  e# g( w: k& C
  51.   vsprintf(usart_txBuff,fmt,ap);3 B: w0 m9 N+ N9 s/ x
  52.   va_end(ap);
    ! [5 J" X1 t( n& S. {" s2 R
  53.   length=strlen((const char*)usart_txBuff);  p1 B/ o* @% [
  54.   while((USART3->ISR&0x40)==0);
    3 }& ?. f2 `2 l) v  ^: L- _
  55.   for(i=0;i<length;i++)
    ) s4 ?7 c; U! U5 l' U+ k( }
  56.   {
    & _0 N$ l+ e+ O3 h9 O7 [0 A
  57.     USART3->TDR=usart_txBuff;" D- G; ~& I, y3 n1 h) D" \
  58.     while((USART3->ISR&0x40)==0);" z5 ?# x7 ~) D: R1 X0 i
  59.   }
    & r+ o6 y. b# b& M4 e9 d
  60. }
    3 d7 t+ Q& m, U& F! C7 U  a$ ~9 p

  61. + K5 t9 w! U; F4 ~( P, p# a4 P
  62. //usart2的printf()
    6 W0 M( s( V5 L( ?/ A% b+ j8 [  r
  63. void USART2_printf(char *fmt,...)
    3 D1 C( N! V  E$ v
  64. {
    + M. N! b  C  Q
  65.   uint32_t i,length;
    4 Z0 i, ~  W1 W7 i9 c# O9 r" G) V8 H( ?
  66.   va_list ap;1 k; M8 b8 f9 j4 K5 w3 ~
  67.   va_start(ap,fmt);
    ; k5 @* P+ n' E. Q! C  o9 y- n
  68.   vsprintf(usart_txBuff,fmt,ap);
    % Z8 O& p% f+ Z9 O( O
  69.   va_end(ap);  G% u  p' f+ }4 b: _7 S
  70.   length=strlen((const char*)usart_txBuff);
    / J8 u( C7 `; Y, H& X! {
  71.   while((USART2->ISR&0x40)==0);( W' {4 n  i0 c, x. h* Z. C! @9 E
  72.   for(i=0;i<length;i++)! p, X- Q: B( b. Y+ B$ A. [1 q
  73.   {( b( d* V) o" _9 a; h, h4 |6 M) [
  74.     USART2->TDR=usart_txBuff;. e: P: P  x) b0 s& s
  75.     while((USART2->ISR&0x40)==0);& v& A  G; v0 P1 U
  76.   }
    $ F% l/ ]0 T6 ?0 H+ o
  77. }
      ]( X3 }' I# V8 b9 q

  78. & Y- c/ J3 L, V# F
  79. /* USER CODE END 0 */
复制代码
5 M* H4 v( E8 P" ?# f2 W( r
3、main.c中添加如下代码- r8 r# Q6 a& a5 o
; [+ Z) Q2 ?) ~2 R/ j
/
  1. * USER CODE BEGIN Includes */
    . v  N) F1 A& R7 Z: x* W; n* u
  2. #include <stdio.h>; i* H5 g4 L: R9 d. Z" q+ Q7 k3 x
  3. /* USER CODE END Includes */2 n* D0 v7 Q; o  Y

  4. 4 x' S! H' @0 K. N8 V5 G2 M
  5. int main(void)
    ) m# L! A$ M) F
  6. {5 O  V* P1 {( ?' y2 V
  7.   while (1)$ {! |; f) U# O* f
  8.   {
    ; Y) r# @1 y) A! w
  9.     /* USER CODE END WHILE */' e* C& `/ @0 i8 M" i
  10. ; P6 T2 A8 B, B8 {& R
  11.     /* USER CODE BEGIN 3 */
    $ i+ Q% a- H1 C9 }
  12.                 HAL_Delay(1000);
    - s& A7 C+ Y! e2 a: K
  13.                
    8 v2 \9 h- A5 x, N! b
  14.     USART4_printf("This is the signal from serial port 4.\r\n");
    $ _% Q% K0 p7 f4 i- j
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    & L5 X4 O" ?8 r8 W* g7 B
  16.     USART2_printf("This is the signal from serial port 2.\r\n");
    . [8 m" a- L- Q* @# Z% m
  17.     printf("This is the signal from serial port 1.\r\n");  
    4 _$ ~- E+ I3 Q1 S
  18.   }
    $ I, M% s, a8 R6 k" l
  19.   /* USER CODE END 3 */
    ; u" }: f, a" w3 ~6 |
  20. }
复制代码

! e  h1 F0 O! H, c2 f" l+ h4、最后编译,烧录固件,串口输出如图- d; B8 I  s. m: @
8 @, |- ?7 R/ u3 r" Y; Q# `
0 w6 i' J* b% w8 Q. R/ ]; a9 m
2 e" I0 ~. d1 C) B; J# z
20200718211759162.png
收藏 评论1 发布时间:2021-11-8 17:09

举报

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

学习学习

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版