请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
STMCU小助手 发布时间:2021-11-10 01:00
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中9 z) Q9 I3 Y9 h
- ^+ B7 G/ y6 ?, M$ E  ?( q0 w; W
2.重定向printf到串口,在usart.c中添加代码5 H7 H. y+ \/ m, t6 F+ l2 w

; [0 }& A2 m) ^. }+ n* j
  1. /* USER CODE BEGIN 0 */
    " q9 R1 _( `$ z. v+ D3 y
  2. ; V5 B- D& C9 j  v
  3. #include <stdio.h>" ^" v# t* y- X% y" d
  4. #ifdef __GNUC__1 s7 X6 b/ v( w0 y, }+ z
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf: V# [7 p: B( W5 f! Z/ n
  6.      set to 'Yes') calls __io_putchar() */6 w+ C8 D0 t2 w0 e" I
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)4 U/ d) M) r! j, M& x" {
  8. #else+ r$ e- N7 x) j3 b; e- t- c: g/ x
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)* `$ j+ Q% _3 E
  10. #endif /* __GNUC__ */) X4 @) p9 Y. M" o, V( f9 M
  11. ///**0 u6 D% P4 D; K* ~% m$ A
  12. //  * @brief  Retargets the C library printf function to the USART.) U) _& J6 V2 ~+ V+ [5 T9 a
  13. //  * @param  None
    . B4 Z8 n, u  n: U
  14. //  * @retval None
    # v2 k# B4 U3 ~( d
  15. //  */+ R# H. C; _; }/ F
  16. PUTCHAR_PROTOTYPE' d- L) @# L) n8 C* Y8 w
  17. {
    3 k5 ~, R6 `, W. H6 U: l
  18.   /* Place your implementation of fputc here */( Q9 D* u/ V% E0 P  y- D+ A/ h0 A
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */* Y+ b. u, l- s; F% X; p  _
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);; s& g1 t8 {8 j

  21. , @' `0 U9 q  K$ I/ P( S
  22.   return ch;9 o: n( e- \+ b5 T8 }9 R8 i+ E& @
  23. }) |6 t6 N3 ~$ W
  24. ' U6 K( g5 |2 C1 \3 b
  25. /* USER CODE END 0 */
复制代码

8 ~; P  \: N/ |9 F3.修改printf-stdarg.c
4 }" A) [0 k* G+ O; N
$ o5 J8 [# F9 n9 z
  1. /*
    " g) W. ?& j3 i( Q  Z$ P% h
  2. #define putchar(c) c6 S2 t4 J( v9 o. {
  3. */3 t7 y1 {4 y4 n: O* r' c

  4. 7 B8 a; P8 ~% W- u' A6 p
  5. static void printchar(char **str, int c)
    4 D  K# y7 F7 m$ e( n6 W
  6. {
    7 p, D/ T6 }* `  `  D. L4 B. c" {
  7.         extern int putchar(int c);       //去掉原本的注释9 N. Y) u' Z" m' ]; P
  8.         
    : W1 w1 w, s; V+ h. e
  9.         if (str) {
    : I6 R# k" ]6 p! {- ^9 g
  10.                 **str = (char)c;
    $ R2 @. _5 V. x2 w( d! p
  11.                 ++(*str);) k2 p  X9 ~, H
  12.         }- o' E- h2 ^# _8 ]  M
  13.         else' ?6 i  [* @4 q* g
  14.         {
    : V$ e4 v( E- L% @
  15.                 (void)putchar(c);5 [, g( v6 q. s0 z" ^
  16.         }
    * J' j" ^' a# f8 Y6 {
  17. }
复制代码
  1. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/
    / j) h: K* |/ [% ~7 Q7 k4 d4 y# B( [
  2. int f_printf(const char *format, ...)* Y( D( }' p" B1 ]( _) K0 ^: R
  3. {
    & k% r6 ~) f$ \
  4.         va_list args;
    + a  Y. x; U9 u: {( c
  5. 8 X6 m) r( J: q
  6.         va_start( args, format );8 t6 F+ |1 A& q$ z8 J, ]  p9 i
  7.         return print( 0, format, args );
    9 y; g6 p4 x* g1 ?9 t' `$ ^4 k9 O
  8. }$ I5 a& o! ~3 N" o+ J) s
  9. . C  g/ c( g% h- w. J) {( A; j
  10. int f_sprintf(char *out, const char *format, ...), Z' f! w. r% F; r: S$ E
  11. {
    + t  B, T. p7 A( l4 f& b+ @/ O- M$ v  t
  12.         va_list args;9 n9 g/ K' x% b/ O' M! N0 b

  13. 0 d' d+ x2 ?# l5 P- O
  14.         va_start( args, format );
    : V! M6 K$ \& {0 n
  15.         return print( &out, format, args );" D$ {3 @) L1 e, E
  16. }) `% Q/ s/ Y: M/ q; @% w
  17. * Y8 P, o  h  G

  18.   }2 T% y, h0 G0 n; @( s
  19. int f_snprintf( char *buf, unsigned int count, const char *format, ... )
    6 C% N5 x; I7 h9 A( D
  20. {& R  W. h; \% S" ^  j- Y, ~
  21.         va_list args;2 O* {, g3 w: Y9 e% r5 T
  22. % w& A! Z! l) I+ C9 Y
  23.         ( void ) count;
    7 M. A: t7 r* ^6 k
  24. - L% C6 Z( l9 R2 S: h) }. b, V" n
  25.         va_start( args, format );' N( _) W9 B* Y- x9 j
  26.         return print( &buf, format, args );) f: M$ X, y. B* r0 E$ X& A
  27. }
复制代码

3 R& n# K" S- t+ h) Z4 V 4.修改main.c
$ p1 c$ Q8 a* r! y
& U! V# C/ w2 X5 b9 j/ Z; E
  1. #include <stdio.h>2 U: D. b8 |/ ]/ R  ?
  2. extern int f_printf(const char *format, ...);* `  `: j: G9 v1 v* _' y' d8 O

  3. ' g# R- Q, p  ?3 N+ d0 ^
  4. /*% U6 V4 F1 ^( x$ _
  5. *
    ( l6 y; \, K& _% h* a$ _
  6. */( \; V/ T- z; V4 b! H- Q
  7. int main(): P) w( f7 v  s8 T0 c
  8. {+ R. k  n! k5 g' Y: E
  9.   /**/+ _' V* _  l+ v. A5 I- J" ]; t% ^. D
  10. }8 ]* e1 ^! {' N1 x' q& J
  11. : n( x( L$ l0 X0 v
  12. static void LED1_Task(void* pvPrameters)
    + J3 w2 N+ U$ ?; ?( m
  13. {0 c8 V* v) w7 N! a
  14.         while(1)
    5 o) k1 t% O* V! g) T3 T1 g
  15.         {& H; a3 u0 j9 S: b6 I/ B# b
  16.                 temp_count++;0 `& k- O8 \1 ~- T1 N
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);  Y" b1 w/ Q( y! |% f3 U* \( H2 L
  18. 5 g2 F8 @5 F0 M
  19.         /*串口输出字符*/
    ; ?3 ], @, d0 Y' M
  20.                 f_printf("LED1_TASK running.");     . h. c) C0 e' M4 `/ I
  21. / e: y* C: M! z& [5 _1 V
  22.                 vTaskDelay(1000);' e. P9 L6 F# N' Q/ H
  23.         }
    $ Z" Q+ }& ]6 a! o( ~4 h- b6 b
  24. }
    , }/ W+ O/ |( k7 u. k' G
复制代码

6 k% I- C8 [4 \6 H0 F0 Y4 O% T2 O1 d3 G% |* l: F
收藏 评论0 发布时间:2021-11-10 01:00

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版