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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
3 i' g. B* ^$ r6 T: T4 d" l$ ^2 m$ F; ^, B6 P7 y
新建工程: S; X( G) i( t, ?6 M+ Z8 x
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
9 a; _7 j# }9 Z! p9 p& \
. ?: O8 }2 n4 t# e2 O
20200718203500751.png
' B; g( x" |  H, F) s( h

4 b0 x; l. Y6 o( A* h
20200718203520493.png

8 k+ @4 A. Y1 U, A0 D9 q
) @% M; V0 O0 U2、 设置时钟树,HCLK=64MHz
' C5 b# ~4 h0 T+ F! R& U% {1 G2 q1 L9 ~
20200718203629892.png
. \- X3 U: z5 l, N

& `3 f* A2 f, H2 _9 _! d& D  I3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX- Z4 x, a! ]4 p( a/ A! p) }2 [
' I* c0 B: C/ L
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1
7 ?9 F3 a( o9 n( J
! |; [: q* N3 r3 Y
20200718204428382.png

1 N2 C1 N. C% P8 R9 I1 o, a
! \  l6 Q. d  N9 \2 R5 d4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1( Q! |# o/ q& {: |  v
; f7 v. ]* [% ]& A6 z# g$ n8 l
20200718204945809.png

; V" u1 P: n# p: F) j( Z
/ ~/ |8 ~: m: w. z+ q8 x+ Q5、 项目管理填好信息。生成代码"GENERATE CODE"
' f2 s8 y! x& j0 a: k& W. A6 R" w* u' H) D, m# Z
20200718205222483.png

3 |( }/ Q2 R0 i( G  X6 z0 Q( ~* B& y% X
2020071820534722.png

4 d, Q7 S- L% @( c$ R
  L& X. R3 h* U- s/ n* e8 F% c6、使用MDK打开工程,debug选项中勾上“Reset and Run”% k) J+ W8 O) a7 P0 F
% z) q; h& v5 n8 e3 {. X% Q4 |
代码部分% I' G6 n& h4 M$ Z& G+ R! l; _
1、usart.h中添加如下代码+ a/ `2 D( p0 H9 c- |  d
. x0 d# F, j- N5 r
  1. #include <stdarg.h>
    ! b( U3 }* _. \: G6 X" o

  2. # g3 p5 ]; P& S& h* H9 w  u. R
  3. /* USER CODE BEGIN Prototypes *// y, e: P6 M2 ^9 G8 {. F

  4. # B4 U6 C' `2 \/ k2 m5 W' e- m
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数7 Y; Z3 K) {% o; d' B5 y9 c% S
  6. void USART3_printf(char *fmt,...);
    ' U- R0 _& |5 _5 e; f5 e
  7. void USART2_printf(char *fmt,...);% p; B& j- X  B- Q& K
  8. ) P* h$ f0 S5 ?5 c; ]; S
  9. /* USER CODE END Prototypes */
复制代码
; `: i0 J& `& l+ [+ e
2、usart.c添加如下代码
* L/ X; ]6 `1 {/ K! e, Z- [) I+ a& `1 ^# u3 _8 P
  1. /* USER CODE BEGIN 0 */; u5 j1 `$ }% h  z) I8 W% A/ ?8 I

  2. ) I' G- k0 k2 q( ~& ?; k7 T
  3. #include <stdio.h>
    . B% Q- n+ m: s
  4. #include <string.h>
    3 e. E- I& z" M, \  W
  5. #ifdef __GNUC__7 `( [2 S  G8 E6 N. b
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf! q0 l  s$ C! N4 d3 V* j
  7.      set to 'Yes') calls __io_putchar() */0 ~5 y% T$ w1 D+ N- z: ^7 {$ Y: U
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)2 X, Q* m1 T, ^0 X% }  c* ?9 e
  9. #else- l; ?- N( `4 i, b
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f). A& l+ z! A! R1 T+ ]0 l8 M/ o
  11. #endif /* __GNUC__ */
    * v& z& T- L  k; ^; {. |
  12. /**
    5 l, f) [! U5 b
  13.   * @brief  Retargets the C library printf function to the USART.
    1 J: P1 p* U1 G: G8 R. c1 Y. \
  14.   * @param  None$ y0 l; d0 G6 B& h* t$ p+ x9 M
  15.   * @retval None* n; r/ V4 v7 }" j
  16.   */% i8 o& H" S& t8 t' z5 c
  17. PUTCHAR_PROTOTYPE6 t5 B- U% s. k0 j$ m
  18. {- {, _6 \- F# G, i- s, O
  19.   /* Place your implementation of fputc here */
    9 j$ N3 e5 [* w  [; @+ \
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */6 s* m+ g; C; x: e& ^' f& e4 r! n6 {0 g
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);: \' Y$ g* g4 S2 y
  22.   return ch;- X. H) t* b2 B# n! w$ ]$ u  a& H
  23. }
    & |3 [+ |( p( S% V
  24. : o" |; ^" u; b- r
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节
    6 D  G3 d6 w/ O7 V2 J3 b
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区0 d7 e7 ], y) A; z8 a: Q
  27. 5 _" a6 W" j3 l
  28. //usart4的printf()3 \* i! U: @  c* y& \/ @1 r
  29. void USART4_printf(char *fmt,...)
    " X% N% X% t& ~; s3 Z; W; L
  30. {, L6 k! h& d+ h* r7 ~5 r3 k
  31.   uint32_t i,length;9 F( |8 m8 A* a- n+ F
  32.   va_list ap;
    & j1 h8 E& A) E) n
  33.   va_start(ap,fmt);
    3 l0 M5 Q. ?+ b" }
  34.   vsprintf(usart_txBuff,fmt,ap);
    + _. t; ~8 d' t) }" X7 P
  35.   va_end(ap);5 F/ f# `2 K2 L; p( B, `9 y
  36.   length=strlen((const char*)usart_txBuff);
    3 u# t' X2 t+ M* f, j/ [
  37.   while((USART4->ISR&0x40)==0);
    9 j# r! i) {$ V2 T# q9 a, V: H$ S
  38.   for(i=0;i<length;i++): l2 T6 @; ]' M
  39.   {$ S( D1 q/ d/ Q1 ]/ d: U+ A1 r! j
  40.     USART4->TDR=usart_txBuff<i>;
    + k# F0 \% f" x6 l. c* O' c
  41.     </i>while((USART4->ISR&0x40)==0);6 d& Q% m( N' n/ Q& G0 z
  42.   }
    $ R/ y* l6 b5 ~: H9 s/ W) r% g; O% `
  43. }+ x' ]- p3 x: @, }5 S2 Q, |

  44.   G% h1 D( _! S+ R7 [% O
  45. //usart3的printf()
    . g1 w5 Y! ^, h, J" F
  46. void USART3_printf(char *fmt,...)
    ( b" T+ ~  g6 e
  47. {
    / N% j# L) L! U; }7 h1 x( I
  48.   uint32_t i,length;
    ( I, t- \/ s' n6 L9 e" B0 [% w
  49.   va_list ap;
    / b& q3 w9 C7 z) B3 n) e
  50.   va_start(ap,fmt);
    2 D5 Z' h$ R+ o1 [
  51.   vsprintf(usart_txBuff,fmt,ap);# a/ G8 U4 d% h" [/ c
  52.   va_end(ap);
    % k( b+ q9 [) s9 t
  53.   length=strlen((const char*)usart_txBuff);1 q5 ?* L& A. ~9 F+ i; x
  54.   while((USART3->ISR&0x40)==0);( ^) O3 S# i0 ~. N+ n, C/ ^. `- y
  55.   for(i=0;i<length;i++)( W3 o+ G& C* ]9 R- B2 l; g
  56.   {
    2 J3 K6 B- ~# n
  57.     USART3->TDR=usart_txBuff;/ m# y* j; [( J  n9 u3 G
  58.     while((USART3->ISR&0x40)==0);
    $ H4 W8 H# b9 H% B' V6 p
  59.   }; q! \  m. V& @* |
  60. }
    5 Y9 D3 i# e6 I$ x% U. z7 F( v8 C
  61. + Z4 ]( M6 I! t3 T$ a
  62. //usart2的printf(). ]2 x6 {4 t% K% g8 {
  63. void USART2_printf(char *fmt,...)! H8 Q2 @% o8 U$ p% v& J% r
  64. {# E' e3 F$ p- _4 g( X
  65.   uint32_t i,length;4 C; G5 t7 L+ I- d- }
  66.   va_list ap;
    + ~+ A) s7 C+ y0 N
  67.   va_start(ap,fmt);2 Q8 K! p7 A/ L6 }+ `7 a0 c
  68.   vsprintf(usart_txBuff,fmt,ap);/ g$ g# B6 U8 n0 P2 ]5 e( N
  69.   va_end(ap);0 C3 k( L$ p$ F& ~) T
  70.   length=strlen((const char*)usart_txBuff);
    $ Q$ I9 h# T9 {! R& o, C
  71.   while((USART2->ISR&0x40)==0);  x3 R8 O- X% L5 o$ ~) r4 e
  72.   for(i=0;i<length;i++)4 `6 E& h9 F4 j8 z/ B% t7 [
  73.   {5 c4 Y! h% ?2 N$ Y
  74.     USART2->TDR=usart_txBuff;
    6 `2 O& g8 B- q, Z
  75.     while((USART2->ISR&0x40)==0);
    . e) L5 b' Q# v6 u4 W; L) f
  76.   }
    ( _7 j/ \9 p: l
  77. }
    6 x& L! B! i2 u1 ?" g
  78. ( h+ H5 R5 D& K. I' `
  79. /* USER CODE END 0 */
复制代码

3 t  r9 C3 T7 l5 R) j& m3、main.c中添加如下代码  @  k0 B/ J' C
9 P/ m! m- g. L( N% `
/
  1. * USER CODE BEGIN Includes */# ^& R( y* q' I3 i1 u8 c3 a
  2. #include <stdio.h>
    ' R3 h7 p1 b! p7 d  K: G( [* s% R
  3. /* USER CODE END Includes */' d! g4 B( B: S; p

  4. 6 m' j, y$ R/ z9 H# ]
  5. int main(void)/ l$ S9 T7 I) D0 u7 s5 H5 l, b
  6. {- K4 h. R, z/ {, J; a9 C) e
  7.   while (1)
    + Q/ z7 `+ V2 {
  8.   {2 X( j% ^% S4 R) Q& S# h9 u2 x$ _
  9.     /* USER CODE END WHILE */
    $ v2 k  p2 d' ~# r* G, c4 O
  10. % R1 w: v- V0 z" E2 P' y1 o
  11.     /* USER CODE BEGIN 3 */2 U1 a8 q- p9 d) @) f7 _9 V
  12.                 HAL_Delay(1000);
    9 P4 e, a. D% [# p! ?7 ]
  13.                
    , c% o7 A! }, u
  14.     USART4_printf("This is the signal from serial port 4.\r\n");
    3 u3 r* u8 h' M: i
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    / X- I9 u: X# ^% T( ~  e2 X+ T
  16.     USART2_printf("This is the signal from serial port 2.\r\n");; w$ D7 Z) C( ^/ S) f# k
  17.     printf("This is the signal from serial port 1.\r\n");  3 O  ?6 E+ }' q& ], V
  18.   }7 d/ U7 d+ |' `" u( O3 K! t; H
  19.   /* USER CODE END 3 */
    # b& p% C! |" d& D1 R/ _& w8 Q1 M
  20. }
复制代码
1 m; h5 Z- H, }# p; |2 R2 a& Z
4、最后编译,烧录固件,串口输出如图- i" g, _; U* A
& q* X1 E' q2 T5 @) I3 Y" ~6 g

- u2 ]9 Z: ^$ g. m) n3 T. `# s: V% ^3 P$ Z, c
20200718211759162.png
收藏 评论1 发布时间:2021-11-8 17:09

举报

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

学习学习

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版