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

printf在TrueSTUDIO中无法使用  

[复制链接]
dontknowwhoiam 提问时间:2018-3-16 16:53 /
printf在TrueSTUDIO不起作用,不知道如何设置。在Keil中可以通过使能MicroLIB来重映射fputc函数来使用printf。
收藏 2 评论19 发布时间:2018-3-16 16:53

举报

19个回答
hi201803 回答时间:2018-9-2 22:40:14
本帖最后由 hi201803 于 2018-9-2 22:51 编辑
dontknowwhoiam 发表于 2018-3-16 18:19
谢谢。你说的很对,得使用__io_putchar进行重映射。在TrueSTUDI上试了试,还是不知道怎么设置。最后找到 ...
根据网友回复参考库例程, 于是参考 swstm32  调试的官方说明.
只要 修改3点:
1. 添加:
#include <stdio.h>   /* 不要写成 #include ”stdio.h“ 教训*/
2.  加入:
int __io_putchar(int ch)
{
  ITM_SendChar(ch);
  return ch;
}
3.  加入:
int _write(int file, char *ptr, int len)
{
int DataIdx;
  for (DataIdx = 0; DataIdx < len; DataIdx++)
   {
  __io_putchar(*ptr++);
   }
  return len;
}
------------------------------------------------------------------------------
附件是截图.

swstm32.png
jjbboox 回答时间:2018-3-16 17:06:29
TrueSTUDIO没用过,但是和SW4STM32都用的是GUN的编译器,所以和SW4STM32的方式是一样的,就是重定向 int __io_putchar(int ch)函数,而不是KEIL的fputc函数。
  1. int __io_putchar(int ch) {
  2.         HAL_UART_Transmit(&huart2, (uint8_t*)&ch, 1, 0xffff);
  3.         return ch;
  4. }
复制代码


这样就可以用了。
另外在工程属性设置的[C/C++ Build]->[Settings]->[Tool Settings]->[MCU G++ Linker]->[Miscellaneous]->[Linker flags]中添加[-u _printf_float]参数就可以了。


评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

hi201803 回答时间:2018-9-2 22:49:32
anobodykey 发表于 2018-3-22 22:23
看下库例程吧,基本上每个库都会有printf示例的

谢谢, 最权威的.

另外,  swstm32的  ,
  在菜单  Help / help Contents/SystemWorkbench for STM32 User Guide > Advanced/  SWOTraces 下面.

还有,根据swstm32文档,  还可以设置  Semihosting, 支持调试.  可以不需要 swo 线.
dontknowwhoiam 回答时间:2018-3-16 18:19:16
jjbboox 发表于 2018-3-16 17:06
TrueSTUDIO没用过,但是和SW4STM32都用的是GUN的编译器,所以和SW4STM32的方式是一样的,就是重定向 int __ ...

谢谢。你说的很对,得使用__io_putchar进行重映射。在TrueSTUDI上试了试,还是不知道怎么设置。最后找到了解决办法,需要调用一个叫syscalls.c的源文件,配合__io_putchar来实现。
jjbboox 回答时间:2018-3-16 18:48:35
本帖最后由 jjbboox 于 2018-3-16 18:50 编辑
dontknowwhoiam 发表于 2018-3-16 18:19
谢谢。你说的很对,得使用__io_putchar进行重映射。在TrueSTUDI上试了试,还是不知道怎么设置。最后找到 ...

是的,我居然把syscalls.c的事情给忘记了,不好意思哈!另外可能printf如果不输出浮点数的话,那个Linker的参数可以不加。毕竟加上以后会占掉差不多10K的空间。
xmstudio 回答时间:2018-3-22 08:20:14
我不清楚这里的printf是不是通过串口打印信息,我用了一种笨办法,利用sprintf把需要打印的东西做成字符串,用指针*c指向这个字符串,然后用if(*c)判断字符串没有结束,如果没有结束就向串口发送这个字符,最后指针*c++来指向下一个字符,这些东西可以写成一个循环用来串口打印

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

埃斯提爱慕 回答时间:2018-3-22 09:09:07
提示: 作者被禁止或删除 内容自动屏蔽
feixiang20 回答时间:2018-3-22 09:13:11
是不是头文件的问题

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

x5y4z3 回答时间:2018-3-22 09:26:12
先从 PUT 的 Function 一步步开始测起。

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

maxtch 回答时间:2018-3-22 13:30:09
你可以参考一下 newlib 的文档和 syscalls.c,里面对于实现哪些功能需要哪些函数有比较详细的介绍的。

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

anobodykey 回答时间:2018-3-22 22:23:22
看下库例程吧,基本上每个库都会有printf示例的

评分

参与人数 1蝴蝶豆 +1 收起 理由
zero99 + 1

查看全部评分

李俊锋 回答时间:2018-3-23 16:06:10
请教如何生成hex文件?谢谢
电子星辰 回答时间:2018-6-6 14:39:16
mark一下,说不定会用trueSTUDIO
ijcool 回答时间:2018-6-14 01:14:58
dontknowwhoiam 发表于 2018-3-16 18:19
谢谢。你说的很对,得使用__io_putchar进行重映射。在TrueSTUDI上试了试,还是不知道怎么设置。最后找到 ...

按照你说的进行了__io_putchar 的实现,以及包含syscalls.c的文件,进行编译,当调用printf,死掉了。。。可否贡献一个helloworld供参考,多谢
ijcool 回答时间:2018-6-14 01:20:18
15268851967@163 发表于 2018-3-23 16:06
请教如何生成hex文件?谢谢

在项目设置里面,如图
QQ截图20180614011928.png
g921002 回答时间:2018-6-15 21:55:48
沒有移植性問題
  1. #include "string.h"
  2. uint8_t u1txbuf[1024];
  3. #define u1Msg(...)  sprintf((char*)u1txbuf, __VA_ARGS__);HAL_UART_Transmit(&huart1, u1txbuf, strlen((char*)u1txbuf),100)
复制代码

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

12下一页

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版