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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
% ?' y9 ?0 a3 o: ]" C0 m% g
/ L# |+ w1 C1 i2 F& @新建工程
: s  x6 F7 A, m% Y( @# M1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE1 m+ ~4 n) R5 |* Q/ ^

' O$ I6 S9 r: R$ R# ^  ]
20200718203500751.png
- r- Z5 q" [) B- S/ |- S7 j* P

; W. i- G# t; k, N0 t$ U
20200718203520493.png
" i7 p; _7 F7 q$ W8 s  B3 R

% t  n( |* m: ~$ C2、 设置时钟树,HCLK=64MHz
! A9 A% K6 u/ Z8 w/ F$ h4 C' `- T1 J' E  O/ F) U, N& a+ H
20200718203629892.png

% ~3 X- N, W' p  F
, G+ m0 Z; x$ c4 `6 m3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX: H0 `% _9 W5 l0 [& S
% {" e1 i. W) O
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1) q( R7 A' O: _  T5 q& W3 ?( z* q" [5 U
0 g; J1 Y$ m& N  b; L
20200718204428382.png
9 O. C8 k' L  @  j. b5 C

$ X* x( Y/ r+ P4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
' q6 C9 b- |) p" K0 I! |( B* B* C7 e: I/ M- Q6 J
20200718204945809.png
1 v) g: m# w2 h0 E: d) X

9 k6 \  {6 f0 Z7 F' R5、 项目管理填好信息。生成代码"GENERATE CODE"
1 J- R. \. `" L; B4 z  `
3 R, K" A$ g* c( j
20200718205222483.png
0 x; N' M) [6 W4 k% D6 v

9 L( T& o% }# a8 e- p& `# c
2020071820534722.png
4 L% u: c" e$ e) A+ g
: h  F+ o/ N8 h- ]
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
1 e4 X9 W. b  N1 H' t6 T. w6 Z) D2 b/ g; J! e" k: b/ r
代码部分
( |+ i- e+ T9 b8 g: t1、usart.h中添加如下代码
# n* M' o& z3 T( o  a
5 |/ l" y0 a) s3 J
  1. #include <stdarg.h>
    , a4 ?: ~0 a. u. M

  2. 2 v+ o4 F  T: z! f- \, ]* y
  3. /* USER CODE BEGIN Prototypes */" W0 i  B$ B+ u$ j  s6 h( d1 s: t

  4. " |5 R: l. c; g4 x
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数
    * K( d! {; V* p9 `
  6. void USART3_printf(char *fmt,...);
    5 v* T! [* N" A1 |
  7. void USART2_printf(char *fmt,...);6 G+ T2 g9 ~$ ~% F
  8. ( H1 ^8 F/ ~4 }7 M* ^
  9. /* USER CODE END Prototypes */
复制代码

1 @) P: A  j; X3 D, j7 K$ f2、usart.c添加如下代码
' F4 u6 }# t' r- r1 x5 i  I
1 d  H* f0 e# Z
  1. /* USER CODE BEGIN 0 */, _+ X+ ~1 a* ~3 d

  2. 3 [3 h6 A' X3 X5 N% Z: u/ h, T9 k8 d
  3. #include <stdio.h>$ i- e3 a4 M0 u! h9 I# B- v8 j$ t
  4. #include <string.h>
    5 L/ A8 u5 r9 |/ w- t  }
  5. #ifdef __GNUC__' J, p/ T* X  Y+ e- h
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    ! D( x+ I1 M2 O
  7.      set to 'Yes') calls __io_putchar() */
    * Q# L; l9 }1 [/ ^2 g; M; ?) B
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    : B2 G3 E2 T0 ^+ C, S" N
  9. #else
    ! s  A! x7 A6 u( Z( M# ~" |5 [+ t
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)7 L+ ?! }3 h, R* V8 V6 z
  11. #endif /* __GNUC__ */$ {) w0 p! Y4 I
  12. /**; y; _: n8 B" G& O9 R1 S
  13.   * @brief  Retargets the C library printf function to the USART.
      V* W7 v7 L$ I! b$ B( t
  14.   * @param  None2 u) e- z( i$ R; q8 }
  15.   * @retval None- b# e0 ]5 F$ b4 u- W
  16.   */% n; k5 a2 U0 o* a4 J1 l2 P
  17. PUTCHAR_PROTOTYPE
    + w( O; n$ C( \1 F! G
  18. {+ N4 c6 n8 j  F+ x& s* L
  19.   /* Place your implementation of fputc here */
    2 R/ ]3 e6 m* i# t
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */9 z* X. S3 y# [. H  O  G& Z
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);! }0 o$ H; E* g& B
  22.   return ch;& U* r* v9 }4 i0 n
  23. }
    % r9 G2 q% i! @; M' ?

  24. + g! U; G( k: A7 ~
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节6 x! Y9 g* J+ w0 E+ w
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区
    " }. ~6 i8 f4 ]* g
  27. 9 U  {6 l# V& w& K6 `" P: s
  28. //usart4的printf()
    ( l1 v2 c' I. O/ v# c1 @0 d' H
  29. void USART4_printf(char *fmt,...)
      Q6 h- T' n& Q# D
  30. {
    ( R9 P+ ]+ `9 ~; D1 E' l1 M
  31.   uint32_t i,length;, o3 ^. Y% M5 `
  32.   va_list ap;
    : R- s4 L- W8 w5 d
  33.   va_start(ap,fmt);) X. C) K2 P: D5 v
  34.   vsprintf(usart_txBuff,fmt,ap);( c2 X2 H; O9 K- j' z# C
  35.   va_end(ap);# V8 u7 w0 T  [# v5 }! o- Y8 L
  36.   length=strlen((const char*)usart_txBuff);; ~. B8 A5 ?' G6 `
  37.   while((USART4->ISR&0x40)==0);
    - d5 D9 @/ q. m
  38.   for(i=0;i<length;i++)
    $ Y0 B6 {, l' w  y4 l
  39.   {$ {* n+ j5 J1 X5 @7 A( p% k% S8 n* ]8 @
  40.     USART4->TDR=usart_txBuff<i>;4 c' ^& \- a1 c1 w/ B
  41.     </i>while((USART4->ISR&0x40)==0);
    6 s5 `2 Z; p0 p( U- L
  42.   }% Z* W: [% Z4 N* Z) d
  43. }
    / t7 e: N2 E* [0 E

  44. , T$ X; I" Q* T* ^0 ^8 N: H
  45. //usart3的printf(), ~2 l. l# |7 o% T
  46. void USART3_printf(char *fmt,...)
    ; Z8 L( J; A$ q4 O$ g
  47. {0 A+ ^$ {+ `, p: J( j3 Q" U7 s
  48.   uint32_t i,length;
    ) O  M' W" M; S) H! ~0 k* w  A. ^
  49.   va_list ap;5 L1 a' u  U( F# O
  50.   va_start(ap,fmt);
    ; `% S1 Q5 u  D5 X+ r3 G8 z" H
  51.   vsprintf(usart_txBuff,fmt,ap);, S% Z+ w8 y, |" v
  52.   va_end(ap);7 q: w( c) m' z1 T. h* t3 o
  53.   length=strlen((const char*)usart_txBuff);' B0 D3 }/ e3 X* Z' H/ U
  54.   while((USART3->ISR&0x40)==0);
      ]/ a, \% y9 r" y7 o
  55.   for(i=0;i<length;i++)1 v/ j( [" g2 o: {) C1 h
  56.   {- J8 h( G( N3 H& A; K6 t% R' O2 P
  57.     USART3->TDR=usart_txBuff;
    2 t& g7 n) f) e0 g3 J) Q& Z. w4 }
  58.     while((USART3->ISR&0x40)==0);- p- w2 v  K2 {& v+ O1 D+ u4 k. ?! {
  59.   }
    - b  b6 I. L. h* Z2 v& E
  60. }
    8 q5 _! d2 Z/ V" {

  61. ( S3 H! z, D: z: M" \
  62. //usart2的printf()
    . |, T! k1 Y  o
  63. void USART2_printf(char *fmt,...)2 }8 _, _- D9 R  ?
  64. {+ t& ?: x/ e# c" y+ m, Y7 g
  65.   uint32_t i,length;
    0 E9 s4 ~( b; i6 x/ W
  66.   va_list ap;
    , D8 R. l) E4 s- ^8 z
  67.   va_start(ap,fmt);
    & Z( t, ^+ J5 D$ `' Y+ h
  68.   vsprintf(usart_txBuff,fmt,ap);
    : m; T5 ?. }" R" w5 N4 y3 d" C
  69.   va_end(ap);1 a4 L' j, _- O3 t; a' V3 V
  70.   length=strlen((const char*)usart_txBuff);
    . z- [  r+ a7 n
  71.   while((USART2->ISR&0x40)==0);6 o. p7 T! m1 m5 T' @# N% V
  72.   for(i=0;i<length;i++)  n9 f) m: X# e0 `
  73.   {8 R8 G9 @/ v5 P
  74.     USART2->TDR=usart_txBuff;
    , i  r3 _) m8 \: _. p- i" G* U
  75.     while((USART2->ISR&0x40)==0);
    ) u5 Y  Q8 ^' C6 u) V
  76.   }3 v+ h# r1 z7 t% I$ ]  G9 }
  77. }' C& `# H, w- P

  78. ; R4 p$ g, y" V/ b$ W
  79. /* USER CODE END 0 */
复制代码
1 p7 `/ s  E/ h) Q4 a! B. u& V+ T
3、main.c中添加如下代码4 ~' l; C+ Q* L: O8 u4 o& a

0 p, e6 x4 K, \& D1 @; p/
  1. * USER CODE BEGIN Includes */
    ( }0 y" t1 D! o+ S) t
  2. #include <stdio.h>+ {' r/ F: u4 |$ \+ F3 S1 P8 `
  3. /* USER CODE END Includes */
    6 K1 q. D% }( J5 f3 E+ P0 w
  4. . ^; O1 s- R6 \& e7 u; i) w8 E
  5. int main(void)
    ( Z% `% y( A* `2 Q  f
  6. {
    4 f' B- W2 Z; J. d! m1 p( z4 {
  7.   while (1)+ |4 D" T+ u3 k) v, K! b' H
  8.   {
    - d3 [4 q3 H, l- u& I' A4 E8 b, N
  9.     /* USER CODE END WHILE */$ A3 t+ v% I" O6 d) @
  10. ) g' t; @* O5 P
  11.     /* USER CODE BEGIN 3 */+ Q. d2 j9 x! ?' N0 f
  12.                 HAL_Delay(1000);
    2 q2 ~. v1 f& g7 ^7 c( ?4 Z
  13.                 0 P# Z' s  _* k% Y- m( A
  14.     USART4_printf("This is the signal from serial port 4.\r\n");7 c$ L( B5 p# x- h( s) U0 j% d$ A
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    : P% V: T) `: t% R* w/ z9 f  e
  16.     USART2_printf("This is the signal from serial port 2.\r\n");' O3 d, k6 x2 b8 X" i# s2 N
  17.     printf("This is the signal from serial port 1.\r\n");  
    & c# Z* C2 }% |7 v
  18.   }
    * h+ Q6 `9 |& P' _. u0 X8 d5 E7 @
  19.   /* USER CODE END 3 */
    & Z& v1 [+ K, w  A7 D. l
  20. }
复制代码

" Q' x" N4 i! P3 x9 z" q0 p4、最后编译,烧录固件,串口输出如图
! V0 ?8 ]5 x$ [- E# g0 u' [" q7 j9 m  N, }/ H+ i1 o
2 d+ i1 A6 n5 ]$ b# ^+ J% N

: T% e6 J5 i8 l3 l
20200718211759162.png
收藏 评论1 发布时间:2021-11-8 17:09

举报

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

学习学习

所属标签

相似分享

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