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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 17:09
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
  f9 [5 ?# G) ~8 n6 i( K7 i
. a3 Y' W: r$ w( Z) i9 B0 t新建工程
8 a7 h  f; U  |0 Q; G! |1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE6 h* F+ ?9 R8 d3 B: E

" j' Y9 Y; |/ K! G9 P
20200718203500751.png

# f. Q1 {1 T. ?0 ^/ r+ G
1 C: a; `  E( N/ u: Y
20200718203520493.png

; O( U2 e: k6 C- V! a& U. V* o) v
$ ~7 o# L+ @7 ?6 l& p2、 设置时钟树,HCLK=64MHz
2 O7 S6 i6 g5 C8 f, @. n: F
! _- W: J5 J: m7 L3 D/ D
20200718203629892.png

9 @  |3 Z: K8 O, v' c. N0 C* X3 c9 x/ L" \! I9 S
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
- G/ l+ }6 M4 x* \% \
! B. x' k' `' t# E! @3 h! mUSART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1
" q% I' Q& H7 X& u
# d& K% |4 ~0 w+ L: b% I
20200718204428382.png

; W$ g* w# r  M5 V/ z# J9 Y
- a! p& U8 p) W& r0 z5 V/ \4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1/ s7 _8 T) l  m! t

  [" W, |' r( m% w1 o0 X
20200718204945809.png

6 O2 L- p2 w5 H* b' a, ~3 U' N8 ^1 F0 m4 o) O2 ~7 u& {5 x
5、 项目管理填好信息。生成代码"GENERATE CODE"
" k  P: U" ^1 Z& J, Q' D0 g1 C2 Y3 |4 W5 J
20200718205222483.png
6 N% g+ {, N; @- k( j( H

2 R2 T* k% R4 G& j+ c; w$ V# m
2020071820534722.png
* w) P2 L/ G  i) d0 X7 _5 H% [
6 {8 J/ Z7 \  N0 P+ F# q
6、使用MDK打开工程,debug选项中勾上“Reset and Run”
9 k6 y/ S- |! W4 Q8 v4 R. o3 p* y: ^2 W* C
代码部分- {& X$ P1 u+ A6 e# v
1、usart.h中添加如下代码' _( \5 `7 ~4 k
  K  d; f. j  T% H6 h: n
  1. #include <stdarg.h>
    % d$ E. U# ?6 T6 w

  2. 7 E# I4 \4 G2 a4 E6 C- @. H8 \
  3. /* USER CODE BEGIN Prototypes */
    # P1 r$ _: j/ q, R

  4. 4 S- z5 d1 ~1 u0 }7 C
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数
    + c; Q: ^% }* h  k- ~! ]7 b
  6. void USART3_printf(char *fmt,...);$ N2 H3 A6 E" r: g0 M3 K$ ~- |
  7. void USART2_printf(char *fmt,...);6 ^9 q! u: u% h8 W7 }3 V

  8. ! r/ A# s: H' K7 b5 F* W- k
  9. /* USER CODE END Prototypes */
复制代码

/ A) W) o9 m+ m  h1 q2、usart.c添加如下代码' \" d/ Z; v2 ?1 {" L7 ^! M* z

5 u7 q) Y# f1 h( [9 @
  1. /* USER CODE BEGIN 0 */. N: E0 m; k9 @2 o2 v0 ~9 f0 u
  2. ! d. Q* U5 o! A) J* X
  3. #include <stdio.h>
    " l1 L( T. b2 G" I& P
  4. #include <string.h>& V3 s9 v" G( a5 t) Z/ l) Z6 V
  5. #ifdef __GNUC__+ Y0 Z& P; a5 _5 E
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf. E; V5 S$ N: [6 _
  7.      set to 'Yes') calls __io_putchar() */
    2 S% [7 h9 C0 X# y% f
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    , B1 u- Q/ g1 x6 P; `) t! P
  9. #else
    ' m& |, n4 }& ?8 c! x
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)9 ?. R8 K6 q$ c5 g* _/ b5 o
  11. #endif /* __GNUC__ */
    " ?8 G5 H, G! P6 R. l6 n
  12. /**7 W, D8 `9 ?- ^; M
  13.   * @brief  Retargets the C library printf function to the USART.! \- a7 {  ^' `" |
  14.   * @param  None
    : m( Z$ ?: r. o
  15.   * @retval None
    ( c4 U; L. Y8 G( E6 [
  16.   */
    & g2 Y% `* ~# S1 o; f9 `
  17. PUTCHAR_PROTOTYPE& M" y& d# v( |  G: ?
  18. {
    2 `9 z, x8 l+ F) d! w+ y2 I- C
  19.   /* Place your implementation of fputc here */4 q; k2 O* C5 l: v* B; P
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    / U( y9 g5 ]4 M: W0 Q3 y
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);2 I0 a! _! v: r) D3 k
  22.   return ch;
    + h1 _: |. R1 p3 |/ M
  23. }
    7 p, F: `' U0 a
  24. % u$ M1 d% ]$ ~
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节7 u3 z9 ?9 }( Z) X! E7 Q/ Y6 s
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区  c: {9 n. M/ U6 U
  27. " G/ _3 O6 d& A7 O' Z, ^8 q
  28. //usart4的printf()) v/ z8 A! I; @' B  R
  29. void USART4_printf(char *fmt,...)9 e6 F  S, w- ^2 I- d5 c5 b3 n; M
  30. {
    , ^3 ?% M0 C/ o0 a" `0 z1 I8 y
  31.   uint32_t i,length;
    1 ^/ y4 g7 A1 ~1 {' U
  32.   va_list ap;
    ) A2 o3 J# Y/ z
  33.   va_start(ap,fmt);  ]# w3 ^5 `; @5 }
  34.   vsprintf(usart_txBuff,fmt,ap);
    ' J- v5 g; A! ]% G) c3 @4 J
  35.   va_end(ap);6 o! T. y+ J$ ^7 j
  36.   length=strlen((const char*)usart_txBuff);
    , a! J# a3 e# ]. ?% U
  37.   while((USART4->ISR&0x40)==0);
    ( e$ D' b3 l* _0 p" [
  38.   for(i=0;i<length;i++); E. @% Y4 C  r% |& O' L" g+ |
  39.   {
    + [& f- [1 j, I$ I$ N
  40.     USART4->TDR=usart_txBuff<i>;
    4 b6 e, {, }* e1 @0 g
  41.     </i>while((USART4->ISR&0x40)==0);( }" l4 {' M1 I$ H1 _
  42.   }# \, ]& i: \0 C- g& ]" O! s! Y# K& R
  43. }
    , d0 R/ n- |" a3 A3 Y7 e4 I
  44. " D0 z7 ^# c: B' x
  45. //usart3的printf()
    # R* U0 k2 `( O8 V2 V/ o% s
  46. void USART3_printf(char *fmt,...)5 H; X5 l# G3 \* k2 c
  47. {6 `4 ^, O4 T3 |- Q
  48.   uint32_t i,length;, m7 I9 v& J* i! ?3 {* A" L* F8 k" ~
  49.   va_list ap;
    * l0 G2 A3 S3 q! Q
  50.   va_start(ap,fmt);
    * {2 Q; {; C' l$ h( j6 o
  51.   vsprintf(usart_txBuff,fmt,ap);
    . L, c% w9 @1 d( }" U! |* H
  52.   va_end(ap);9 `) z+ S8 x. m/ a: G
  53.   length=strlen((const char*)usart_txBuff);
    ( A; [% G6 L' w
  54.   while((USART3->ISR&0x40)==0);
    " m! R3 X2 `- p2 D  D6 V. E
  55.   for(i=0;i<length;i++)
    $ }) b7 H+ @! F& E* t
  56.   {! R: W) t+ A5 Z+ J/ h. W
  57.     USART3->TDR=usart_txBuff;
    . A- p/ r& s7 B& W6 Y/ r8 T
  58.     while((USART3->ISR&0x40)==0);
    1 G/ Q' l# P2 a, z
  59.   }
    $ P: T; r" F* l0 q% W+ x4 k7 ^% Y: K4 \8 `
  60. }
    ) a$ n% h; B1 l, v  T
  61. ' R! `( z- U& g$ T" ]
  62. //usart2的printf()
    2 h6 u: J9 I/ M
  63. void USART2_printf(char *fmt,...)
      k7 t) V1 b+ G! _+ G: S( q) b  @
  64. {
    $ E1 `* c5 ^- ?
  65.   uint32_t i,length;
    - ?* l, f- Q% U. R9 A* S
  66.   va_list ap;  B* }4 w1 n+ U8 D* H; n
  67.   va_start(ap,fmt);
    4 @% M3 S& G  Y' Q
  68.   vsprintf(usart_txBuff,fmt,ap);7 S4 V! c# N: e9 u- P
  69.   va_end(ap);+ l  u* g% W) Q: o" G& a
  70.   length=strlen((const char*)usart_txBuff);
    0 |6 b" Z4 P: W  p3 `
  71.   while((USART2->ISR&0x40)==0);5 p: b; T9 X% Z/ X: S
  72.   for(i=0;i<length;i++)
    4 S( {6 w) q3 e$ E5 L
  73.   {
    ! H* _$ \. A2 l, G: \" [& A  S
  74.     USART2->TDR=usart_txBuff;; j! m. K) X( s- A7 P: B
  75.     while((USART2->ISR&0x40)==0);
    0 |) \* E7 L! `2 q# u) A
  76.   }
    ! T9 b4 ~1 k' _# C2 C. {8 d
  77. }1 |5 O1 F' f4 R; T2 \0 A  p$ X

  78. & b9 ?; i1 m/ c; i- J
  79. /* USER CODE END 0 */
复制代码
+ ?9 \! i/ b% M9 l  o
3、main.c中添加如下代码; q% f$ b, n, i
! m/ h$ `2 k5 Z
/
  1. * USER CODE BEGIN Includes */
    3 I- b. I" T( o% y8 x0 s
  2. #include <stdio.h>
    ! X7 O6 `! Y3 L, x3 U
  3. /* USER CODE END Includes */! Q, }6 E, f0 n+ j: ~$ {! j, p5 g" `
  4. . g8 Y, s+ X; w
  5. int main(void)% ~  e7 I: Z* G+ L7 @
  6. {
    % `; j, A4 h% t3 I) d* M
  7.   while (1)
    ' E8 w: d1 L9 h6 ?3 j0 `6 s# Z5 D1 ^
  8.   {
    6 c  E0 h( X# {5 G8 {, h
  9.     /* USER CODE END WHILE */
    8 \  s: [: c4 l
  10.   Y( q) y4 @/ c1 j# R
  11.     /* USER CODE BEGIN 3 */7 i  o; m! E" F! ?, V% ]. z
  12.                 HAL_Delay(1000);
    1 q: }' w! x% j; E
  13.                 7 D7 c1 Y, h: K. ]
  14.     USART4_printf("This is the signal from serial port 4.\r\n");5 W+ r# `/ H3 l
  15.     USART3_printf("This is the signal from serial port 3.\r\n");  L9 U8 {! D& Q/ N& y$ o- t" V" S! t
  16.     USART2_printf("This is the signal from serial port 2.\r\n");
    ' J/ U+ P0 A+ t  r% D  F
  17.     printf("This is the signal from serial port 1.\r\n");  
    & t0 S, c6 D1 g
  18.   }
    , @8 Y" a5 D0 g0 {+ f( v) e
  19.   /* USER CODE END 3 */. b" d6 u" Q3 C
  20. }
复制代码

$ U8 r1 @. v# `8 h: ?5 l4、最后编译,烧录固件,串口输出如图
4 }, t% Q, s; @7 _3 D' q
, g- h& ]) R5 X6 j. s1 \" ]/ S9 R5 @' [+ ^8 Q. K' F

9 V" X5 @1 f- J  @
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 手机版