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

1、TrueStdio开发工具使用printf函数输出使用-分享

[复制链接]
Y-D 发布时间:2018-7-21 16:19
本帖最后由 Y-D 于 2018-7-24 09:14 编辑
) r1 L1 L% ^1 w- H$ s2 B  d1 c6 C) J7 g) H0 i9 T+ s
在TrueStudio开发工具中使用printf函数如果第一次接触可能会找不到方向,现将最近刚刚接触STM32cubemx配置生成TrueStudio工程串口打印的使用过程进行如下说明:
(1)   STM32cubemx创建基本工程打开软件在Pinout选项卡下按照如图选择配置串口1
A、选择系统时钟来源外部晶振
1.png
   B、此处我现在JLINK的SWD模式做程序的调试,所以选择如下:
2.png
  C、串口1配置为异步通信模式
3.png
2、配置单片机运行频率按照下图设置为主频72Mhz
4.png
3、在Configuration选项卡下配置串口相关参数
5.png
点开USART1
6.png
就此基本配置完成,现在开始生成TrueStudio工程,打开工程设置设置程序工程保存的路劲、名称、环境支持堆栈大小设置、.c/.h文件独立创建等设置。如下图:
7.png
设置完成,点击如下图标开始生成工程。
8.png
生成工程编译无误
9.png
4、开始编写及设置让你的程序支持printf输出
A、首先我在usart.c中添加如下函数即可让TrueStudio支持printf输出(注意代码必须添加在USER CODEBEGIN x和USER CODE ENDX之间,否则下次设置cube生成会自动丢掉)。
/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef__GNUC__
#definePUTCHAR_PROTOTYPE int __io_putchar(int ch)
PUTCHAR_PROTOTYPE
{
  // 注意下面第一个参数是&huart1,因为cubemx配置了串口1自动生成的
  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
  return ch;
}
int _write(intfile, char *ptr, int len)
{
      int DataIdx;
      for (DataIdx = 0; DataIdx < len;DataIdx++)
     {
           __io_putchar(*ptr++);
     }
      return len;
}
/* USER CODE END 0 */
就此便可直接通过printf输出数据但是没法输出浮点数,我们可以进行如下设置即可完美支持浮点数的输出。在工程属性下找到C/C++Build --Settings--C Linker--Miscellaneous---Other oprtions 选项空中填写:-u_printf_float即可。到此为止TrueStudio即可支持printf的所有数据类型输出。
程序输出:
11.jpg
效果图如下:
10.jpg

8 A- ?4 a, }! L/ p) O" X8 ~
高手请绕过。。。。。。。
' Z+ ^$ @1 u+ A
赞 收藏 3 评论7 发布时间:2018-7-21 16:19

举报

7个回答
zero99 回答时间:2018-7-23 10:19:43
楼主少了个U
奏奏奏 回答时间:2018-7-23 17:26:32
给楼主加油,马上收藏了。怕下次找不着
Y-D 回答时间:2018-7-24 09:14:48
谢谢,提醒,
steven陈 回答时间:2018-8-4 21:36:34
这个好,有了这个就可以随时输出调试信息了。
zjczm 回答时间:2018-8-22 16:32:02
学习了。感谢分享。
xxx健 回答时间:2018-10-1 01:17:16
本帖最后由 xxx健 于 2018-10-1 09:57 编辑
  j8 w2 w, |8 m) C# d* v5 O  ^. L
, k* @! X2 Z2 C. b5 R感谢分享,但是代码要这样才对:4 L7 K8 F4 D1 V

4 Z: ]( g+ e; v5 P; q. ]/* USER CODE BEGIN 0 */+ L) v0 ?% L. d4 o& f, y3 i! m1 u* q& m
#include "stdio.h"1 _( Q( h" w7 z. i7 |

. C! H" x3 }! |4 G  O5 K  y#ifdef __GNUC__
3 e0 @5 Q) E1 `#define PUTCHAR_PROTOTYPE int __io_putchar(int ch). M% @3 m; L! W6 `* u
PUTCHAR_PROTOTYPE
! ~% n( p- p7 B3 N( \2 |{3 U8 t- Y% V* s& G# }
  // 注意下面第一个参数是&huart1,因为cubemx配置了串口1自动生成的8 i" M# C$ v$ o3 h1 v8 [
  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
0 p! v2 \3 u; q' y8 t  return ch;9 a# s& e+ B0 ]2 r! o  ^
}% i/ |9 t6 ^4 H: F
#endif
* |+ v- m7 j2 g$ R3 Kint _write(int file, char *ptr, int len)
! J. y. G+ `7 N1 f4 C$ m5 Q{
  F: E: t" G8 ?: q  l2 a      int DataIdx;
3 ]" K# c- |7 a+ J+ l2 b/ R      for (DataIdx = 0; DataIdx < len;DataIdx++); [: X: z( z+ v$ W! L/ Y. E
     {
0 \  r$ |& ^% V           __io_putchar(*ptr++);
, M' c9 T+ D2 P# I  [" T+ X     }( r$ q" ^5 a+ M8 ?1 A
      return len;8 O" O$ Y8 b2 F6 D8 C
}
( Q7 Z) j+ Y0 I/* USER CODE END 0 */
0 h/ n4 i0 l! `) j0 @我在楼主的代码上加了空格,还有漏了的#endif5 g# Z! r! C$ S, ]! D0 [9 o

' N/ ?# N" u) ?0 n4 @然后-u_printf_float增加的位置具体是:工程属性->C/C++ build->Settings->Tool Settings->C Linker->Miscellaneous->Other options才对。这样才完整的。
# A9 Q0 ]8 e+ w' \
7 o; r0 M0 g4 i9 }; t
. c+ q# t1 K# ], i1 z7 Q' j7 A% k在Atollic TrueSTUDIO for STM32 9.0.1上测试OK。' q( M8 \! h8 ~& n
  y1 ]1 W4 s# w
; {7 m7 Y+ N9 I& k# k
cjyhero 回答时间:2018-12-19 10:41:15
我在trueSTUDIO 9.1上都添加了,printf任然打印不出日志,直接使用 HAL_UART_Transmit可以输出,求指导

所属标签

相似技术帖

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