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

STM32CubeIde生成的工程,使用printf函数没有调用_write函数

[复制链接]
技术宅男250 提问时间:2024-4-9 19:25 / 未解决

最近使用STM32CubeIde生成工程,就先做一个简单的串口工程,使用NUCLEO-WBA52CG板子进行调试。

在初始化完毕后,使用printf打印log,重写了int io_putchar(int ch) 函数,发现没有串口没有输出,使用SWD进行debug,并对syscalls.c中的_write函数以及重写的io_putchar函数打了断点,结果printf执行后,这两个断点没有被执行。而且printf函数的返回值与字符串的长度相等。

以前用STM32CubeIde生成的工程也使用了同样的单板调试,也使用串口输出,没有任何问题。这次不知道为啥会这样。printf函数又没有给源码,没办法看为啥这样。而且这个问题与串口完全没有关系,就是一个C库调用的问题,即使串口不初始化,但是执行printf也应该要调用_write和__io_putchar函数才对

收藏 评论3 发布时间:2024-4-9 19:25

举报

3个回答
xmshao 回答时间:2024-4-10 10:05:14
既然使用硬件UART来做输出的话,其实没必要折腾那些C库函数。直接使用UART发送函


数对字符串发送就行,必要时用sprintf函数配合下。因为你终究还是调用了UART发送函数。


比如:


HAL_UART_Transmit(&uartx, (uint8_t *)"This is a test!\r\n" ,sizeof("This is a test!\r\n"), TX_Timeout);


对于有些不是字符串的,用sprintf转一下。比方你要把下面的Vrefint数据打印出来。


Vrefint = (adcResult2]/4095.) * 3.3 ;


sprintf(Vrefprint,"Internal Reference Volt: %5.3f  \r\n",Vrefint);  


HAL_UART_Transmit(&uartx, (uint8_t *)Vrefprint,sizeof(Vrefprint), TX_Timeout);


这里的Vrefprint是个用户定义的适当大小的字符数组。
技术宅男250 回答时间:2024-4-10 10:17:45

使用puts输出log可以正常打印,通过SWD调试看到也调用了_write函数和io_putchar函数,printf就不行

技术宅男250 回答时间:2024-4-10 10:18:41

xmshao 发表于 2024-4-10 10:05
既然使用硬件UART来做输出的话,其实没必要折腾那些C库函数。直接使用UART发送函</p>
<p>

纯粹自己为了玩,不是公司项目,不需要进度。还是要搞清楚哪里出的问题

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