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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中& Q0 f  e* W8 X: N* m' M
% m/ j( l& h& O
2.重定向printf到串口,在usart.c中添加代码, k' B0 b9 ]( ^% P

7 j& g* Q+ T0 E0 ~
  1. /* USER CODE BEGIN 0 */* V9 v% D  L7 L7 K7 ~" m
  2. , S/ w; S6 m0 K8 Y; r4 N
  3. #include <stdio.h>
    & ^; P/ o" o% W6 h/ S
  4. #ifdef __GNUC__7 @& L" d# H7 t# Q: g, c- P, {# n
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
    : A1 n& _0 Z) p: ]- ^6 }- b: g' _  i
  6.      set to 'Yes') calls __io_putchar() */- V' e% J& k9 P; a0 h/ s
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
      ]5 I( j! z. z" ~$ U* j; t
  8. #else
    ( V% x8 ?& D; Z5 i- ^2 o% n6 [
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    & V+ r3 l: J) E. N0 Q8 _
  10. #endif /* __GNUC__ */
      p/ h7 E+ I3 m: l2 B) }. O
  11. ///**" S/ P: p) R  i0 Q, b% a7 y
  12. //  * @brief  Retargets the C library printf function to the USART.
    ( f7 b+ Z* `' Z: p
  13. //  * @param  None
    + P4 s+ o' W) z3 }3 n  d  L
  14. //  * @retval None
    5 H* i% G4 I* X
  15. //  */
    7 W; @, s0 S# \) A7 q0 a, W
  16. PUTCHAR_PROTOTYPE
    7 p) d& Z' |- j+ i( y
  17. {  [) }' V8 v* I2 _( S* c2 `8 S6 N
  18.   /* Place your implementation of fputc here */" @% K% v/ ~2 {, ^7 w0 x- k# ^
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
    ! i0 p- p" p, c: p' h. q" z
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);# l, E5 P: a  ]

  21. 9 s9 `: U) U, w$ I- Y! N
  22.   return ch;4 |7 f# P7 J, t
  23. }2 D9 Q( y$ `" b( p8 G; u
  24. . B7 l( @, ]' w  ]$ v8 u
  25. /* USER CODE END 0 */
复制代码

" j2 J  f$ T+ M" }: T  t; c3.修改printf-stdarg.c0 b' |4 x) t" b& u: H) N* |
6 p$ \8 T( C" Y
  1. /*
    5 U3 f; k0 w. @* V
  2. #define putchar(c) c
    + n5 [7 T9 Y5 ]$ i
  3. */& `* u, t8 ~! j; {/ O) [
  4. + U0 [3 U6 P4 o/ m
  5. static void printchar(char **str, int c)4 J4 O( R: e$ D* c( ^; F! D( q" d
  6. {
    ' _% ]7 d% {/ }+ M7 @) X3 C) ~6 N# b$ U
  7.         extern int putchar(int c);       //去掉原本的注释4 Z+ F0 w7 c2 W& @
  8.         
    7 p0 y7 j% u# n/ P$ `' o, x1 Y4 E
  9.         if (str) {5 g; r3 z, A: T. F# U
  10.                 **str = (char)c;
    9 S( c  @! k0 D4 d* H9 i
  11.                 ++(*str);1 A+ e0 S/ f$ {' m* w  T& }7 O
  12.         }+ k2 k: A3 a# }, R" k4 E. n2 z
  13.         else
    8 _$ s# J9 e7 P/ e. o" `4 ~
  14.         { " T6 n( F/ \/ _' V7 o+ d2 \* `
  15.                 (void)putchar(c);
    5 `  R+ G  I. a3 W3 {
  16.         }
    * k$ _% `: g3 O& D: d; q0 W+ C) j
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/
    7 ^1 r& h; J3 [  Y6 ?
  2. int f_printf(const char *format, ...)
    ! D" Y% o0 e; G; l* I: Z7 m( F% s
  3. {
    5 [( Q# t2 q0 l9 S
  4.         va_list args;
    0 f( B9 @( ^( h
  5. # G" g0 v6 M: m2 F5 S# ]6 x
  6.         va_start( args, format );
    ( \' W1 m. c: f# a" G
  7.         return print( 0, format, args );- A- R/ s+ i8 I8 A. x
  8. }1 I$ ]0 M- w% B* ^0 ^& L
  9. 3 D+ {' \+ r5 I& }9 l; n
  10. int f_sprintf(char *out, const char *format, ...)
    & W1 o& E" P/ u2 @0 P
  11. {
    . ^) O4 n/ V; |+ m1 G
  12.         va_list args;
    , J) S" \, a7 B( r5 d  B7 a
  13. ' |" w7 a  t# a7 |4 e
  14.         va_start( args, format );
    " J3 F5 [0 x' Q2 ?5 n* _1 h: d
  15.         return print( &out, format, args );4 H7 ?. N# t* [/ h: `6 x; L7 f- M, W: U* I
  16. }
    ! u3 D, @5 O" H% ~# j4 w' f+ p; @

  17. # T$ [/ I$ V; U+ s* j4 H( X  S! }

  18. . Q7 ^8 @4 s. h, f" T
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )
    ' s) Q0 f4 |- Y; m% T3 t2 m/ j; O
  20. {
    ) A3 P+ i) _$ _
  21.         va_list args;0 g, E0 y/ l. H, o! [4 p* `" G

  22. . q, s. l5 f7 z1 M" |/ Q
  23.         ( void ) count;1 [5 a0 g& L) F  [# h
  24. ' ?5 e& r; Y2 w- M1 g, t. s' {
  25.         va_start( args, format );  c, Y9 g5 G1 W
  26.         return print( &buf, format, args );
    ) r7 Y# i( u  {, k1 K& r+ \7 g
  27. }
复制代码

2 d4 f) o; d, T% {" i! b  c/ q% J 4.修改main.c& {8 H- y( I4 _' `  K  \( a

# C5 T+ ]3 h9 ^/ {! H
  1. #include <stdio.h>: j1 H% f! [/ v( ]
  2. extern int f_printf(const char *format, ...);
    " c8 ~0 Y$ x* z5 e, ~6 [" f0 `

  3. ) O, l5 ~" {+ y' T# Q4 w1 b; n3 `
  4. /*
    ; R. T( i& E3 D2 |) f
  5. *
    ! v* G2 o% F6 o1 P+ R! d# c+ K2 @
  6. */) n6 S4 Q& C$ t6 H( S, o
  7. int main()
    : E+ m: s8 D5 j/ A/ C" N
  8. {
    : V' V" R/ ~6 p5 n& E
  9.   /**/) d) f* h# z& M; `; {. K8 X
  10. }% S7 A1 p' m2 }) c; V. w! @- ~

  11. 6 O, i9 L% A/ R/ P4 T4 U
  12. static void LED1_Task(void* pvPrameters)+ R) c# ~5 w- X! L) K+ k2 w2 N
  13. {
    " s: N- E2 j. Z; }$ O) G* T
  14.         while(1)5 r5 g! Z# U% s: f" k. c, O
  15.         {6 a6 l; ~+ X+ w! `# {6 C
  16.                 temp_count++;* ^, W( {2 o9 W6 [( T' d
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    ; I+ v2 }$ e# G; ^+ f$ l2 T
  18. : j. w. L* K2 D
  19.         /*串口输出字符*/
    8 f2 b. E5 B* V. Y
  20.                 f_printf("LED1_TASK running.");     / v5 _( ~8 ~/ G0 S0 T
  21. 2 O* h7 s7 ^; `9 ^& [
  22.                 vTaskDelay(1000);
    : s# i7 k5 m- S- y3 t1 N& ]3 {+ Z
  23.         }
    + M; }" r3 L; a
  24. }; ?: Q2 K' K3 ^' ~6 _2 I) H
复制代码
3 U% ~" }. R1 u+ o6 {* T
* ^5 l8 m6 b# H1 @) l  d4 Z
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

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