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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中
8 r% L% a. }- H  m0 D1 s2 L/ v" }
+ y" O+ B1 h' a, `- p2.重定向printf到串口,在usart.c中添加代码7 _) _8 v6 C' t- J) n: H
, ]1 W+ l8 d2 w/ K' Y9 M: c' y
  1. /* USER CODE BEGIN 0 */
    * B% q5 I  S6 x7 ~2 ^
  2.   |  c9 F+ [; s: s( |
  3. #include <stdio.h>
    ! L- ~3 m9 u2 ~
  4. #ifdef __GNUC__( s' K' m6 i& d7 O- g) p
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    6 j. u1 F. \/ N/ ~' o5 _& Z
  6.      set to 'Yes') calls __io_putchar() */
    $ B$ Q/ c/ U$ ]7 F. ?/ T
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    8 G/ t0 X' v5 ~9 B4 v
  8. #else
    . d5 L/ j$ x3 g6 M/ p
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    . t  F6 |3 b3 H" U9 X
  10. #endif /* __GNUC__ */
    8 |; F# b0 r8 Z) u
  11. ///**
    6 W7 o/ b% Y5 N  F! S' {
  12. //  * @brief  Retargets the C library printf function to the USART.
    - {8 p& X, j' b" V- s7 q: b# Z" R' b
  13. //  * @param  None) |5 j0 N* {/ _# n, M* u* `
  14. //  * @retval None
    & H5 Z* |" |& Z& N4 N* W# C
  15. //  */
    : l0 h- }  p  i* ?
  16. PUTCHAR_PROTOTYPE( O! D5 L9 o- B$ g
  17. {
    - M$ ~. Q9 U# k. t/ l
  18.   /* Place your implementation of fputc here */
    4 K$ ]4 o6 Y3 S5 z8 H
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    4 J  N: s7 u9 A
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);8 C7 C& g  y$ r' K# T1 m0 B

  21. ' c- O0 f! c! b& J
  22.   return ch;: G3 P0 r' q& E/ L9 r
  23. }! p1 I5 `% S) T; V2 m
  24. 8 s. d# j9 c( c2 s8 G
  25. /* USER CODE END 0 */
复制代码
( o3 @+ a2 I" X7 s( @
3.修改printf-stdarg.c
6 ^: n( G1 C8 Z$ b
9 c( d7 c3 X) }! u
  1. /*1 o; U0 a3 {  i5 q! @+ S/ y
  2. #define putchar(c) c
    # J; {! h6 s, N5 i, {' q4 @' p& u8 Q
  3. */
    " m( e% q  A- Q) P, j# M+ Q3 D* U  x& @
  4. ' |  \7 d1 A! r. S' K3 l- j% U
  5. static void printchar(char **str, int c); d0 M  p: `6 Q- o) ?4 `
  6. {0 E6 r0 D- g- h$ ]6 t" P
  7.         extern int putchar(int c);       //去掉原本的注释
      [1 u" n# E. {
  8.         
    / \7 |: q, g& y' I5 m
  9.         if (str) {4 v6 b* x$ R; I6 x# X: l( K0 W
  10.                 **str = (char)c;! U1 p- e0 z3 e' l. b7 W
  11.                 ++(*str);
    4 I. ?7 N9 I9 n" c$ o
  12.         }5 q$ `/ y/ f0 t; [# z6 V
  13.         else- X) P. M# L8 X) M6 Q: X
  14.         {
    - ^/ m" c6 {. d# f- l) |% b
  15.                 (void)putchar(c);& v: {4 A, V6 \( G
  16.         }
    ' S( I; G( s5 w1 Z
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/# W: V# w7 M* D+ S5 t; v
  2. int f_printf(const char *format, ...)
    6 `. ~$ |# Z+ x9 K
  3. {/ S4 u. U) R! m: F
  4.         va_list args;0 P2 k5 a# [7 D
  5. 4 W% `- |" Y  r1 `
  6.         va_start( args, format );
    4 M9 z) V7 M( r/ Q4 L4 y& t& P
  7.         return print( 0, format, args );& |$ r4 Q. O* ~( d* k/ s& ^7 X
  8. }
    ' k6 a6 {. w5 \1 U  O
  9. 8 s- \8 _! o8 [+ W
  10. int f_sprintf(char *out, const char *format, ...)+ w/ i1 w$ b: D8 ?/ e4 U
  11. {7 z' j7 n0 B* [
  12.         va_list args;. z- J7 h9 w7 S, d6 t
  13. : h0 u0 k* ]+ B2 v- C) }
  14.         va_start( args, format );
    3 F* s# }; z0 v% B
  15.         return print( &out, format, args );
    : Q5 ]1 G( R: Y6 q' U" F+ N
  16. }
    ' x2 b3 @# h" O) f

  17.   a& S) Y% L; ~

  18. & B0 L3 h" X9 z9 L1 J  d, d: B
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )' T# V# Q' e! A3 I5 z- k) j
  20. {% R+ z$ A, n0 e$ {2 F/ P5 L6 b! G0 z
  21.         va_list args;# Z, ~/ G5 [& t. n

  22. - v) A- d' s( e# n/ O# C' f
  23.         ( void ) count;
    & o' K7 @2 [/ p8 [
  24. 8 J/ [+ e* G' g- R+ F) m; N
  25.         va_start( args, format );& }! y$ T! N* q8 b. a
  26.         return print( &buf, format, args );$ C) N; o; g% B/ d
  27. }
复制代码

4 C( ?0 T  c; z& m" W 4.修改main.c1 V+ Q2 I' m+ z& ?
4 _8 P& x7 @& q" N7 _5 U3 i
  1. #include <stdio.h># @- s9 k, ]2 h1 M5 S2 }
  2. extern int f_printf(const char *format, ...);
    8 F0 H' Q+ ^+ f
  3. 1 I1 F, e2 {' f6 i: x( j/ A
  4. /*' M$ S5 @9 S# O6 L/ @
  5. *
    ! A4 G+ f2 K& i
  6. */
    9 u4 T1 S8 W( @1 k3 M% P+ o* ]
  7. int main()
    # F( T. Y6 \6 z# V% x
  8. {$ V& C  {" Y  v+ |" ~
  9.   /**/
    # F6 @1 ?1 G, r
  10. }. \1 b, J& W: Y) _1 K- l" o
  11. 0 V% Q  l$ o+ F
  12. static void LED1_Task(void* pvPrameters)' _" r% ?6 s- c4 P# `+ r' }1 D
  13. {$ j; q3 x. {3 X3 l' q! q0 p5 t
  14.         while(1)8 s4 d. a# O) ?) K# @- w
  15.         {* O2 \1 y! _' r+ R8 B# P
  16.                 temp_count++;
    . [! j8 T/ L6 }: ?4 k
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);4 _* m. E# g1 A1 X7 ~" ]

  18. 6 ]' x  r. s5 l  Y
  19.         /*串口输出字符*/
    % b. h5 _, O- u( D; A1 b
  20.                 f_printf("LED1_TASK running.");     $ v2 E4 R6 s7 w  l" D# k7 ]

  21. 2 P! |- `0 y0 p
  22.                 vTaskDelay(1000);
    6 G1 d9 W& A6 I# N% _( @
  23.         }2 m, [) N/ @+ C& _
  24. }8 z8 c$ r1 V& E+ D
复制代码
, S1 v& d: S4 _+ v6 m

8 ^& l# K9 u# E7 A$ e$ w
赞 收藏 评论0 发布时间:2021-11-10 01:00

举报

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