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

【经验分享】STM32G0学习手册——FreeRTOS中使用printf-stdarg.c进行串口打印

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中
3 S/ T- D3 Q5 a- b4 V; v/ L  O% z
2.重定向printf到串口,在usart.c中添加代码
. W- x+ h1 S$ q, i
6 d: Q( q: R, m7 d! ?( H4 a
  1. /* USER CODE BEGIN 0 */" {5 @1 h2 v0 V  {$ f

  2. 9 r1 f3 t0 }) ?, {* |# c
  3. #include <stdio.h>* ~5 |, T6 s7 Q, v9 e% ^. M0 H/ T
  4. #ifdef __GNUC__
    4 y& |# y# [9 _* i7 L3 b1 X7 ]& e
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    % N$ x- l5 a4 c# l/ T6 n0 C
  6.      set to 'Yes') calls __io_putchar() */6 x" d8 X( v4 _, H
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)* T5 A1 H2 A: V) `/ _6 z5 j6 D
  8. #else
    , o* X+ B/ h! _. p! z( G$ S
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    ) \" l. T3 Y5 Z- ~8 q( ]6 e5 T
  10. #endif /* __GNUC__ */
    $ N4 X) ]- U6 k7 n
  11. ///**
    ! O$ a! l# J/ m0 v0 v
  12. //  * @brief  Retargets the C library printf function to the USART.
    ' i1 H9 {0 x; N' t1 B/ q8 v
  13. //  * @param  None4 j" L  S$ y$ g" X
  14. //  * @retval None! O9 z, I$ o! k/ n
  15. //  */% c" C, ]: l* c1 c
  16. PUTCHAR_PROTOTYPE; f' Y( V; A+ o' [% [0 b
  17. {
    , |& [9 I! @; |; T! [8 L9 D
  18.   /* Place your implementation of fputc here *// A/ k- S2 M) F& V1 z
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */8 B$ f1 R0 P" G: ^/ q
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);) g5 _; g( a; M3 I/ @! ~. e
  21. - Z4 k* K( a: T- j: D" W
  22.   return ch;
    2 w7 z; N, m; _: D! [
  23. }) H" B  D* F$ L  S( y, Y- S
  24. 7 N, q* b2 \( w; U# T
  25. /* USER CODE END 0 */
复制代码
) z6 g% z' H- G6 F8 N8 q
3.修改printf-stdarg.c6 J4 _5 |8 U$ L+ D1 N, Y

+ c( v: r9 b7 Y0 t/ w+ K
  1. /*) ~4 T3 r2 v: z4 r( E  s
  2. #define putchar(c) c8 M' E4 k0 ~/ h, D/ I( }8 n5 E& J
  3. */9 F7 h$ Y  Y. p1 a5 v" H6 r

  4. " A# ~3 j+ C. {& [# }
  5. static void printchar(char **str, int c)
    ! P( ]5 M  [: K- Y$ @# c3 P/ c
  6. {
    " ?" v: H* C8 z8 q1 P  x. Z" B
  7.         extern int putchar(int c);       //去掉原本的注释
    $ q0 o/ G3 T) }9 F3 Q
  8.         
    ; C4 [  d0 F: Z
  9.         if (str) {
    . V% i& R6 j7 b* _1 P
  10.                 **str = (char)c;! o8 K0 c. G1 U; C! i! _8 X* s
  11.                 ++(*str);
    1 G/ I" Z, Q7 O$ ?
  12.         }$ V  _' X: _; {" \0 C5 v) t
  13.         else
    . Z& c3 x1 I7 B! i
  14.         {
    6 b$ [: P! L+ \
  15.                 (void)putchar(c);- L  a5 z" E2 E5 G
  16.         }
    4 r! v& {& Z; d( H# F
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/) [+ T; j, D# R. Q* z8 f6 P4 n
  2. int f_printf(const char *format, ...)
    - y' S8 G$ S: B/ j  k$ G; q
  3. {3 p7 f( P8 \' U1 e+ }$ J
  4.         va_list args;  Y0 k1 X; w: K$ w$ m% P& C  b

  5. 9 E, q- [, y0 R! E1 A/ A% F( w
  6.         va_start( args, format );
    / ]3 J6 N6 _8 b& J. \3 O
  7.         return print( 0, format, args );0 o5 U* u# m( A. M9 V4 B6 o, S; E. s+ k
  8. }
    7 t* r0 z# `+ R2 q. X
  9.   ~# g8 n  m+ J; M; _& f) V
  10. int f_sprintf(char *out, const char *format, ...)2 a: \9 g' M& d. R+ l' j
  11. {
    8 a4 z7 s. H: n7 X
  12.         va_list args;0 d  n( x8 T. }: f+ |
  13. , m5 g1 E' e5 G" D* \
  14.         va_start( args, format );7 b8 V! S2 h% b* A
  15.         return print( &out, format, args );
      H0 g: Y$ N. p) s: v* h) A# Y
  16. }- m. W8 j5 i; Y1 f$ P( C
  17. : G& r1 X( P- I, c" l. j) m
  18. 3 [# l# \& |5 |! `7 {: `8 x
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )
    3 |9 N. h. ?& S) q) S2 G
  20. {
    ' Q, n4 q9 b1 s- _! c; r
  21.         va_list args;
    & j& Q* U' m+ l% |1 M" A
  22. 7 K% o$ t/ S  g  ]& `" _
  23.         ( void ) count;
    : Z; G  {8 J  P- h# A0 K5 r2 e

  24.   _) [) q0 o9 D  n& }
  25.         va_start( args, format );
    ' W8 g3 s! @6 ?3 ^) b' J$ ?
  26.         return print( &buf, format, args );
    / K: Z1 Z- U+ T: U  T
  27. }
复制代码

' T4 \3 q% ~% J8 ?5 t/ S) w 4.修改main.c
! \% Y. n  S* [, C4 w$ a6 b7 H. `4 _% |1 j; ~
  1. #include <stdio.h>6 d% Z9 i0 [& B2 I
  2. extern int f_printf(const char *format, ...);) ?7 f8 O) q+ Q5 w) j
  3. 8 X+ X( e7 `: T) D6 g8 M% D" ], A
  4. /*
    % J  v& K, z5 L( i) D: x6 V% c
  5. *
    * v' y4 r( u( x( L. X* j$ }- k2 m
  6. */
    5 a4 D. D. P2 M7 t5 f& g
  7. int main()
    2 s) k# t, }+ `) e( @' E
  8. {% X4 @9 s* |' e( ?9 E' r
  9.   /**/! X5 o- \# `. E  s
  10. }
    . Q0 g# D+ W1 A
  11. 1 o5 Y, n- @. W0 a. A
  12. static void LED1_Task(void* pvPrameters)
    1 L1 d; }* ]8 ]& S# D( n; M
  13. {1 G6 I+ V. Z; z" f5 T& T
  14.         while(1)' j! W5 f6 w3 w, f9 v
  15.         {
    3 ?  y3 h9 r1 |9 l' W
  16.                 temp_count++;  y1 g. P3 T) W1 K$ l; H
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    ) b4 {- U& K" C9 g0 D2 ^: }
  18. ) x) R; ?0 m3 y7 f5 x( Y  c8 Y
  19.         /*串口输出字符*/2 Y8 J; q4 Z% X: ~0 G; q1 _( b
  20.                 f_printf("LED1_TASK running.");     , x! Z2 j9 M2 I2 _6 H' c4 i  ^. I

  21. . P, _% s" p) v9 p
  22.                 vTaskDelay(1000);# `2 J' J" z: O
  23.         }
    7 D+ ~) Z! l# ?  p3 `8 E
  24. }. ~! h5 V" t1 a$ ?! O
复制代码
2 L0 l" s% M- \( _3 K
2 O1 H* n6 T  d1 D3 B
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版