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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中
! k) g6 ~" S' W2 k9 Q8 i' k% C9 w9 w+ Q( o; n; }9 [
2.重定向printf到串口,在usart.c中添加代码& Y$ C* _9 n" Y- s' h8 y( y

0 ^/ s2 b+ g( b0 B
  1. /* USER CODE BEGIN 0 */8 k( F" s. x" c. a# n! T

  2. , D" W! y" B/ b! o3 R
  3. #include <stdio.h>
    % ]) c1 Q/ m6 ^6 S7 g  e
  4. #ifdef __GNUC__
    " Z3 N0 h. @7 W: z7 K( f6 [
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf; b$ h% l2 u, R- ^0 [) P: R, ^3 D8 U
  6.      set to 'Yes') calls __io_putchar() */& O. a8 o+ C: q9 z- e- e0 q
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    : G3 Z3 [+ e; {6 g% ?* m$ L1 m, ~
  8. #else- z; w. J4 l; T8 \$ b
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    $ F! y- q1 x" \" d1 k4 S
  10. #endif /* __GNUC__ */
    8 A7 e6 a) X7 c4 h, J' J2 @
  11. ///**( J9 w: g+ h# J; h- g
  12. //  * @brief  Retargets the C library printf function to the USART.7 {& I  n( B1 M
  13. //  * @param  None: x' T: u' \; s; ^) X8 e
  14. //  * @retval None
    , n! x; d% p7 \* `8 u% V6 @" D
  15. //  */
    9 n! F# T: g) o7 c) }; ]. o
  16. PUTCHAR_PROTOTYPE1 w7 G7 {& ^- t# b4 [2 u0 A# \
  17. {& F9 O2 l+ \+ H+ c
  18.   /* Place your implementation of fputc here */
    $ d5 i- Z* F) C0 H1 y4 t$ q+ B4 F
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */; I* q. f/ d$ B0 I) X) t, A' Q
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);- T: ^9 r7 v, l$ d3 E1 b/ ~$ `

  21. : W. B- v; g% A, Z; @5 l
  22.   return ch;- h5 ?1 m) k0 G. k* K
  23. }
    ) A, N7 \. A) [& q

  24. 5 R' g- _8 E8 A& Y
  25. /* USER CODE END 0 */
复制代码
9 p  Z- r* ?" y. \  ^$ x' P
3.修改printf-stdarg.c
$ o, v) q3 P1 |7 ]' w3 I4 V7 [- v  v7 \
  1. /*0 y* o" f6 D  D
  2. #define putchar(c) c
    ( ], n5 `& `* n; n5 h: g
  3. */
    8 V; t; a# [+ M

  4. ) e& |  ^; S: Q* _7 E" n& _
  5. static void printchar(char **str, int c)
    # r3 @' f- K6 p" W
  6. {/ O7 [: ?  {; b: Y' B: ~+ ^; N
  7.         extern int putchar(int c);       //去掉原本的注释
    : w* ~7 H0 {, P
  8.         / @) Q  a- F* s- j7 u* H
  9.         if (str) {% ^7 y# w  z- V
  10.                 **str = (char)c;3 z( I* Z, x0 \* _9 @" Q
  11.                 ++(*str);5 r8 ^! _8 R. N3 \4 ^
  12.         }- j5 E5 z" v0 P, z" N
  13.         else
    ( S, U) h) ?# |* |7 d3 ^- Z% A6 \
  14.         { ! l/ D: Z, j0 t+ F3 a7 G
  15.                 (void)putchar(c);
    9 k3 {/ c6 U" c4 d3 S- s7 Q
  16.         }# A. Z: e# Q/ q" i8 z- B4 A0 ~
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/
      O# j* s/ s3 ~0 T' B) t
  2. int f_printf(const char *format, ...)
      p) f7 m, r$ ~! g, C3 j
  3. {
    5 G" j, ^8 D! e; J7 n
  4.         va_list args;8 _. ]- ~4 r' [# I# M

  5. " F  q# |& c+ i9 |
  6.         va_start( args, format );
    : V, C/ l& j4 g" V
  7.         return print( 0, format, args );
    " n' E1 q6 R( \$ ^) F
  8. }
    * d& w2 K; R5 x8 _  }  p1 m$ O

  9. 4 B# v) {' K9 `& F% Y
  10. int f_sprintf(char *out, const char *format, ...)
    ! ^" ^/ ]  Z; d" k
  11. {
    2 l  O; x" w% S. j' ^" T
  12.         va_list args;1 |& h1 i: B( o2 A
  13. ( u9 S! A5 F$ A7 R3 R0 j
  14.         va_start( args, format );
    ' c+ ~6 p! z, W6 G* D9 a- ?
  15.         return print( &out, format, args );" D" N* C* E6 y4 b9 c, Z1 h
  16. }: ]1 C2 b/ K: }- ^  v
  17. - q, ^3 B# J+ a
  18. : b4 T7 P7 X7 j  C2 e* K% l& I, S
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )
    & ^' W; q+ g) G
  20. {% M( r5 p, `2 W' X& h
  21.         va_list args;8 N0 |2 u* ?! _
  22. ) \* m$ K$ T. r; e- T' ~# L
  23.         ( void ) count;
    * i$ _& }1 x5 m5 Q
  24. " W( E- @, P! m; i/ s  J& n
  25.         va_start( args, format );1 }- `) [+ G: o8 v/ ~& ^+ ^% K: l5 e
  26.         return print( &buf, format, args );
    # u! X: G* b' e- g: Y
  27. }
复制代码

7 h: U& g7 b* x+ O 4.修改main.c3 O+ V  h0 m: p, ]$ y$ A
( t6 V, w. x* v5 b* A
  1. #include <stdio.h>" m, O# ]2 |8 B; S( O: S' ~
  2. extern int f_printf(const char *format, ...);. \/ n- P, G6 i6 P; m
  3.   p6 [2 W' e3 u+ M( u' y" U
  4. /*
    $ i" P# ?6 y3 v( k' z
  5. *. v# c; Z( y: M2 m
  6. */
    0 |6 u$ Z- c4 M
  7. int main()% G# j2 E+ [' j  R/ l; W( Z( V
  8. {
      Q& m! ^/ l' o4 R2 W1 t# a
  9.   /**/
    4 u. T/ j* |1 q, U$ P
  10. }
    ! D" z; F) G% r) w- T
  11. - r$ l6 s0 K& ]2 D" e2 H) n( _" l
  12. static void LED1_Task(void* pvPrameters)5 ~% I; y: p: @' _1 Z
  13. {
    4 ~4 M7 [0 o2 u6 s$ L6 r' O# d
  14.         while(1)$ ]( B9 k' x1 O1 ]: X" |
  15.         {" ~, e9 e3 h. ?2 a5 \9 T6 d
  16.                 temp_count++;+ ^$ b6 f( G9 Q" {' h, ~
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    : g$ H* g% {# K& [
  18. % Z; P& u4 G3 a6 K" ~
  19.         /*串口输出字符*/7 `9 f/ B6 l* J: B" H2 s2 D
  20.                 f_printf("LED1_TASK running.");     - X) ]  n0 M/ u8 f$ n$ M0 i
  21. 0 h& B6 c/ m  H# s( l) W0 i4 O
  22.                 vTaskDelay(1000);8 x7 R6 [. @+ C7 C2 v
  23.         }8 {/ U$ s4 v2 t# A
  24. }+ C* c, `( I( f- q, l* e
复制代码

! F, }+ Y; z  F% J! ?7 D( }' [" a2 N6 [
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版