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

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

[复制链接]
STMCU小助手 发布时间:2022-10-28 17:30
这个实验向我们演示,不同的串口使用printf函数来输出对应的信息。默认printf()函数使用usart1,剩下usart2~4分别使用USART2_printf(),USART3_printf(),USART4_printf()输出信息。
% H9 W) n9 {( n. c. L1 [0 m" N& ?6 z+ ^/ _) F
项目地址:GitHub
1 {/ o( V: T2 k
3 L% G6 {4 g; K. L+ R1 Z% d" ~新建工程
2 z- c, h. R- P7 q9 X: f% ^1、新建芯片工程"g071c8/g071rb",打开SWD调试接口、HSE; I7 g% |- O7 H  H
: H! B! ?: M0 ~' b; _  v( s
20200718203500751.png # N/ t$ P/ e( B) o
20200718203520493.png
1 O+ {# N+ w% h  i6 l* s% N( f: f& f7 O/ T4 x
2、 设置时钟树,HCLK=64MHz
! {3 G0 V, G, @( X! `# b8 d9 x' ^3 e, z% {" [+ N- F
20200718203629892.png
: J# Z$ Y! o: {: `' N; v) N! d! `1 V. r) ]+ b" {
3、 查看数据手册,看那些引脚可以用作usart1、usart2、usart3、usart4。把这些引脚设置成TX,RX
  c3 i3 F  Z2 \1 h6 j& q) B$ f4 G, g7 f9 Y0 P
USART1A10,PA9。USART2A2,PA3。USART3B10,PB11。USART4A0,PA1
; y8 T* Z+ f# D0 P! c6 ?- @* w
20200718204428382.png
5 f. I3 M# d/ c5 |$ N0 e. q5 j9 Q% z
4、启用USART外设,参数按照自己的实际来填。模式设为Asynchronous,115200,8bit,None,1
, z" V) M# x* t2 I  W, ?/ _& d
$ J' [: d" R1 K# K5 v 20200718204945809.png % a; I  D+ t8 D# C, ~! Q
6 [+ {4 n9 C/ d$ L+ E
5、 项目管理填好信息。生成代码"GENERATE CODE"
! ?) e+ S; H7 u# f% i4 B* Y
+ F$ B' G! S  v% D5 z* ` 20200718205222483.png
: q2 v+ h8 C* H$ q6 \' t% E+ z; E4 _( C6 [
2020071820534722.png
7 w: h* a7 _6 a  `5 o/ n; ]$ y% n% D- y8 E) t
6、使用MDK打开工程,debug选项中勾上“Reset and Run”  q9 R) ~: ^4 x5 e& Z1 J3 u

" h* b. T1 b  J* L+ d+ X% v代码部分
" u( y5 t- S# D2 m0 D8 }3 v: X3 V# k1 R1、usart.h中添加如下代码
$ j' b! n% s! m+ V: y' B
8 ?0 ~* r2 _9 n/ J: q9 S$ w2 S
  1. #include <stdarg.h>
    9 I& f9 C% V$ E' A, ]3 n/ U  k% n
  2. ) a6 |$ h* k9 h( m
  3. /* USER CODE BEGIN Prototypes */; }; i9 Z5 y* D( [+ t" D6 `+ V% I$ d

  4.   f5 m9 d; F* k
  5. void USART4_printf(char *fmt,...);                   //重写usart4的printf函数
    " z; Q+ M) H8 U
  6. void USART3_printf(char *fmt,...);! y, I  o1 u7 g' ^- l5 J
  7. void USART2_printf(char *fmt,...);, l% L. v) I2 T( _  k# Z: m* e) c% P$ Z
  8. / q% s7 |2 S% L- @0 M
  9. /* USER CODE END Prototypes */
复制代码

% j5 s  d0 K1 P8 X0 e" k0 L) m2、usart.c添加如下代码
  a& O1 V' k! C3 ^
  W2 J  k5 B* ^1 ?3 }6 E) \/ e/ [
  1. /* USER CODE BEGIN 0 */
    3 w5 L9 p) F! i8 I4 r; a

  2. ! L3 W1 n9 }6 S. K
  3. #include <stdio.h>
    % o4 ~2 W+ E9 ]% }
  4. #include <string.h>
    5 ~% V3 x  Z! s6 K4 X2 [) P
  5. #ifdef __GNUC__5 p$ q( H" f  Y( e- s3 I
  6.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    6 @8 L! z4 e. C9 h4 _. M
  7.      set to 'Yes') calls __io_putchar() */8 T0 v9 Q9 L  `& W9 X; O5 E
  8.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)9 d% i7 u. z# f* A0 d
  9. #else; [9 H+ ^2 E5 n  A+ O
  10.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    . G* Q6 w/ p! I- N
  11. #endif /* __GNUC__ */
    ' J) ]) y$ D; {& Z" I: G6 F+ q
  12. /**
    . h1 S+ A, _) V' |+ `+ f
  13.   * @brief  Retargets the C library printf function to the USART.7 I% I) U& |4 j$ N
  14.   * @param  None
    + o# h. n% q4 V( g
  15.   * @retval None$ f5 {. ~# c7 i2 f6 Y. k
  16.   */
    3 o, ^' S4 {; \  _3 B
  17. PUTCHAR_PROTOTYPE
    5 }; A' v3 }* T( F/ t
  18. {2 U, g3 d3 x0 \# c0 D/ S
  19.   /* Place your implementation of fputc here */
    / j, v- m' @# g+ Z7 k
  20.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */" y" Z' e% ~6 j. G
  21.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    , X% d' ]' g7 C, K3 {
  22.   return ch;
    ' ?# W. @: B: r7 P! g1 A
  23. }& R5 Q" q( }/ M9 e* Q

  24. # K  o8 G. j6 W6 }* Y" P
  25. #define USART_TXBUFF_SIZE   256                                 //定义串口发送缓冲区大小 256字节
    6 u, {2 _% `  _5 _9 {0 v
  26. __align(8) char usart_txBuff[USART_TXBUFF_SIZE];                //字节对齐缓冲区  E, f4 F  J: a5 j

  27. ! l9 h/ ^5 c# u9 @  ^
  28. //usart4的printf(): s- s- B+ R1 a
  29. void USART4_printf(char *fmt,...)$ Y% }3 B5 m9 d8 `0 |
  30. {: j0 ~5 D: g! Y& l
  31.   uint32_t i,length;
    9 r/ J* J0 s( Y: j6 u
  32.   va_list ap;( }1 q" t1 e7 q9 t. G- R
  33.   va_start(ap,fmt);
    ( ^% k2 K" {- c+ ?  D3 G. X  f
  34.   vsprintf(usart_txBuff,fmt,ap);/ ~; k5 ]( n! E1 o
  35.   va_end(ap);
    3 j+ j+ z' s0 o! {
  36.   length=strlen((const char*)usart_txBuff);4 E" o2 n. h- q$ y) u. l' e
  37.   while((USART4->ISR&0x40)==0);7 e/ I, ~( P- r! e' [0 |
  38.   for(i=0;i<length;i++)
    ; Z' C! }4 A; f- k7 q
  39.   {
    $ ~* G* S" K& e; a/ ]0 a
  40.     USART4->TDR=usart_txBuff<i>;
    3 z+ t9 l/ t( W5 M! C- n4 {+ Y
  41.     while((USART4->ISR&0x40)==0);7 @2 i7 b  Z& T# F" {
  42.   }$ T( p8 ^" D/ n7 {; _& \
  43. }
    ) D! c; i3 g: e' p! l8 w

  44. . f& Q1 W( ~. Y. b+ U
  45. //usart3的printf()
    + X. S4 W4 f3 \  q4 d* `
  46. void USART3_printf(char *fmt,...)+ w* o0 e+ S2 B$ T
  47. {
    + l" r# G( Z& m7 F3 q/ N) v
  48.   uint32_t i,length;9 F& M, z$ I! F: B$ V
  49.   va_list ap;4 I. v4 F. t: C& L
  50.   va_start(ap,fmt);
    ( h& R3 E! s& B5 P) G$ }
  51.   vsprintf(usart_txBuff,fmt,ap);
    - l" W0 w8 a9 N' t  r8 F2 K
  52.   va_end(ap);
    1 W5 h3 X# E7 w) f( s) n
  53.   length=strlen((const char*)usart_txBuff);
    ; A3 L, H' U1 R" u5 @
  54.   while((USART3->ISR&0x40)==0);
    ; y! N/ {3 W8 o5 d
  55.   for(i=0;i<length;i++)( |1 @6 m$ F2 c; Z, _' L# T# o/ J
  56.   {
    " A0 B, V" \" R- X: I
  57.     USART3->TDR=usart_txBuff<i>;
      F3 }" C/ l4 `7 U- i" Z; W
  58.     while((USART3->ISR&0x40)==0);
    9 |9 P6 q7 j, f, h
  59.   }$ o2 A' b) a7 H8 ?' a) k, E( ]
  60. }, n/ j* q/ {* r7 \

  61. / |" l/ x& h( q% H# B  z
  62. //usart2的printf()
    + ?1 ^. h" \3 X0 W$ ~6 U- `1 Z3 N
  63. void USART2_printf(char *fmt,...)
    9 A$ Q9 ~: n. o: E9 `+ ]0 W
  64. {
    * A' ]2 T: t: T8 M8 F% t
  65.   uint32_t i,length;
    5 Y& d! \# g3 B  R/ w" J& {& N; E
  66.   va_list ap;# }" f0 t$ c: ?4 O$ n6 M
  67.   va_start(ap,fmt);
    ; r+ G3 J) [- Z% F" p5 F/ R
  68.   vsprintf(usart_txBuff,fmt,ap);- Y# X. p5 d5 z$ u
  69.   va_end(ap);3 c8 G$ V! ^* N& k/ G; N
  70.   length=strlen((const char*)usart_txBuff);. J" R3 J0 l4 d0 ]
  71.   while((USART2->ISR&0x40)==0);
    ; P7 T& o# P1 T" p
  72.   for(i=0;i<length;i++)
    ! s4 S6 y  _) N3 v( x5 h9 a4 v
  73.   {- A" \) ^( _$ T- Q$ N
  74.     USART2->TDR=usart_txBuff<i>;
    / ]! Y2 x; I3 A  ~
  75.     while((USART2->ISR&0x40)==0);
    . o* h; [) V/ S
  76.   }: p8 F$ L" U6 N( y. `8 K& n% U0 V& n
  77. }
    2 ~: v; f( v" X1 z
  78. ; ^; D5 f" a, `' Q: M) b
  79. /* USER CODE END 0 */</i></i></i>
复制代码
# V! N: r2 v( u4 |7 v# V& o
3、main.c中添加如下代码, ]5 e* _! M  k- p9 T% T
, I; ~4 X$ O5 J. K5 g+ x; D  B
  1. /* USER CODE BEGIN Includes */
    , R; _9 h  R- e6 k9 w' P
  2. #include <stdio.h>
    4 ~, }. ~8 m0 X: T4 w
  3. /* USER CODE END Includes */9 h  |9 T- r8 z/ R' o- o" r: n

  4. ! Y1 Z3 e/ y6 w3 P- Y' W
  5. int main(void)7 Y7 C  F( C9 _6 s# L
  6. {  ^7 K' S( H- w6 N6 \
  7.   while (1)
    3 s& {- N3 o/ C& c8 N4 r
  8.   {' a7 q, B; f. r: C" t
  9.     /* USER CODE END WHILE */3 @6 T- z( L& G' ?0 I+ R4 \
  10. 8 U, `: C+ ^- @0 a1 q6 F; H
  11.     /* USER CODE BEGIN 3 */' r. B. a/ ~) q4 H8 q! D0 E( e7 S
  12.                 HAL_Delay(1000);
    ) T  W& l, _& F7 B) B( f4 F8 W  @, |
  13.                
    2 y/ V' p' k- I( u- Y
  14.     USART4_printf("This is the signal from serial port 4.\r\n");5 c  G" r' F' _( I! V7 d# |
  15.     USART3_printf("This is the signal from serial port 3.\r\n");
    6 M& B1 v& W" E7 @) Q
  16.     USART2_printf("This is the signal from serial port 2.\r\n");
    + r9 n2 O% \2 l. o# Z$ W
  17.     printf("This is the signal from serial port 1.\r\n");  * w* A9 K0 X% I, \- N
  18.   }0 {" Q  e7 G* e% Q+ V3 w/ d) U
  19.   /* USER CODE END 3 */
    - k9 L1 e7 e. Y" _( G# Q
  20. }7 B) V! M5 V9 x1 J
复制代码

6 u4 W& u; k- a( D0 h' b; {3 z4、最后编译,烧录固件,串口输出如图
% N( {  i' }$ w5 p  X6 i  V3 D3 e& ~* C0 j3 K" q* |
20200718211759162.png $ P( Q' T3 Y2 c/ W' i7 x
* f1 s. Y. ]* i) \
————————————————7 L% N+ N9 k* G0 r2 I2 |* _
版权声明:SCCELE
* j. h; E& T9 n& e  l# y5 d+ s% w& N' N: Y/ K3 I" x5 n# y

. u. d- u2 v9 J) P: Q0 q; S
赞 收藏 评论0 发布时间:2022-10-28 17:30

举报

0个回答

所属标签

相似技术帖

官网相关资源

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