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

STM32G0学习手册——FreeRTOS中使用printf-stdarg.c进行串口打印

[复制链接]
STMCU小助手 发布时间:2022-10-28 15:31
1.创建好FreeRTOS代码,在User文件夹中添加printf-stdarg.c。并添加到工程中
! S- R9 Q0 H: p2 c/ K# w7 R" j$ c& Y4 j
2.重定向printf到串口,在usart.c中添加代码
% q& z8 s, r  {
- P6 V* x1 p( a$ d8 }# U; r) @# T
  1. /* USER CODE BEGIN 0 */3 S  c, v6 ~* ^$ P

  2.   q' Y5 H7 _, x% q. ]) E2 r
  3. #include <stdio.h>
    ) s2 O* |6 r5 P4 z; ^
  4. #ifdef __GNUC__, O& [$ p' d, E9 U
  5.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf, e4 ?0 G) c& i) |) C+ y8 |2 g! ^
  6.      set to 'Yes') calls __io_putchar() */
    , S5 Y! r" Y. z- |
  7.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    7 S+ K: T8 E/ d+ B
  8. #else, [6 r0 @  e! K0 Q: Y
  9.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    6 n- U9 \: ]; P6 ^) ^
  10. #endif /* __GNUC__ */& |, ^* _& H  }
  11. ///**
    3 [) b- S! B9 {+ S. ~- C; X; w
  12. //  * @brief  Retargets the C library printf function to the USART.1 O3 @+ N! I6 m/ A8 s6 L0 @$ ?
  13. //  * @param  None
      D+ G4 p! l( P% Y" ?
  14. //  * @retval None
    - J+ v* [! b3 `9 j- }. |
  15. //  */
    4 @% X8 l/ b- o' g' {: f
  16. PUTCHAR_PROTOTYPE
    & t7 U, `0 {! z$ H" }8 h, v
  17. {
    . E% k8 `: P: P, ?
  18.   /* Place your implementation of fputc here */
    : I' M4 s+ p$ A  W1 S6 v
  19.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */7 O' C- D6 {1 d& K- r& m
  20.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
    . e: _+ w0 s6 z8 g

  21. " A4 {0 v# d; L5 e! M
  22.   return ch;
    * S6 N  ?; d/ N
  23. }* C5 L  S  w- O% B/ p; V$ ]/ B, @
  24. 9 Y4 n; v$ l) B  i: i& w
  25. /* USER CODE END 0 */
复制代码
& B! ^" G. r! C4 x6 B& [% h5 J
3.修改printf-stdarg.c& b+ S# E. Z; W+ a! O3 _; x

1 p- i7 [! K# h% Y# B  F: c
  1. /*
    ! u* m/ g6 g% W' G" P1 L- l- W
  2. #define putchar(c) c! I2 i) k6 B) o7 t" x5 ?
  3. */) B. A& y3 I4 j& b$ ~/ m
  4. / ?$ O" y; y. j; p2 `2 L; D
  5. static void printchar(char **str, int c). H% F9 u5 V% V3 S6 T, P
  6. {! l$ M0 O$ |# t4 Z0 c! A
  7.         extern int putchar(int c);       //去掉原本的注释
    + E, ^- J7 [2 I% e5 G
  8.         
    8 j3 q/ \! a8 J3 Y
  9.         if (str) {' I8 T) k" r" u, k4 W6 Q
  10.                 **str = (char)c;
    - e1 p& @* g" C1 S$ {
  11.                 ++(*str);
    9 i' Z3 @$ j7 Z8 |, m
  12.         }
    ) i6 i  d; [5 T2 j: A
  13.         else. {4 i& t, _3 b! W% Z) V
  14.         { $ S5 t' H4 [: n9 v+ ?
  15.                 (void)putchar(c);
    : Q) v; D$ I. C# {7 z
  16.         }1 ~, Y. l6 \0 p3 Q4 E; |3 z
  17. }
    0 Q1 h5 p8 _2 ~4 u, }' U

  18. 1 J2 Q, u* {+ w6 }6 ~( O5 D
  19. /*修改printf为f_printf。sprintf,snprintf也是一样修改*/
    * A. e  P* }* `$ @0 _! G! X
  20. int f_printf(const char *format, ...)
    , _: K$ S& u# [
  21. {) c- Y9 R5 g6 T6 o: l
  22.         va_list args;
    ; g& T+ F4 D* @

  23. $ I1 ?3 L7 u+ n- g7 k- X) s
  24.         va_start( args, format );
    / H& {' P! C4 b$ J4 ?
  25.         return print( 0, format, args );
    4 B9 s1 ^+ M6 G& a( Z1 U
  26. }
      C3 _, }2 \+ k2 s" `8 d0 p
  27. + w8 a; T" F* w+ w; M" |. m. o
  28. int f_sprintf(char *out, const char *format, ...)
    5 k5 x" V& u- `" k7 }
  29. {: x: G. Y: d" [1 U
  30.         va_list args;
    9 a" K) p; h% \

  31. ( j" r& `+ j2 C$ [4 N0 n
  32.         va_start( args, format );
    8 p; t# R# p0 f1 s' E7 R% A
  33.         return print( &out, format, args );/ o0 L* r* Z: }& a3 n; n
  34. }
    . ~; O% j# }- W. I

  35. 8 f2 @6 z& p9 {8 {4 G( P2 @. t

  36. 7 e# |7 [& k' ~7 k  ^  a2 k
  37. int f_snprintf( char *buf, unsigned int count, const char *format, ... )
    ) i( T+ a2 O0 }* G% H( l
  38. {9 Y" k" h8 ^1 c# W! Q$ h. Q
  39.         va_list args;
    * u' X% Q- A; Y6 F9 e( K

  40. ' d2 x) I/ h$ s% [+ _
  41.         ( void ) count;
    , N) d7 }" e9 \5 U3 c2 {

  42. 9 _3 D* @/ R* V3 O
  43.         va_start( args, format );4 u  ?) P& R0 q7 x( n
  44.         return print( &buf, format, args );& P2 Z/ p5 {* I. p
  45. }
    2 s6 f- h+ X# ~( L2 A, `
复制代码
. F, X8 W3 U; R; \5 @/ r  U5 W
4.修改main.c( v6 i1 X6 n% P% \, C+ ~3 L& g/ h# n

8 ^/ z& t" z5 v$ w8 {
  1. #include <stdio.h># P5 U5 n; ^; Z0 O/ l. \
  2. extern int f_printf(const char *format, ...);
    * Q, b5 D$ s" p" m# z  B/ y* c6 z  F: Y/ j
  3. 3 z2 h" Q. e2 j! ~
  4. /*
    : y4 |) H: |! W" O: p0 S1 h1 y
  5. *+ q. r; n1 `' J& k+ o! K0 b6 p
  6. */
      r  L) q" y' n! o6 P/ y' a8 `
  7. int main()
    - y) W! s1 V% {+ [
  8. {) b& D+ d! b9 z: f" G
  9.   /**// @8 l4 E8 w2 t+ _" H
  10. }3 F/ k9 h4 q  G8 C5 w
  11. $ C7 [: H4 P& B1 J3 l3 M% @
  12. static void LED1_Task(void* pvPrameters)! ?% ~  p7 e" w- e" Z  b$ W& Y
  13. {3 r: r9 Y' m5 h
  14.         while(1)
    : r* c( G3 P& T4 w
  15.         {
    5 t, H8 z1 ]% G$ v5 _! w
  16.                 temp_count++;
      U6 J1 T; n$ ~5 t. V% \* }! r; ~9 k
  17.                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    * c. {% x7 b9 P# H

  18.   _# t1 `: V6 V7 t& Z, x
  19.         /*串口输出字符*// V' w" _/ T& V7 {7 }& t" L7 i
  20.                 f_printf("LED1_TASK running.");     
    2 h/ B7 i6 t. {# i/ X4 f

  21. ' f- _2 ^6 V$ j- y* ]0 s  t2 t
  22.                 vTaskDelay(1000);- Y$ X, z; r% Z4 a0 ~" f* j9 B; G
  23.         }
    9 T& M; y) I; G  l
  24. }
复制代码

3 K, V! }7 F# G$ |$ x$ j7 W————————————————7 ^$ P1 X5 N* M$ @/ a2 |3 {/ X) }
版权声明:SCCELE4 N* w1 f; C, Z: B7 e1 u9 w
: _% x6 ?- }5 t  Y& ^! ]% I- `
收藏 评论0 发布时间:2022-10-28 15:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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