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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中
% ~7 s+ H* w" u7 Z0 H: e5 U4 U  \) x0 ^- x6 I4 q  C& T5 \9 G# h
2.重定向printf到串口,在usart.c中添加代码
; J' x) x5 E" t, w' J2 l7 }1 ~3 }3 u& [7 L0 j9 s5 r! r4 d1 k0 Z. J
  1. /* USER CODE BEGIN 0 */
    + C, `$ c+ D6 t/ _( I/ `# M! V
  2. % H0 R8 \0 t: H4 e5 f# T2 w, D
  3. #include <stdio.h>2 B7 x, S. v7 \
  4. #ifdef __GNUC__
    " ^8 J& v5 J: k% e7 \* H# X; V
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf5 a' O1 v& V* t7 p0 l
  6.      set to 'Yes') calls __io_putchar() */. S3 w: J7 [% v8 r0 G, S$ c1 ]
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)/ H0 @2 f; [, W7 m
  8. #else
    $ n* ~) B6 j1 \8 V4 `! _8 ^6 P
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)& [2 K" S" R2 r, ]) A) D) @, M
  10. #endif /* __GNUC__ *// K3 e$ K& Y( p8 @2 [2 R8 s
  11. ///**2 t* E2 N. l9 b# H+ ^
  12. //  * @brief  Retargets the C library printf function to the USART.$ O9 L5 C$ Q. X" e# C* H0 G
  13. //  * @param  None
    + T' ~6 z; h3 W5 F2 d4 k  @
  14. //  * @retval None
    $ y0 T, f( ]6 F# i
  15. //  */
    3 V8 i8 ~" L+ w8 ]: S4 X' d
  16. PUTCHAR_PROTOTYPE3 c% R, N5 U; y& t
  17. {) Y, E1 Q6 f! L9 I$ d: E# a. m& i
  18.   /* Place your implementation of fputc here */* Q0 E7 O+ H  o
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */+ m& s5 ~8 f& @' y& x
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    , N3 k) q/ m1 A

  21. ) ?. A2 L6 r6 v0 x2 k
  22.   return ch;  F6 o- R+ R) Y, P
  23. }2 h4 \. a# q" l3 p+ G" K5 s0 P

  24. 3 \8 R4 g" b4 r
  25. /* USER CODE END 0 */
复制代码
2 m  A: }5 q/ N) n6 X) T2 K7 E
3.修改printf-stdarg.c
% |2 x& _4 c. z3 R- p0 S: {- z" {. {$ f# H. h, e
  1. /*
    $ t) A# \0 p8 s$ [
  2. #define putchar(c) c
    5 j. _- X- D  W, q) ?" n6 i
  3. */
    6 {; f3 W: u) C* }. b1 `2 \
  4. % G4 R- C2 ~# p7 w; F- |6 u" l8 y
  5. static void printchar(char **str, int c)1 j& C) G2 Z* \4 c
  6. {
    / p( y0 [: P6 f/ o1 j9 @
  7.         extern int putchar(int c);       //去掉原本的注释
    ' S7 O. J$ O6 _7 ^
  8.         
    6 W7 R* O6 n4 q  ^# S$ b! z
  9.         if (str) {: Q* W& c& F+ m: h( n) o3 ]
  10.                 **str = (char)c;
    % K0 T) l2 T) c& X5 t
  11.                 ++(*str);
    1 ~8 V6 M6 A/ O% G  ~' t* M
  12.         }
    1 r1 a8 n. C9 S. [
  13.         else
    8 {9 m% V- u3 s& C# g
  14.         {
    . J! I: ~/ s2 G8 K' G4 Z& M
  15.                 (void)putchar(c);) e* C( ~# R( U, q, E, `4 r
  16.         }
    ' t8 N6 C+ V, p$ K
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/- W4 |$ C$ t0 b' f2 M& V
  2. int f_printf(const char *format, ...)* K" q! V4 f8 a; a- Q
  3. {" F- o8 n8 a4 _7 J! Q& m
  4.         va_list args;
      ]. Q; n2 S8 o* N
  5. : N& V5 X; i5 g- G8 Y
  6.         va_start( args, format );
    * [2 c" v/ {! @. X+ D; G( D4 v
  7.         return print( 0, format, args );
    0 Q: i, Q2 K' _! X
  8. }+ E+ D; M& M( ^3 z1 z: L
  9. 3 O2 h% ?/ P/ v7 J0 z
  10. int f_sprintf(char *out, const char *format, ...)
    , b0 ~- k* U3 A2 A: @5 E
  11. {5 {5 Y/ p, Q7 W) I4 {7 R' g  B
  12.         va_list args;+ B% A. {. g9 I7 t! ~' H8 k

  13. + @* O9 e) C2 e: f' Z/ `
  14.         va_start( args, format );
    + e, V8 G! w& ^- o6 v1 i) u
  15.         return print( &out, format, args );& B" ?. n4 u& O2 d* I% {# M8 }, d
  16. }
    ! {0 I3 H8 L( @  h7 U# X
  17. " @1 n$ w' y1 P
  18. 8 M! Y  }8 P( `1 R- h* @
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )$ t4 X; j. y9 I3 W$ M% {3 Y9 `
  20. {  [$ P2 Y" o6 [/ t
  21.         va_list args;5 W% l' ?3 m* u

  22.   K7 f7 V* _- h, ~; J; t
  23.         ( void ) count;
      O; X; H  Z$ O3 k' m
  24. 6 I: r5 c, }! b5 J, d- V8 X
  25.         va_start( args, format );# [+ x/ B1 y( d1 y: H, O0 L3 ~
  26.         return print( &buf, format, args );+ b+ `1 k7 r: x% b
  27. }
复制代码
1 V: |4 _, z# }5 [
4.修改main.c( x, U/ B3 v+ j! R2 y4 e
, \3 c. c# R  A0 [6 e9 V) ^) m
  1. #include <stdio.h>& M1 U; G6 ~# g5 e- f
  2. extern int f_printf(const char *format, ...);1 o# T  R/ f0 V# X5 J$ m) n2 |

  3. " A7 P3 ?% k3 s' D7 R* x# N/ K
  4. /*
    - C( O0 J' |# B$ {2 t
  5. *
    ; C+ g& ^% J& ^" @- ~  q
  6. */
    ' W! c& T$ C( n- |9 Z1 N
  7. int main()5 n1 I" R& M/ c" T- K' n! v! f
  8. {" |0 M" E/ R0 G
  9.   /**/( M; z4 i: \- \
  10. }' L8 ?/ k7 g9 ~6 L" M

  11. + g) \& Y7 e9 Q6 ]; m
  12. static void LED1_Task(void* pvPrameters)0 K) b. A- J3 T4 N& h6 V
  13. {
    2 K( z2 f7 r8 B$ n3 O4 `
  14.         while(1)5 p+ r, u6 k1 G" m4 \6 p4 G
  15.         {
      }8 B5 `/ p& }; a: q
  16.                 temp_count++;$ [* S) W# l! {" p
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);' u7 I4 ^* [. W! p; f% }: p/ E

  18.   F* P7 e9 N9 {! ^# _
  19.         /*串口输出字符*/
    5 ~! Y) k! u' S' t6 h# |
  20.                 f_printf("LED1_TASK running.");     
    , {& V0 {4 M) P. B- g+ y. ?5 x6 E

  21. ! e" E* @* y- |* s
  22.                 vTaskDelay(1000);- g: }6 _* B: ~  s( v% g/ U7 c# b
  23.         }5 K: D) k- u7 e2 x6 k
  24. }! _6 F/ L+ ~5 L" z4 ?
复制代码
9 ~  S1 h) S! U0 L

7 ^) ]6 Z( e, u
赞 收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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