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

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

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

( b5 u+ h8 T) |8 {( z新建工程3 L# Z! a$ M1 \3 m( c
1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE
' d, Q) x' f! F! _. o
- \3 Y+ \% H$ c6 G: s& A$ d1 B$ W2 C
20200718203500751.png
, t8 D9 W" x/ u4 [0 C# K
: A+ j$ b  \7 B$ v  J( N* ^$ N
20200718203520493.png
+ ^' M7 J6 B9 w

' v4 d4 R, c! x+ }. |3 w2、 设置时钟树,HCLK=64MHz
, t5 v% y' n; E5 ?5 B" C- r8 T) D) H
20200718203629892.png
3 I; n( J, S+ g; k7 [* Q) a9 ?
, k1 O9 B- V' l' _4 ^
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
8 E2 M! g! {; w7 S# H$ R& e  D5 w9 ^$ z; B
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1
* i8 J  x, f# U: c) b
! I* N6 {, ^3 A1 w: S" p! o: O  c) G* R
20200718204428382.png
7 Q  q8 h* F/ o2 Q8 q/ x
: m. P! s1 C: I  n6 j
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1; Y6 p+ y4 I$ G" r+ o/ t) a

8 e1 l3 i7 ^$ N0 v3 j5 ?* e2 {2 y5 A
20200718204945809.png

+ g. h6 w0 ]; y( ?/ ~' @* k9 g, `' |! }
5、 项目管理填好信息。生成代码"GENERATE CODE"3 k! J- P, r3 I9 E
4 b" \7 w* V5 A4 w
20200718205222483.png
' Q8 J5 U8 f6 z+ f& i
7 \, b$ H; K5 F9 k1 P
2020071820534722.png

) I  z" R* x* q" h8 V" }0 t# u
) Q# \, ]! ~, ^; u( ^6、使用MDK打开工程,debug选项中勾上“Reset and Run”5 `( v, l8 v4 X7 Y! Q

% d, q/ E1 W/ z1 z, E代码部分+ o0 M4 W: ^1 V& `4 ^* E; K0 E
1、usart.h中添加如下代码  f7 z8 w8 c/ }% B6 E
3 E: y9 @5 S7 w' R% G& h5 W
  1. #include <stdarg.h>
    & a+ T0 u" V- ]+ d2 i

  2. 4 n: x) w7 U% `9 |8 k; F% a
  3. /* USER CODE BEGIN Prototypes */
      H4 [! r) u( Y. S
  4. $ F5 {4 j% U, d% B
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数* d/ H4 Y+ O8 b# H( s
  6. void USART3_printf(char *fmt,...);
    ( b( L0 }- \2 F+ y/ {1 r) G0 J  z- W
  7. void USART2_printf(char *fmt,...);% G3 V) M+ }( t' n, I" R0 s" A
  8. : W! ~1 S7 I* H' z6 a2 g: W
  9. /* USER CODE END Prototypes */
复制代码
4 x& w. z4 `1 [$ P/ `
2、usart.c添加如下代码
" G+ Z* }  K; i( r: Y
& R- O5 v+ C7 s0 t
  1. /* USER CODE BEGIN 0 */8 E3 e! v( [$ v4 C  Y# `& J

  2. 3 U. p4 b0 Q4 a# R9 ~% x; L/ `
  3. #include <stdio.h>
    $ K& o& B. g$ _  A+ H5 c
  4. #include <string.h>
    5 h- d- x: G, K+ O: J6 g
  5. #ifdef __GNUC__5 e5 \# y- h! H! e2 _/ R- e, Y
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    5 Q6 Z7 p2 k  I) |
  7.      set to 'Yes') calls __io_putchar() */3 s1 ]. E& _8 {! E/ R- n
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    2 A6 s% |! w, X( g
  9. #else
    2 a: Y2 [' j/ ~9 l$ x
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    * B( A7 S  u; o) S  Q& ~, E$ f
  11. #endif /* __GNUC__ */5 B, c- m6 P( B7 q+ N& |
  12. /**
    " g) B% L. p6 X- p& t, x
  13.   * @brief  Retargets the C library printf function to the USART.( K  s  v# p% X
  14.   * @param  None
    # f7 p3 `3 r" e* A
  15.   * @retval None
    6 U) |% D& w" ^' s# E% b
  16.   */! b+ k+ M' J" [, @
  17. PUTCHAR_PROTOTYPE
    ( b) b' `7 l/ A" F  S% E" s
  18. {
    / r$ b- Q4 b; z3 a: {
  19.   /* Place your implementation of fputc here */
    1 _% _; F3 D8 V1 N5 ~! \
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */* P' @9 e' j& p  p# x
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    3 l* S' h& _# m( C
  22.   return ch;
    / n% D4 Q( |, D( N+ _: Z4 w( Z
  23. }! r  x* \1 Z5 V3 q
  24. ' b6 ~  d5 n4 W) J* n( f) ^- z. V
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节  D, ^( @- |1 Z  E0 X
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区
    # }1 |2 h% }5 i/ w- M3 a; B
  27. " m- k, V& q+ G" d5 X
  28. //usart4的printf()
    3 J+ }/ c6 }. @7 `8 [
  29. void USART4_printf(char *fmt,...)
    ' s; b5 m) P) s4 J% Z3 J
  30. {
    + I3 p; Q/ ^) O" ?
  31.   uint32_t i,length;
    1 h4 d, I" G- |. i
  32.   va_list ap;
    / x: C) a% X/ [$ }0 g  y4 Z
  33.   va_start(ap,fmt);
    3 n" e! C& R; @0 e: A( d/ I# B
  34.   vsprintf(usart_txBuff,fmt,ap);
    - J7 |+ P1 k7 j3 c5 I# R. P$ ?8 {% F
  35.   va_end(ap);& v, f0 A" x, `5 _! U& p, t" [9 W
  36.   length=strlen((const char*)usart_txBuff);
      B9 O  S5 o* C# S; T/ O! \
  37.   while((USART4->ISR&0x40)==0);
    6 I# W8 X: M7 W, n. p/ w# W/ \
  38.   for(i=0;i<length;i++)* T- `( w) ^% t3 L9 B3 d$ N: A5 C
  39.   {
    1 z0 C+ X& n! b7 W! L6 C7 q
  40.     USART4->TDR=usart_txBuff<i>;
    ) o* F2 Q9 w9 m# @9 P+ B
  41.     </i>while((USART4->ISR&0x40)==0);  U0 B9 {: V9 Z( O& y; N) P
  42.   }6 b  K7 Y- ?; d
  43. }: V0 P1 n" j0 Z! a4 G1 S
  44. 6 j$ b: U  A. O- I" n, G
  45. //usart3的printf()3 D: t% Y3 [0 b" `0 b) S
  46. void USART3_printf(char *fmt,...)/ z) I8 U* W' @/ V+ D
  47. {
    + u8 A' v/ M3 x/ G/ P( ~! O
  48.   uint32_t i,length;; e/ E1 o2 |* T3 Y& M! ^/ x6 ^
  49.   va_list ap;
    : k0 \: V. O: c; z5 S
  50.   va_start(ap,fmt);2 x3 s2 v$ V; H9 ^+ r) n' Y
  51.   vsprintf(usart_txBuff,fmt,ap);
    5 x! h2 a# p( W4 L. K* |( ?
  52.   va_end(ap);; A& R/ h' ^: N. r: A
  53.   length=strlen((const char*)usart_txBuff);
    5 ~5 H+ _4 ~  ]9 [2 h! D$ t' v# T, j
  54.   while((USART3->ISR&0x40)==0);7 s0 _* q0 ^( {9 V- l" a3 {
  55.   for(i=0;i<length;i++)  ]- _2 Q2 X% I- a/ V
  56.   {& Z" o9 V! m, O* o5 ~0 ?# p
  57.     USART3->TDR=usart_txBuff;9 x& L$ a$ r7 T$ k6 ]8 C9 j; z
  58.     while((USART3->ISR&0x40)==0);
    7 a' B8 X) d7 [
  59.   }# c/ V" A  D/ r. y
  60. }1 }8 |: v. G4 x$ L: U0 m

  61. # w# ?1 |% O& s5 q9 r7 C
  62. //usart2的printf()
    # g* l+ P5 _+ B8 I, {, h
  63. void USART2_printf(char *fmt,...); H' h+ r* w$ Q: L- [
  64. {
    $ m7 r% y/ U) n, \, A
  65.   uint32_t i,length;( ]: B: R, q1 O4 n
  66.   va_list ap;9 t+ t* F3 X9 a0 n& s! J/ m
  67.   va_start(ap,fmt);
    7 E: Y) r* B2 C8 T: `+ D
  68.   vsprintf(usart_txBuff,fmt,ap);
    2 f+ h" F: H% h) h1 P4 h
  69.   va_end(ap);* p( D0 m+ o5 ~
  70.   length=strlen((const char*)usart_txBuff);
    $ [' V* w1 q) w8 M' l
  71.   while((USART2->ISR&0x40)==0);" A; {6 j1 v- b3 T
  72.   for(i=0;i<length;i++)
    # `; j) a$ u2 B- J- @
  73.   {) W' {! R/ B  x: N5 \  P$ l! [
  74.     USART2->TDR=usart_txBuff;
    ! H' t1 E9 O: V- [/ ?
  75.     while((USART2->ISR&0x40)==0);
    " S  I1 W) l+ S2 w
  76.   }, z+ `! ]9 E( L. k- S
  77. }
    % L/ K' S( K3 d

  78. # y9 U! U$ B$ I( @* p
  79. /* USER CODE END 0 */
复制代码

9 J' P- C% Q. P" [5 {3、main.c中添加如下代码
1 J- c2 C" |0 ~$ m$ C# q7 p, C$ F8 K
/
  1. * USER CODE BEGIN Includes */
      J' T5 V' V: s( B+ o
  2. #include <stdio.h>
    3 n9 h4 r8 l2 D, m. [. H
  3. /* USER CODE END Includes */
    8 m6 B+ c& N" E: ~# d

  4.   z; A3 Y8 k" w" m6 {: z, ?) E
  5. int main(void)& p+ [. q+ v. @. T0 E: k- \) M6 @1 ~4 h
  6. {
    $ k. J3 |3 ~+ m& z+ v
  7.   while (1)
    / k4 x& |' v4 g' y/ ?: B2 q
  8.   {1 u! A; D  c- m" L6 G/ n5 f( ]2 Z
  9.     /* USER CODE END WHILE */8 U" s1 s- v- d+ h5 k3 D  s2 u- c
  10. 9 h/ u; \* }/ n( S! [
  11.     /* USER CODE BEGIN 3 */: ^5 a* k2 [+ k" G' P5 G/ [9 l: s; l
  12.                 HAL_Delay(1000);
    7 _) W8 r' v6 I# z2 y  B- e, S( q
  13.                
    ) B' Z$ Z0 t+ [1 v0 w% ^- k
  14.     USART4_printf("This is the signal from serial port 4.\r\n");
    & i- b3 q( A- E0 F  E
  15.     USART3_printf("This is the signal from serial port 3.\r\n");- Q7 i, M3 V! q' D; Y8 a! l
  16.     USART2_printf("This is the signal from serial port 2.\r\n");
      t1 p1 E) N5 k3 i
  17.     printf("This is the signal from serial port 1.\r\n");  5 H- g" j1 ]: @- W( V: T" l! }
  18.   }
    * Y/ ]8 U" E& g' B% V
  19.   /* USER CODE END 3 */* p0 _) ]% r0 v3 D+ l1 U7 C
  20. }
复制代码

! a  k) b3 h- Y4、最后编译,烧录固件,串口输出如图
/ A3 K( c9 i3 O% X& z, A4 e* t9 q% [) ~' z" B

) }% _% K) y; O% x
8 f7 H. \/ B% Q" O% f& y5 c# A
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 手机版