[STM32F4] StringOut 可用有效,而 printf无效。

[复制链接]
453|3
 楼主| 地瓜patch 发表于 2025-5-30 21:45 | 显示全部楼层 |阅读模式
本帖最后由 地瓜patch 于 2025-5-30 21:52 编辑

在 STM32CubeIDE 上使用 stm32f407。在我的代码中,想用printf打印数据
#include <stdio.h>int fputc(int ch, FILE *f)
{
HAL_UART_Transmit ( & huart3 , (uint8_t *)&ch , 1 , 0xFFFF ) ;   
return ch ;
}
为了验证 UART 有效 - 用 2 种方法打印 Hello World。如下:
StringOut ( "Hello World with StringOut\n\r" ) ;
printf ( "Hello World with printf" ) ;
运行代码时,只会打印“Hello World with StringOut”。printf 函数未打印。没找到哪里的问题
以下完整的代码:
#include "main.h"
#include <stdio.h>
#define PUTCHAR_PROTOTYPE
i[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]nt fputc(int ch, FILE *f)
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]void StringOut ( char * s )
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]{   
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]HAL_UART_Transmit ( & huart3 , ( void * ) s , strlen ( s ) , 1000 ) ;
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]}
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]int main(void)
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]{
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]   HAL_Init();
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]    SystemClock_Config();
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]    MX_USART3_UART_Init();
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]     while (1)
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]   {
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]        StringOut ( "Hello World with StringOut\n\r" ) ; // Prints successfully
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]         printf ( "Hello World with printf" ) ; [color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]// Nothing happens. The code just proceeds ahead.
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]    }
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]}
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]PUTCHAR_PROTOTYPE
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]{
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]   HAL_UART_Transmit ( & huart3 , (uint8_t *)&ch , 1 , 0xFFFF ) ;
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]   return ch ;
[color=var(--darkreader-text-444444, #a19c95)][backcolor=var(--darkreader-background-ffffff, #141617)]}
远山寻你 发表于 2025-6-9 19:00 | 显示全部楼层
printf函数默认输出到标准输出(如控制台),但在嵌入式系统中,通常需要将printf重定向到串口(如UART)或其他输出设备
夜阑风雨 发表于 2025-6-9 19:02 | 显示全部楼层
修改链接脚本,重新分配堆栈、堆和其他内存区域的大小和位置。确保堆栈和堆的增长方向不会相互冲突
江河千里 发表于 2025-6-9 19:30 | 显示全部楼层
RAM总大小限制,STM32L072的RAM大小是固定的,堆栈大小不能超过剩余可用的RAM空间。即使看起来有“空闲”内存,也可能已经被其他内存区域(如全局变量、静态变量、堆等)占用
光辉梦境 发表于 2025-6-9 20:52 | 显示全部楼层
在尝试增加堆栈大小时,可能与其他内存区域(如堆、全局变量等)产生了冲突,导致链接器报错
光辉梦境 发表于 2025-6-9 20:52 | 显示全部楼层
在尝试增加堆栈大小时,可能与其他内存区域(如堆、全局变量等)产生了冲突,导致链接器报错
三生万物 发表于 2025-6-9 21:00 | 显示全部楼层
如果串口未正确初始化,即使重定向了printf,也无法输出数据
暖了夏天蓝了海 发表于 2025-6-9 21:30 | 显示全部楼层
堆栈与堆的增长方向,在STM32中,堆栈通常从RAM的高地址向下增长,而堆从低地址向上增长。如果两者增长方向设置不当或空间分配不合理,可能导致“撞车”(即堆栈和堆的空间重叠),从而引发系统崩溃或链接错误
淡漠安然 发表于 2025-6-9 22:00 | 显示全部楼层
检查代码中的全局变量和静态变量,尽量减少不必要的内存占用
冰春彩落下 发表于 2025-6-9 23:00 | 显示全部楼层
使用更高效的数据结构和算法,减少内存消耗
暖了夏天蓝了海 发表于 2025-6-9 23:30 | 显示全部楼层
串口的波特率、数据位、停止位等参数配置错误,可能导致通信失败
江河千里 发表于 2025-6-9 23:30 | 显示全部楼层
StringOut可能是自定义的字符串输出函数,直接操作串口或硬件寄存器,不依赖printf的复杂格式化逻辑
光辉梦境 发表于 2025-6-10 00:00 | 显示全部楼层
如果未正确实现printf的重定向,调用printf时将无法输出任何内容
一秒落纱 发表于 2025-6-10 06:00 | 显示全部楼层
如果printf中使用了浮点数格式(如%f),但未启用浮点数支持,可能导致输出失败或崩溃。在嵌入式系统中,浮点数支持通常需要额外配置
别乱了阵脚 发表于 2025-6-10 09:09 | 显示全部楼层
如果内部RAM确实不足,可以考虑使用外部RAM扩展内存空间。但这需要额外的硬件设计和软件配置
远山寻你 发表于 2025-6-10 11:00 | 显示全部楼层
微控制器的硬件设计决定了其内存资源的总量和分配方式,无法通过软件手段突破硬件限制。
夜阑风雨 发表于 2025-6-10 15:00 | 显示全部楼层
优化堆栈大小,在启动文件中,适当增加堆栈大小
别乱了阵脚 发表于 2025-6-10 16:00 | 显示全部楼层
如果printf性能不足,可以考虑使用更简单的字符串输出函数(如StringOut),减少堆栈使用
三生万物 发表于 2025-6-10 18:00 | 显示全部楼层
链接脚本配置错误,链接脚本中的内存配置可能不正确,导致无法正确分配堆栈空间
一秒落纱 发表于 2025-6-10 18:14 | 显示全部楼层
内存布局由链接脚本(Linker Script)决定,堆栈、堆、全局变量等内存区域在RAM中的分配是相互关联的。增加堆栈大小可能会与其他内存区域产生冲突
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:出一块TI-PLABS-AMP-EVM

1836

主题

14946

帖子

29

粉丝
快速回复 在线客服 返回列表 返回顶部