比较常见的方法是把printf重定向到串口,不过这需要外接一个串口线,比较麻烦。 其实STM32自带的SWO口是能够异步输出数据的,而且不需要外接什么设备, ST-LINK/J-Link等带SWO口的调试器都支持。 下面以STM32F4Discovery开发板+GCC为例说明。 根据这里的方法,也可以把printf定位到其他
#ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar() */ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif /* __GNUC__ */ /*...
测试printf函数的代码不变,在MDK设置中取消勾选USE MICROLIB,然后重新编译,下载代码后试验现象如下: 4.在GCC中使用标准库重定向printf 不同的编译器对于C库的底层实现机制是不同的,所以上面两种在MDK中的实现方法,在使用Gcc编译器的时候是不可行的。 在Gcc中重定向printf函数时注意两个关键点: 与重定义fputs()函...
测试printf函数的代码不变,在MDK设置中取消勾选USE MICROLIB,然后重新编译,下载代码后试验现象如下: 4.在GCC中使用标准库重定向printf 不同的编译器对于C库的底层实现机制是不同的,所以上面两种在MDK中的实现方法,在使用Gcc编译器的时候是不可行的。 在Gcc中重定向printf函数时注意两个关键点: 与重定义fputs()函...
在STM32串口重定向printf函数时,如果遇到“file未知类型”的错误,通常是由于文件或库配置不当引起的。以下是一些可能的解决步骤和注意事项: 确保包含必要的头文件: 确保你的代码中包含了必要的头文件,如<stdio.h>,这是使用printf函数所必需的。 检查编译器选项: 如果你使用的是Keil MDK,确保在工程选项的“...
如果没有这句,你的printf又没\n,log就会打不出来。 接下来是重定向的代码 这里有两个地方需要注意,第一,用gcc编译需要加_write()函数,然后在函数内部调用__io_putchar()函数将字符串一个一个发送出去。第二,使用LL库发送数据,要查看发送寄存器是否为空或者发送是否完成标志,否则发的太快会导致前面的数据还没...
printf函数属于系统调用,在不同编译环境下的实现方法略有不同,但其本质上会调用一个向stdout输出字符的系统调用函数。常用的STM32开发环境有两大类,keil MDK和GCC。在keil MDK环境下,这个系统函数是fputc,在GCC环境下这个系统函数是write。因此重写fputc或者write就可以实现STM32上的printf函数。在MDK环境下重定义...
3、printf重定向到串口打印 4、日志打印封装 六、Proteus项目配置 七、仿真测试结果 八、最后 一、前言 上一节模拟实现了串口收发打印,一般我们裸机打印日志通过串口或者JLINK工具等带的RTT打印,对于仿真,我们选择使用串口打印再合适不过了,这里总结一下重定向printf到串口打印日志的过程;期间,尝试了CLion+arm gcc的方...
STM32F1 串口输出Printf 输出重定向 注意下列代码huart1串号对齐。 增加以下代码:(增加输出重定向会消耗大概7K左右内存。) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include "stdio.h" #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries-...
stm32串口实现printf重定向及错误解决办法 增加Retarget.c,实现printf重定向 你可以把Retarget.c添加到你的工程里,就可以了。 D:\ProgramFiles\Keil\ARM\Startup\ 然后只重载 externintsendchar(intch);/*inSerial.c*/ externintgetkey(void);/*inSerial.c*/ intsendchar(intch) { /*Placeyour...