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

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

[复制链接]
Y-D 发布时间:2018-7-21 16:19
本帖最后由 Y-D 于 2018-7-24 09:14 编辑
' |& ^' M# }% x4 F& r: r. k4 \) n3 K
$ n2 f: y) S( X: f* _
TrueStudio开发工具中使用printf函数如果第一次接触可能会找不到方向,现将最近刚刚接触STM32cubemx配置生成TrueStudio工程串口打印的使用过程进行如下说明:
(1)   STM32cubemx创建基本工程打开软件在Pinout选项卡下按照如图选择配置串口1
A、选择系统时钟来源外部晶振
1.png
   B、此处我现在JLINKSWD模式做程序的调试,所以选择如下:
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 xUSER 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
5 V1 F% {$ F: y/ }% y* E; V
高手请绕过。。。。。。。

' _/ [6 J1 Z: A1 {# [, s8 K
收藏 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 编辑
# K% P& k: I% F4 r* G1 J4 @$ Y3 o& d5 L* G# B
感谢分享,但是代码要这样才对:5 q5 Y$ O% `# E6 L8 x

' F. @+ e( ^! b6 p/ ?. t0 ?: c/* USER CODE BEGIN 0 */- U1 @' M" Y# h
#include "stdio.h"* H6 f& X8 l2 y' L- u, |/ V3 y

0 ~! x3 `& D% w8 [9 }/ p5 W. y) R#ifdef __GNUC__
  v) I) H' w/ _6 `#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
# X, p- i; G2 _# v7 P, IPUTCHAR_PROTOTYPE1 t! }* F* U6 M# {6 ^7 V
{/ M/ Y6 h: {3 p
  // 注意下面第一个参数是&huart1,因为cubemx配置了串口1自动生成的
7 E; Q0 P! }$ Q  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
, T6 j! m- f. R% p- W" E- r9 O  return ch;- b: ^5 s7 q2 x5 @9 K
}
7 J* ?; @/ n0 D) r#endif
  S$ Q* O" {# [* I# _int _write(int file, char *ptr, int len)+ Y) u) ]2 O4 I4 P
{9 D( S. C# |1 h: Y4 k
      int DataIdx;; H/ z" P; V, z0 B! t( f7 s
      for (DataIdx = 0; DataIdx < len;DataIdx++)) Z3 {$ a1 h2 i( @: y# l( r) m
     {9 l6 Q7 B% g3 n0 o
           __io_putchar(*ptr++);
; l/ w7 k( w( ?2 \     }+ B5 J5 n3 M. t( F; E2 {% N
      return len;
5 ~/ D7 S2 N# j9 Q6 X* b+ X  n; V1 R}( r4 D; u- L8 x' \' S- V, x+ O
/* USER CODE END 0 */1 d# ^3 W' K' X& @
我在楼主的代码上加了空格,还有漏了的#endif
: h' w0 R" [$ p% n/ M7 t8 @  {" F8 G5 z4 ^1 ?. O1 q
然后-u_printf_float增加的位置具体是:工程属性->C/C++ build->Settings->Tool Settings->C Linker->Miscellaneous->Other options才对。这样才完整的。2 {& K: Z' a, M, p& b

. v; T$ I* P6 p# @9 i1 {& J9 X( K8 ?! ~: j% O; t0 v9 b/ i
在Atollic TrueSTUDIO for STM32 9.0.1上测试OK。5 Q! X0 m- a+ X% {. `

8 f) A' i3 B9 r; L4 {( A/ B( ^: b! b/ m% |
cjyhero 回答时间:2018-12-19 10:41:15
我在trueSTUDIO 9.1上都添加了,printf任然打印不出日志,直接使用 HAL_UART_Transmit可以输出,求指导
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版