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

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

[复制链接]
Y-D 发布时间:2018-7-21 16:19
本帖最后由 Y-D 于 2018-7-24 09:14 编辑
; z. ]+ a: O$ M. z4 u# E. L; U& H8 _( Z$ x5 O
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
. b7 y* N* k3 w( J
高手请绕过。。。。。。。
, D9 |, l2 V! _, Y( s
收藏 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 编辑
. r8 G$ P% t9 P" o- O6 n0 X9 M8 j$ e; y: v, Q
感谢分享,但是代码要这样才对:' F! M$ O$ c3 U$ o$ O4 D* v

0 y; {' U4 b$ x1 ?2 D/* USER CODE BEGIN 0 */
: U4 i5 y1 G$ A$ b. h" |- o#include "stdio.h"
; g" C3 p, U) s2 E: G7 X: h
& U; ~3 C2 V) a  f* u. y, I; G#ifdef __GNUC__
0 i3 R' O9 z  ~! |#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)& G6 \! \( z4 t# T6 ~- V
PUTCHAR_PROTOTYPE
+ l+ b% k& E/ |4 D' T{
; H! S- Z0 A6 j$ [: }7 r  // 注意下面第一个参数是&huart1,因为cubemx配置了串口1自动生成的
0 e8 K: G1 e; e. s2 J& N) D! X  HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
- i; F! P9 d" q6 E' n3 J3 [+ M  return ch;) _0 g+ o7 k0 A  Z
}
8 A( v9 z5 W1 n* d& s' T#endif
/ U( K- ~+ X7 u4 [- `& O7 d' jint _write(int file, char *ptr, int len)
. I+ M, T5 D9 w& @; ~6 g{
0 f; o* W1 |2 H! V' i      int DataIdx;
+ A: _( }$ F1 ]4 z1 n      for (DataIdx = 0; DataIdx < len;DataIdx++)
( n7 ^1 o8 g3 v* C5 K% k, A* `     {) K6 z9 j; K  o6 d0 n
           __io_putchar(*ptr++);
& B. O  q. I1 @& n( `* d     }  L9 a# i" {% m) u6 i/ z
      return len;" _$ }. d0 P& a% Q4 f' k) r; L
}$ u5 G5 o$ Z0 U
/* USER CODE END 0 */
. w4 o6 k1 t' R5 M- G我在楼主的代码上加了空格,还有漏了的#endif
% {% R! G5 E- l( e) E4 ]5 C' G0 W: s/ v' T  C+ o
然后-u_printf_float增加的位置具体是:工程属性->C/C++ build->Settings->Tool Settings->C Linker->Miscellaneous->Other options才对。这样才完整的。; o  p' i/ O0 O+ k
* b2 u  M# v$ l
4 M1 A7 ^) |& w* g* [8 I9 P" z( D
在Atollic TrueSTUDIO for STM32 9.0.1上测试OK。! ~& l+ f' P3 S% @: Z

/ ]% |& ]  ^! h- g! p+ t3 |* l3 {& `2 G
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 手机版