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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。  k0 [  I) L+ i3 F

, {4 h& S7 o: V7 x# |' r新建工程
) x0 ]( h+ h  {2 O% O3 b! ?1 f8 l1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE& y* s" K0 v( h4 ]5 L

: }  G, B; ]( Y5 W# h9 b, v
20200718203500751.png

3 G7 m/ x5 D# I; g: I' Z7 ^4 o6 d2 y1 T8 b) g
20200718203520493.png

( w/ O) i) [& T& ~& R1 f) H0 J% B
# l8 ?- i' v* i+ p$ t' G2、 设置时钟树,HCLK=64MHz
+ A. T1 K) x" b: J1 r4 m2 r+ |$ D
" y. u3 o# K3 Z; y4 r; B# o
20200718203629892.png

8 p$ P5 B, W* _( s
, I" a4 J# }* Q$ z& U# d7 h/ v3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX, _" G+ G0 ^; \/ V7 \6 Y

# }( l0 b# e2 s1 c9 H/ m6 Z& x% TUSART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA11 R0 ^6 [" w6 u+ A6 O  A

/ q0 A0 W$ m2 Z! X) R; T) Z
20200718204428382.png
: R7 U9 W, Z  u1 g

% y1 v' z$ @4 {4 i. t! R4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1" h2 p5 Y  s' K) e. Y4 m

; F1 m. @4 {5 D) D, f+ k
20200718204945809.png

0 M/ \- J1 f  t2 X1 ?) }$ N
9 O5 z3 T& _  N+ e, y3 F$ H5、 项目管理填好信息。生成代码"GENERATE CODE"# ?( T2 V% G* J
$ O2 m6 P9 K/ ]) t
20200718205222483.png

9 ^/ c" T9 o9 N! Z6 y/ F; }! D3 j- _$ `6 P3 N" r7 B
2020071820534722.png
- k" Y, \$ M) `. `2 m' d3 F
' Q+ r6 J; e" X( ~
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
: F7 D8 g8 P" t1 w
6 m" r& Y& m; A2 p4 c* t/ @代码部分8 p( t. r2 |9 D& |3 ]# ^
1、usart.h中添加如下代码
3 Q- k$ x: f) |. Z6 S1 s0 \3 p" t$ u/ ]) K- B+ I7 {# E
  1. #include <stdarg.h>
    ; R; `' g4 D0 y/ o& _
  2. . ?  r+ [; q' M! H" ?; `8 T& D
  3. /* USER CODE BEGIN Prototypes */
    . C% f8 F- C& v9 Y% P; w1 ]# [
  4. 4 X& ^- M* W" s+ @% f- ?
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数3 D, a' d# [% p
  6. void USART3_printf(char *fmt,...);# r4 z' p. Y+ O: ?
  7. void USART2_printf(char *fmt,...);
    ! _3 {9 s; v2 w. r2 c+ j% `8 r- J
  8. 1 c% R$ N& P! g& y
  9. /* USER CODE END Prototypes */
复制代码
) n/ @" S! ]) L- O- n; i
2、usart.c添加如下代码9 {7 N" m8 h' P; k( T# f. Q! ]$ y% A
1 K) i7 G$ G+ \1 ^3 g
  1. /* USER CODE BEGIN 0 */8 \; }  x! C0 |& [

  2. # `1 r; d% p* ?/ q5 u; G9 g
  3. #include <stdio.h>
    : Q) J: M( ~7 i) D& c
  4. #include <string.h>: p) I1 t4 m( c/ T/ q0 H4 ?
  5. #ifdef __GNUC__6 p8 l% z( m' {7 c0 q6 f4 \
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    # |, ?! c7 r8 c! `' M% i9 }
  7.      set to 'Yes') calls __io_putchar() */  M' X- ~' C2 l  M" N6 Z: P
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch). @0 o3 o. n( P2 t, l1 d* n
  9. #else  i$ [' |, i; T. H
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    . U! r0 M9 U$ W& o
  11. #endif /* __GNUC__ */
    : d* W4 I) y4 H  t8 R8 T( @
  12. /**6 p# ?& T+ p4 E4 J
  13.   * @brief  Retargets the C library printf function to the USART.
    : k7 B& x5 {+ ^7 S' W$ T! D
  14.   * @param  None
    . \3 A9 P  w; w, o9 D, U1 ]
  15.   * @retval None' I7 O2 C( v( j! c+ k5 X$ f  ^
  16.   */. f% t% W1 Y9 A  _1 Q0 a; y
  17. PUTCHAR_PROTOTYPE
    % M4 w: L# w) Z+ Y$ n4 p2 D1 w6 a
  18. {
    2 m1 l+ r9 I6 q: s! n" P
  19.   /* Place your implementation of fputc here */+ g7 T4 \2 g3 [& I9 ~5 l+ X5 P& k1 ^! F
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */; N% z+ d& s$ {) \1 ^# W
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);! E$ e2 R& ]! h. D8 @# u
  22.   return ch;
    , f& V- u* ^, o
  23. }
    / |- l. l0 I# o. y" }4 p
  24. & S4 e' f7 ~& H% _; H
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节
    . v1 n4 G, M- w& s9 @
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区7 N: ?8 }3 _9 n
  27. ' D" {" t% G- W+ J6 y0 r; Z& x
  28. //usart4的printf()  Q4 V; Q) T1 G  s! O2 G
  29. void USART4_printf(char *fmt,...)! W2 ?% o+ `. b8 }2 L1 q9 K7 l) k2 u
  30. {, f( r# ?& i1 J9 A+ ~
  31.   uint32_t i,length;' Z- T8 G/ k3 Q  @8 L0 n
  32.   va_list ap;0 q$ A; G5 Y* M, J
  33.   va_start(ap,fmt);
    4 q% H2 n: R$ o$ S- S* F. @1 I& X
  34.   vsprintf(usart_txBuff,fmt,ap);
      |! `4 n  r( P. P; w, ^
  35.   va_end(ap);
      m: Q' ]2 ?6 v
  36.   length=strlen((const char*)usart_txBuff);7 y' @+ u4 M4 l5 z
  37.   while((USART4->ISR&0x40)==0);
      B' c; }- ]5 S2 C3 R/ s
  38.   for(i=0;i<length;i++)
    , s2 H9 K% d  \* `
  39.   {
    7 W) S. i6 ^. q& v& c7 G
  40.     USART4->TDR=usart_txBuff<i>;
    6 E3 o9 t7 X& a& z- i! C
  41.     </i>while((USART4->ISR&0x40)==0);
    9 F- q3 f4 q0 }4 h" `
  42.   }
    ( X$ w7 P" O- x+ L' L
  43. }/ K0 t; }7 H. l

  44. . J: e# i/ }. t* ?3 p& n
  45. //usart3的printf()
    . h4 B- p1 y9 U9 Z6 C3 B2 m
  46. void USART3_printf(char *fmt,...)# ~: w! j8 x6 q, O
  47. {
    1 z4 G& o7 t% M+ d, @& k8 ^3 s
  48.   uint32_t i,length;
    ' B& x. e2 h% |- a  {/ i3 c2 {2 Z
  49.   va_list ap;3 U  x: O- g8 }' M
  50.   va_start(ap,fmt);  d4 t  e' [! O1 l( j* D2 J3 P# ?% M2 Y
  51.   vsprintf(usart_txBuff,fmt,ap);; D0 s5 k. g0 w2 O0 I
  52.   va_end(ap);
    4 u8 d$ ^' n9 I  ^) V. y
  53.   length=strlen((const char*)usart_txBuff);
    ( r- J' j( J9 }* Q) x
  54.   while((USART3->ISR&0x40)==0);& [+ k0 h/ ?6 `$ y" S' g
  55.   for(i=0;i<length;i++)
    3 Y; J1 t2 O5 `3 ]
  56.   {; ~- N1 O: {" M1 e
  57.     USART3->TDR=usart_txBuff;! X: r" d0 o0 I- r; f$ O" r: q* X
  58.     while((USART3->ISR&0x40)==0);
    1 ]: h$ k/ w' j- d8 Q$ G7 i
  59.   }
    9 ~% G- K- P5 E0 @+ k: N! `( K
  60. }
    4 n! i+ C6 O& R& o
  61. 8 w* ~1 s  }1 o9 u/ s) l, s
  62. //usart2的printf()6 E( E# c! g) v
  63. void USART2_printf(char *fmt,...)2 A) Q4 s7 u! m1 D! V# ?
  64. {( P- R" B% \9 y9 }7 I) j
  65.   uint32_t i,length;
    ; S' i/ m! q/ g, t3 r+ b+ ~
  66.   va_list ap;
    ! {5 ~. y, Q( s2 j7 m7 f$ B
  67.   va_start(ap,fmt);( P: S: G% F, g' K9 {
  68.   vsprintf(usart_txBuff,fmt,ap);; {% ~; s8 b. r+ A$ h2 _
  69.   va_end(ap);; i7 Q! I5 A* S" r% {2 `4 m- f' Y  V
  70.   length=strlen((const char*)usart_txBuff);, c2 V9 {. s, j0 F( [* ^5 ^: a4 u
  71.   while((USART2->ISR&0x40)==0);
    $ m8 i: I& Q* |0 }! N) E6 [' H
  72.   for(i=0;i<length;i++)
    6 R" P6 j+ h) a" l. i
  73.   {6 Z& F: O1 |! S; V
  74.     USART2->TDR=usart_txBuff;0 [  b: b* _- t3 }
  75.     while((USART2->ISR&0x40)==0);+ V+ S9 n7 D6 g2 X  d2 `2 O3 j
  76.   }$ P! a9 I2 G% s; c) x
  77. }
    2 Q+ N- f! @* p% v( R2 `1 B

  78. 1 W9 F& D# {, U8 q& `
  79. /* USER CODE END 0 */
复制代码

+ k5 }- z3 x" A$ X/ R3、main.c中添加如下代码
, x& q' q' t/ L/ U; g# y* O8 E7 `" H  s! q, ~3 ^! z; w# V$ Y
/
  1. * USER CODE BEGIN Includes */
    ) N+ {1 \, k3 ?* x
  2. #include <stdio.h>; o: T; l; v  R
  3. /* USER CODE END Includes *// ~* |* G  K" d+ i& |$ {
  4. 7 u/ Z9 O& v8 |
  5. int main(void)7 Q4 A$ c* L3 a( Q; `* x. X  g
  6. {+ Z1 b( q' B" I; H8 ^
  7.   while (1)
    0 \, N1 u# t% s+ l. w# m
  8.   {
    0 O5 K: j# J( H4 `) D5 K: S
  9.     /* USER CODE END WHILE */: u% o; Y% u8 y

  10. , I' Z! @. ~; R  Z; F1 |" k# {3 B
  11.     /* USER CODE BEGIN 3 */' J8 E. u9 b# x- D; g
  12.                 HAL_Delay(1000);7 u3 v, `5 l# X- P5 L# k* z- u3 H
  13.                 ( G: D% j7 x; k) i9 _5 |, i
  14.     USART4_printf("This is the signal from serial port 4.\r\n");6 q% f+ s) R+ R5 Y0 l% |+ W
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    , }8 s" p! v- s: ]% j% O) L0 F9 F. E
  16.     USART2_printf("This is the signal from serial port 2.\r\n");& g- }1 u5 K. Y/ A# ]9 B  l) }
  17.     printf("This is the signal from serial port 1.\r\n");  
    2 z3 B+ _0 Y& M+ P/ Z' D' l; q: I3 K
  18.   }% d& [; |5 @5 Q! T! N5 ^
  19.   /* USER CODE END 3 */
    . p. O+ \+ U4 o
  20. }
复制代码

7 d7 Y( o" x4 U( \' Y; @) h4、最后编译,烧录固件,串口输出如图
2 R! i$ A  D; Q" n" d- L% b/ O8 ~) k: ~: V6 e8 e

3 J& D) ]* G) _& g8 Y' U
6 F5 h) B( V2 j* B
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 手机版