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

STM32G0学习手册——FreeRTOS中使用printf-stdarg.c进行串口打印

[复制链接]
STMCU小助手 发布时间:2022-10-28 15:31
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中
; c' L! j+ ?+ s$ @$ d7 l( a
2 W" d9 }+ }6 T. s1 @% ?$ e; v% c2.重定向printf到串口,在usart.c中添加代码+ y5 R/ J8 k, l8 U% y4 Z* x& S

# n6 W, H+ x% p+ W: m( a+ t- Z7 l
  1. /* USER CODE BEGIN 0 */& H$ {% }# s9 n+ p: \" K. _5 p
  2. ( L( `$ w: K# E0 R
  3. #include <stdio.h>9 r- o* D$ a7 j5 f
  4. #ifdef __GNUC__
    ! d' F  p( }! b% C& u
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf% ?. V. [) b! F% W* Z9 R% N
  6.      set to 'Yes') calls __io_putchar() */
      D: q0 X' I/ n* {4 @. w
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  a. B. |; B% z% a
  8. #else& K1 G$ G- W; X
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f), U; Y7 t6 Q' M; I6 H' |, x( q: A% z
  10. #endif /* __GNUC__ */0 y' Y* A: J6 o  d4 V- }1 y9 O
  11. ///**
    4 X9 E6 w& p" J1 X5 P
  12. //  * @brief  Retargets the C library printf function to the USART.2 j0 F. U; X7 ^: b+ d  M0 u, X
  13. //  * @param  None
    ) G2 e# Z$ H+ x
  14. //  * @retval None% `" x- s- _" q* n0 Q
  15. //  */
    % J" _8 \8 Q" s$ u0 b
  16. PUTCHAR_PROTOTYPE
    % J0 l0 x% R( Y$ z
  17. {
    1 w! `$ {% ^3 v2 B7 c+ i, N
  18.   /* Place your implementation of fputc here */
    8 d% C' I' r+ e& a* L' L
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */& Y4 ]0 s$ {1 O& s3 [2 w
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    % T+ G. k8 ]: [. D
  21. 8 W" @( m5 ?/ ]
  22.   return ch;
    5 M2 [* J; r8 \9 z* U# B! x
  23. }4 o9 ~. y  Z0 S( f2 @7 m9 O
  24. 3 B+ U& i! r7 {; I( I. ~5 s8 O
  25. /* USER CODE END 0 */
复制代码

1 T* C' @9 K  h9 j/ E0 @3.修改printf-stdarg.c
7 f+ n, u, V% j; c3 G
5 e) b. B6 y! t! s
  1. /*2 r. L6 `7 h2 A1 L- A& V& u
  2. #define putchar(c) c* G$ {) P# n  e& }
  3. */
    ' Y. _9 j! c* J
  4.   k& V: z# x% p* V
  5. static void printchar(char **str, int c)
    ( \) I8 F' m& h% B7 D
  6. {
    ' [% K' f& t4 _7 I0 o- m
  7.         extern int putchar(int c);       //去掉原本的注释
    6 \$ g8 ~, Q' ~. r
  8.         6 s0 ~1 r7 b- p: L
  9.         if (str) {. u, ^& n  \0 X, c( e, u0 t
  10.                 **str = (char)c;( r- ^. j8 I/ U! c! B% P$ C2 L  |: N. H8 O
  11.                 ++(*str);3 \5 ?& u4 ?1 s; u) i! \6 a
  12.         }& o. p- |/ X6 u0 d8 w( P& O
  13.         else
    $ w# [! h3 A  S% X
  14.         { / N* c* M) [; R( b* {1 P
  15.                 (void)putchar(c);
    2 F2 x: X8 m- |/ b
  16.         }
    6 W5 ~- l. L: i- D4 l
  17. }
    5 s, S7 V$ Q2 ?; P) f, n' B

  18. 3 o. B& d# V$ i( X/ v' x
  19. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/
      {) O5 }3 ]% s% V8 H& @' {: {8 O
  20. int f_printf(const char *format, ...)
    3 ]# w8 s6 O5 G+ c7 q  n/ E2 u
  21. {$ B/ f$ ?3 J+ W$ N
  22.         va_list args;
    . }+ E" i6 I( R2 b3 O  b; q: B

  23. 1 B+ a# m* P. Q! @
  24.         va_start( args, format );' ^+ v7 R8 o; R5 a0 g8 c
  25.         return print( 0, format, args );  @4 y6 B8 W; B- z% x
  26. }7 \8 R. k& ?$ T. ~+ G, x: u
  27. + l/ h; G/ G4 d! f) V
  28. int f_sprintf(char *out, const char *format, ...)/ L* J' g% J0 \- ^
  29. {
    ! ], G" Z% p. ]% J9 M
  30.         va_list args;4 h# |5 ~. k. y7 X8 [6 P5 [. n
  31. , P6 p  ]- V( T, J) I8 O
  32.         va_start( args, format );4 y0 }3 {8 y5 l
  33.         return print( &out, format, args );  s; B- h3 U( @4 Y; s
  34. }
    2 K& h# q5 j: t; Q5 U

  35.   g, E# O7 y/ ^" a7 n$ x3 B+ e

  36. 9 D2 i) n; G( x: `; J
  37. int f_snprintf( char *buf, unsigned int count, const char *format, ... )
      s6 Y( ^$ w7 C
  38. {
    - b  P: |& G2 @, N2 e5 S, i
  39.         va_list args;1 a; f8 \6 z0 i" s! t

  40. + w2 ~5 i6 s9 j; H  V
  41.         ( void ) count;
    + S2 q4 u/ c6 z2 ]
  42. & ~" I7 Y7 o, n, |+ t+ i$ Y4 i3 p
  43.         va_start( args, format );
    9 q. F7 x% A+ y8 b
  44.         return print( &buf, format, args );4 L3 }* T" I/ ]% V6 m/ V1 s- F1 I
  45. }
    5 S' y  G% q' X' ?7 M
复制代码

( z6 N' G1 e: b" ~7 B' Y 4.修改main.c! S) E" q; S4 R

  `8 u+ A8 N4 z$ b
  1. #include <stdio.h>
      ?) f! @/ Y  b" B8 L' _+ m/ ^" S
  2. extern int f_printf(const char *format, ...);
    # Q. B; K* S0 A
  3. : [( B- E% C/ J4 h" t: j& q
  4. /*4 F" t* r% |/ Q# `! B8 s8 e
  5. *% r, u. j% N% [- t* ]2 q0 `
  6. */
    % X* _9 W" y6 L, A
  7. int main()4 a9 o0 u' O6 y" E: u; y1 y
  8. {$ ^) v/ X  K! ~: o
  9.   /**/0 q: l' t# C8 J8 x% c* R+ E
  10. }- i$ f. g( z2 K& s% I) j

  11. ; t! `3 j% U+ @5 q$ `4 A
  12. static void LED1_Task(void* pvPrameters)$ v4 M( d, g) W4 y; y6 c
  13. {
    ' W2 y  M# W2 R, D1 s) e' a- T
  14.         while(1); H" h  K- B% r% D8 e
  15.         {- z; i9 |3 p2 e1 E; v& m
  16.                 temp_count++;8 O; x9 A$ u/ o
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    7 ~% m% m8 o. j6 N7 S

  18. ' ~# A8 y* F# D* H9 ]4 U) d
  19.         /*串口输出字符*/$ [6 E0 K0 b( V3 h7 ]; l
  20.                 f_printf("LED1_TASK running.");     
    , |. K. P5 ]& N
  21. - i# S2 I/ e5 C  m2 y) J2 q
  22.                 vTaskDelay(1000);
    ' j- t! j0 }$ V8 `4 h% k) F; a
  23.         }/ n/ S* @  k9 j- g
  24. }
复制代码

7 i. q) v1 |/ K& k+ G( o0 [————————————————! j" H; U- A. q" s' \
版权声明:SCCELE' `9 n2 U: v* F2 o

# B, x2 W9 V- {
赞 收藏 评论0 发布时间:2022-10-28 15:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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