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

基于STM32的重定向printf和getchar的经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-18 16:33
在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。/ W! O* M5 w1 u% H4 X4 K
' O. p7 w; G6 z, S  C
以printf()为例:# g8 c8 R3 _% K! b
printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。
1 x* D1 N% x/ O; h+ @) S那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。: s/ l( s' E! \; R( Z, J# p" X' q4 g
修改fputc函数如示:
& i  M0 B% Y1 {% a
  1. /* 重定向printf函数 */
    ; B$ d+ b: A& i+ h, a  F) @/ `. F# K
  2. int fputc(int ch, FILE *f)
    # V6 k" A9 h: _4 |
  3. {
    " t3 o& b  d; r" T: H
  4.         USART_SendData( DEBUG_USARTx,  (uint8_t) ch);
    4 P6 t+ J( R& j& q* b
  5.         /* 等待发送完毕 */
      _3 Z4 }0 F& g! W# w" ]
  6.         while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
    0 @, d: e) |( `" I) o' A) V
  7.         return ch;
    / e. X, }9 k1 }  a+ l
  8. }
    : S( v# m2 I$ s% j: P

  9. ! h$ p0 ?2 A4 A; r4 G
复制代码
+ p) z, {2 j! }
修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include <stdio,h>/ y3 z4 H3 e; r8 I- y
  n) b1 j! E0 g1 J. \
20190730170540530.png
1 {! T% c  {. c8 i  i7 J% q0 E5 S6 t, q7 V; J2 k

) \" X0 c; H! v  Ugetchar()函数也是如此:
" H# F4 S# Z& [8 X1 b; j4 t
  1. /* 重定向scanf函数 */! x/ V  V0 ~5 _# X9 `8 Q
  2. : S" A, v- J( N9 B
  3. int getc(FILE *f)7 Y* H$ D# T; R1 y& u0 e4 o4 \6 E
  4. {
    9 a' L! }# J$ z6 G$ q
  5.         /* 等待串口输入数据 */7 i( ^% R$ Z1 X/ ?: u# L
  6.         /* 有了这个等待就不需要在中断中进行了 */
    9 U" j9 k# `) Q! k
  7.         while(USART_GetFlagStatus(DEBUG_USARTx , USART_FLAG_RXNE)==RESET);
    * c7 i# i0 \+ s* q4 Q% P* X( u3 ~1 g
  8.         /* 返回值进行强制类型转换 */
    3 T4 R! Q9 u+ S4 p
  9.         return (int)USART_ReceiveData(DEBUG_USARTx);( t. L  N6 w. q# O* g. k6 b* }
  10. }
    5 i9 `  H4 O( O2 P% G
复制代码
7 ^$ M3 R9 w* O% L
————————————————
, e/ s( `' ^" {$ @) ]( O版权声明:Aspirant-GQ
1 b$ B/ _" }  y8 V6 J8 j8 M; X7 T3 g如有侵权请联系删除
6 ~. b1 g5 d: U+ ~9 O, q" c' Z# Y6 k. y; n; l7 a! u; ]

3 {' p/ z0 |9 F7 y7 a5 r% E
收藏 评论0 发布时间:2023-3-18 16:33

举报

0个回答

所属标签

相似分享

官网相关资源

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