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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中9 W4 p* i9 u+ V: k
! d* F( [: f3 W% C
2.重定向printf到串口,在usart.c中添加代码4 b. ~, i* r' L# K- U8 R9 a
8 ]+ k$ K+ E2 L9 }; _
  1. /* USER CODE BEGIN 0 */
    ' B0 C- _9 l. d
  2. : b" P) r- d5 c4 t
  3. #include <stdio.h>& K# {2 H: P2 t$ `( k  E: t* \  k
  4. #ifdef __GNUC__' ^8 s! J3 l: ~. U; E1 {: d
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf3 b! _" e5 g% Y* W) H5 b3 e
  6.      set to 'Yes') calls __io_putchar() */# H4 ^# Q0 V& C
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    / v: K4 Z" r$ P; s/ [
  8. #else3 J* {! A$ v; X' l
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    9 k! B, s" L4 v& e
  10. #endif /* __GNUC__ */
    , O, z8 F- t8 J% U% t
  11. ///**
    4 E7 F0 j" M1 F8 C7 u5 J& a; R% B
  12. //  * @brief  Retargets the C library printf function to the USART.& v& B$ v2 R5 z0 _1 v
  13. //  * @param  None# |2 Q; i  _3 l
  14. //  * @retval None) v8 @) t8 s( y9 q3 d
  15. //  */# O4 g$ I' ^# p; h2 S1 m
  16. PUTCHAR_PROTOTYPE1 N' U# A2 h6 v6 j9 E7 w# {' P
  17. {# I/ [. m! w$ Q3 T8 R
  18.   /* Place your implementation of fputc here */
    # j5 k! N$ G5 K. P1 H# s; `! A3 q
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    + U7 a7 l$ p5 _  l
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    . g4 J4 O1 C. i
  21. ( r2 {# [6 P5 l$ y4 ^
  22.   return ch;5 Q/ S4 S5 O5 n
  23. }! C& y4 P+ }9 S' W( O

  24.   L2 @$ @) C0 V
  25. /* USER CODE END 0 */
复制代码
& V* i  [# |9 P! ]% x
3.修改printf-stdarg.c$ b( ?2 k4 A# N% x- `

$ _- k' O1 h) P8 s5 ?
  1. /*
    * j9 \5 `, r: h+ U; W$ ~6 L# f; b
  2. #define putchar(c) c. |% e, B. S# n0 R. w
  3. */: V8 x6 L3 W7 @2 H

  4. 1 K/ j" _! ~" E: u  ~+ q# P, J
  5. static void printchar(char **str, int c); _4 F- K- x% D3 P, V1 C8 F% ^
  6. {
    ( ?) d- B. N; t& p; R$ R
  7.         extern int putchar(int c);       //去掉原本的注释
    " k0 B; _& g5 v9 ~3 b' {; C
  8.           @  D% E9 n, f6 |2 {  q- o& a* k0 {
  9.         if (str) {" X4 ~; I+ p, p, l4 V# }
  10.                 **str = (char)c;' g7 T% n+ a- N- ^! G9 U
  11.                 ++(*str);
    - E" w3 _5 m4 J' A
  12.         }
      C- J. o& J( A/ h( G
  13.         else
    8 A5 F, M' S$ }' F2 q  I
  14.         {
    - m. N( p* _; H
  15.                 (void)putchar(c);' W$ r1 _" p/ w( c# K
  16.         }
    . x, N, m: ]& ]* m( q  g0 g
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/
    ; {' M& p( f7 B* j  N
  2. int f_printf(const char *format, ...); U$ Y& Q$ _" r. _" B& M5 o
  3. {5 T# _# P2 [6 K3 U0 H9 q* k
  4.         va_list args;8 y7 b0 f- S! h  t1 d9 _& j! Y

  5. , m8 x+ I3 v& D' O
  6.         va_start( args, format );- A0 e5 X" U7 q* l' K9 }2 m
  7.         return print( 0, format, args );
    4 _+ ^5 v$ r; p, p- q
  8. }+ A: O; ^6 R- w9 Z- k. w, l
  9.   W! ~! E9 Y& T% ^1 @4 \
  10. int f_sprintf(char *out, const char *format, ...)) ?% t6 _) b. ^: ~* X0 i
  11. {
    8 c* d) k$ d: e3 Q0 B
  12.         va_list args;+ u3 \- h2 p3 Q: i" X+ _$ `( B

  13. 2 U- h0 U3 b- L4 m6 Q
  14.         va_start( args, format );
    . @5 L" g7 M3 c+ ]# m- y4 F
  15.         return print( &out, format, args );
    8 ~1 b3 f: O$ F# L+ ~! x4 l& x
  16. }
    2 z/ g% ]& z6 R3 O
  17. 4 Y0 g1 e: d( m% F

  18. ! w) B6 j  D1 e9 j( [3 j5 {
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )1 s1 p4 ^1 Q8 |& B; ^
  20. {
    5 Z9 Q' J- ?! [. a. V) ?2 ?
  21.         va_list args;
    ! f! ?; W% w* @4 b: f3 f
  22. 6 N. n3 Q( Q# l) t0 S
  23.         ( void ) count;
    & Y/ g1 p9 ~  W

  24. 4 R6 \2 C2 y4 [7 x& R: K: E+ T. t. j/ X
  25.         va_start( args, format );
    5 z" [( F* }- R  V# A
  26.         return print( &buf, format, args );8 K# K$ c" y, H0 l5 F) N
  27. }
复制代码
0 ?! |8 n& |+ A5 _. h7 @2 \; [, c
4.修改main.c
# Y; x, \8 D4 Q& s$ ?7 T' K9 A$ G; s2 I
  1. #include <stdio.h>
    & o, S* E9 m: v
  2. extern int f_printf(const char *format, ...);
    - _5 x; l" f9 N  Q  Z; b0 h

  3. & n1 h$ C" r7 h
  4. /*
    : q3 a+ m1 _' `! F! F3 V: s5 E+ R
  5. *
    ; |5 b  O7 i( h7 o5 K+ Z
  6. */# A, L0 M, n% b; L& N. m' J6 v
  7. int main()
    2 L+ G" c' T3 T. \) @
  8. {
    2 [3 R$ `- }6 q, f8 r- i/ I2 H
  9.   /**// b6 ]3 W- @1 y# R* g9 P. Y' C
  10. }% Y3 j" Y& [. o- G2 l

  11. ' F+ O6 n+ v/ n( G% {; c6 L
  12. static void LED1_Task(void* pvPrameters)8 F5 g- c8 e# f+ W: U: P4 o5 J
  13. {
    / J" M. X. i# ]5 a. W' L
  14.         while(1)1 E. Q$ E3 I& @- m% s
  15.         {# x' ]  Q" ^- {; m/ r4 D8 ]. _
  16.                 temp_count++;
    . @* X: m* F( C5 N) [1 q2 E
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);! u/ }* U1 p+ k# Y2 c+ m
  18. ( ?/ o* D/ }  t! b( F  R
  19.         /*串口输出字符*/
    ; n7 l( j' M- R+ ^! b  j
  20.                 f_printf("LED1_TASK running.");     
    0 h# o/ h* g" e, b0 h$ k& C. b2 X
  21. ' P$ C# I$ R4 A. t1 r( O
  22.                 vTaskDelay(1000);2 r8 G( z; \6 [& @  |+ \. Z. k
  23.         }
    3 X% w- L& ~, o- R" j0 D
  24. }
    % R; p) o" w" [0 h7 ~
复制代码
+ T' K9 n; B; n
1 ?! I9 P. g& i# e( S
赞 收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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