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

STM32G0学习手册——多串口同时使用printf输出

[复制链接]
STMCU小助手 发布时间:2022-10-28 17:30
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。( ]8 S' u6 Y1 k6 H2 b# R/ E4 k3 i
6 m6 h+ {  ?; X% k) D
项目地址:GitHub# v) k6 {( P" x& U/ R
8 F, S. W$ @5 a- O
新建工程$ v' ~+ ?! a. q8 z% L
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
8 d5 w3 c- Z+ r) r5 H0 f
3 t- X' f) J8 z; S' W: F 20200718203500751.png
5 C  C2 t, p3 S2 T  M 20200718203520493.png 0 m7 [6 a- Q: k1 I; y
& z# i7 u0 s4 z3 ]
2、 设置时钟树,HCLK=64MHz5 O7 G$ P6 n) o8 f5 d

& j5 n3 I/ t8 H4 T% N 20200718203629892.png
9 ~. d# m0 b  z0 p
2 ]! m7 f; F; J7 b; T+ A1 q7 y3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
  ]* f' M. T2 z) d8 M" Q& c
+ m; P) }" [9 ^USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1
1 E2 x( c; p: x6 l. J
/ X5 a. ]& _2 d! g+ ^6 z5 M 20200718204428382.png 1 B6 F. v* g" s* h* i
4 @0 p4 {8 z- t8 h2 d8 R+ X
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1( ?0 ~! E3 D$ L/ O7 |* k+ z

& Y- N( ?( j; n& }6 } 20200718204945809.png
4 a& e# v9 }5 n3 O* v: u; \& R  n
5、 项目管理填好信息。生成代码"GENERATE CODE"
) w! b- e* N' L* n! d7 R3 x4 U: f: Y, Z, r) V0 j2 K7 c7 {+ k
20200718205222483.png
$ @, B% r' Q: c' z# e' v3 m4 N0 a* v. M  e% U
2020071820534722.png 7 w* {+ K, e0 {" A3 m5 [7 ~

; J4 W6 p$ Y, [9 U8 G6、使用MDK打开工程,debug选项中勾上“Reset and Run”
3 V% i2 A  \% M4 P0 \. P/ A# S9 q# @; a2 D
代码部分2 f8 C9 U; a) ?  T
1、usart.h中添加如下代码
" l" I- V8 `$ i! U. F. U2 R+ d& F8 N, g
  1. #include <stdarg.h>
    % K6 C: o! I) Z% _/ i

  2. ; a/ {6 \  S4 J* J: m  R! ]* x2 B
  3. /* USER CODE BEGIN Prototypes */
    $ S0 h' A0 x3 F8 A4 |: Q
  4. , M* C% X: {, Q
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数8 `7 F2 k* |( S, ?4 X% S$ v$ h
  6. void USART3_printf(char *fmt,...);
    , e4 J' b' I, |# C( @. b8 _; i% _
  7. void USART2_printf(char *fmt,...);/ v  a, s# ^# X/ F! V+ i+ [, b4 M" {
  8. . q: ~/ p& r: N) A: P
  9. /* USER CODE END Prototypes */
复制代码

- q0 t7 a; h: s( |* L" L2、usart.c添加如下代码6 ]2 ], i" a( t$ l" t; y! {
2 T9 Y0 I7 v, ]! D0 X1 j
  1. /* USER CODE BEGIN 0 */
      @7 @- X; F( }/ a* c

  2.   E+ ^' K& m  X# V
  3. #include <stdio.h>
      h) ]' i* T( A% x  u! w/ {
  4. #include <string.h>
    8 U7 S. y: p, Q* M$ _& z
  5. #ifdef __GNUC__4 T# O+ j  ^3 [3 T* V
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    & L. ^3 B% j# E/ X
  7.      set to 'Yes') calls __io_putchar() */; ~" p. T( f3 S8 n$ Y! z, ?
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)* c* w% ]9 A/ v; @1 g
  9. #else
    9 L/ V' X+ l0 x$ _) t2 _* r
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    / v: m$ w) ]  w* A' A4 ^1 a2 ?
  11. #endif /* __GNUC__ */
    1 j2 ~% m2 x- L5 B$ L* X; Y2 h
  12. /**; N( V' D' \5 l$ e
  13.   * @brief  Retargets the C library printf function to the USART., f' f' q! W7 p4 V" b
  14.   * @param  None" f* E' K# H* |; G
  15.   * @retval None% W  t( J6 k) f" m
  16.   */
    . f' x( f5 _2 }. W8 o) Q- t! ~& m
  17. PUTCHAR_PROTOTYPE
    4 W" v5 Q* H, c  z
  18. {
    % f' F6 Z* ]) W& q3 I: ]$ i
  19.   /* Place your implementation of fputc here */# R5 j$ \9 L9 N$ P3 A" H
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    7 W5 q' m  }" M1 T: K, ]( v, z
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    : Q/ o. C5 a/ F
  22.   return ch;
    3 Z( n( i" Z" p0 m6 \7 e2 ^
  23. }9 y" k+ n& y- T1 N
  24. ' z5 Z* |$ ?3 H1 H. ~
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节( F7 X; d" c( i8 O3 ~# w2 b' h6 O
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区
    8 Y* a1 m3 n! C5 ]* h5 ]: j1 u
  27. 9 q" `% l8 f( P" _7 x
  28. //usart4的printf()
    ' S, W4 h0 b7 M; a+ J3 W1 Z( V4 r
  29. void USART4_printf(char *fmt,...)
    ' U+ Y8 u! e& a
  30. {
    : O" t4 |5 S' s- |) d, I7 W
  31.   uint32_t i,length;
    * `/ m0 q2 F- D$ V! z  R9 r2 }
  32.   va_list ap;6 V7 t" d- Q. G% S1 _
  33.   va_start(ap,fmt);& p5 W7 l' [+ Y4 t
  34.   vsprintf(usart_txBuff,fmt,ap);
    # w( Y$ ?( c+ C( |) I
  35.   va_end(ap);  F, ~1 ~& J& s
  36.   length=strlen((const char*)usart_txBuff);
    - U+ e9 B6 s% G
  37.   while((USART4->ISR&0x40)==0);
    7 W/ B% q( w4 \
  38.   for(i=0;i<length;i++)
    # v3 l" v7 |& M- W' a. w# m
  39.   {
    - q; E* q. D; [- X
  40.     USART4->TDR=usart_txBuff<i>;
    % o! U+ t8 A+ S& e) f
  41.     while((USART4->ISR&0x40)==0);
    $ L! p+ B& B- A& u9 x
  42.   }
    : Q. o0 w9 Z8 S1 q
  43. }
    7 @: u, O! t4 f. m1 m0 J0 A

  44. ) T1 F* U2 h& K/ h( k5 O: q* s
  45. //usart3的printf()! |5 n& J9 I  B$ s) \" d/ r2 r
  46. void USART3_printf(char *fmt,...)
    : X; W7 B. k  Y( U
  47. {+ M) C! b. L! v2 C0 t; O4 |8 `+ A
  48.   uint32_t i,length;2 Q* Q, n9 A: K5 f
  49.   va_list ap;- l  `  ~9 z" N" d4 M( F
  50.   va_start(ap,fmt);' T$ g8 H% L( p% v( ]7 C
  51.   vsprintf(usart_txBuff,fmt,ap);1 `% W5 X8 J; t/ M% i2 e
  52.   va_end(ap);$ u" p& `( g; T) Y2 x
  53.   length=strlen((const char*)usart_txBuff);
    ) _$ Q( z2 m! C/ v/ r4 |: B: g9 F
  54.   while((USART3->ISR&0x40)==0);
    4 P6 }, F" j$ K5 ~; T+ ~1 y0 Q7 l
  55.   for(i=0;i<length;i++)
    6 ?- g+ p: k3 E- a
  56.   {8 @4 w5 W0 }6 s5 t: \8 F
  57.     USART3->TDR=usart_txBuff<i>;, r, M0 F3 @5 o
  58.     while((USART3->ISR&0x40)==0);
    - P- b4 l% f. ^! j8 p' ~' B1 {
  59.   }- i" D% J( `# [* n
  60. }3 b( N* S0 |. m) w
  61. 5 A6 [) O$ [, H& V4 b
  62. //usart2的printf()9 s% W% ?2 O' @0 E, M
  63. void USART2_printf(char *fmt,...)
    - m! D/ p8 w9 J2 ]
  64. {9 g- {7 M& t( z5 e
  65.   uint32_t i,length;
    5 u5 @0 B  s- Y" f. [
  66.   va_list ap;
    - I  X7 O/ h* q% H( u% s( h
  67.   va_start(ap,fmt);
    . E3 M7 V4 t1 y9 E2 t6 X
  68.   vsprintf(usart_txBuff,fmt,ap);7 \/ A; N$ ^  |) L9 x
  69.   va_end(ap);
    9 J9 q9 C" [! W' f# {, D: L- N! H
  70.   length=strlen((const char*)usart_txBuff);- p! h/ X! j0 H6 z! t
  71.   while((USART2->ISR&0x40)==0);5 S4 ~: N% O+ g+ \# M& a$ ]+ Z1 P
  72.   for(i=0;i<length;i++)
    : h  |: r* M0 @9 y1 G' b5 s+ D+ T
  73.   {! v) p+ y# a. t0 ]9 J- _
  74.     USART2->TDR=usart_txBuff<i>;0 S& Z7 z+ r: X" A1 m# [( M
  75.     while((USART2->ISR&0x40)==0);" n+ |2 z6 X" f2 f; Y4 T3 L0 N# l, L2 J
  76.   }
    9 |7 I& H9 l  [# c- Q3 V) K
  77. }
    4 o. A* e' @9 ~1 W5 h: Y* B3 x

  78. : l# b/ ?( A9 C% y. _
  79. /* USER CODE END 0 */</i></i></i>
复制代码
, F0 o" M2 Q1 k; {1 B$ {( w& O
3、main.c中添加如下代码
$ P( w& K) X8 d2 _* g, m/ w7 Z& m2 t( k' i2 R8 W. @4 F% u( ~" j
  1. /* USER CODE BEGIN Includes */
    * f5 P, B4 w% ?/ R. Z6 R0 ]5 J9 }
  2. #include <stdio.h>
    " R2 h4 X" q. @, O+ {8 R
  3. /* USER CODE END Includes */
      ~8 F% T$ ?; C* Q/ A
  4.   @; Z+ M- P  G; \: x& f- A4 [. d
  5. int main(void)2 x, {, R  Z; U2 |
  6. {9 a' n: ]( x' ^3 H- R$ F$ o$ ?
  7.   while (1)& f! I& p, u* a; y& H3 V, _
  8.   {9 k/ `2 n1 |! d1 t7 z' T
  9.     /* USER CODE END WHILE */% \5 U' d; f1 w: b/ D

  10. ; N8 Z' z' E; J; B1 N' b3 P
  11.     /* USER CODE BEGIN 3 */" V# P" h: c$ F4 J3 s3 P+ b
  12.                 HAL_Delay(1000);& E* b' G: d' c( A1 T9 A* O; b
  13.                 & P/ y: n$ P( A: V" K; Y
  14.     USART4_printf("This is the signal from serial port 4.\r\n");; t7 Y- u+ Q9 m% @4 v- F" b
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    , N* P/ F: T% N8 s
  16.     USART2_printf("This is the signal from serial port 2.\r\n");/ H* k# y2 t6 x: e, I
  17.     printf("This is the signal from serial port 1.\r\n");  - N* s: `5 g% S* G' D
  18.   }0 v. S1 ?8 U' @5 R0 B* c$ K
  19.   /* USER CODE END 3 */
    $ N7 `0 w4 P5 g
  20. }- \9 V5 W: }+ a4 ]0 y" ]4 h# L* G
复制代码
; e# Y8 y- v4 o4 t; P
4、最后编译,烧录固件,串口输出如图2 O7 I0 Z. S: v4 M) i7 `2 ]2 h8 U- @
" [0 N0 s5 y. d4 s9 s: h# L
20200718211759162.png " `: [- Z% e* |& m" O% Y

+ j6 I$ u* w7 ^- k' ^/ [————————————————: i% r% k1 C  s3 _: ]$ ]5 p4 X) o9 m
版权声明:SCCELE
" E: q$ {4 `. i6 w. i" D5 Z0 k0 t) r
3 \% }* ^0 p# q7 B8 o% N0 {1 }1 w$ N/ a# _, t' |
赞 收藏 评论0 发布时间:2022-10-28 17:30

举报

0个回答

所属标签

相似技术帖

官网相关资源

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