printf函数属于系统调用,在不同编译环境下的实现方法略有不同,但其本质上会调用一个向stdout输出字符的系统调用函数。常用的STM32开发环境有两大类,keil MDK和GCC。在keil MDK环境下,这个系统函数是fputc,在GCC环境下这个系统函数是write。因此重写fputc或者write就可以实现STM32上的printf函数。在MDK环境下重定义...
假如要使用gcc库里面的printf函数,这里使用底层编译函数是_read()和_write(). 这里的read和write函数需要在system.c自己实现的,具体的实现方法如下所示: #include <errno.h>#include<sys/unistd.h>//STDOUT_FILENO, STDERR_FILENOint_write(intfile,char*data,intlen) {if((file != STDOUT_FILENO) &&...
#ifdef __GNUC__/*With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf set to 'Yes') calls __io_putchar()*/#definePUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#definePUTCHAR_PROTOTYPEint fputc(int ch, FILE *f)#endif/* __GNUC__ */PUTCHAR_PROTOTYPE {/...
stm32_f103使⽤gcc编译的环境下printf打印函数的实现 前记 gcc编译使⽤的printf打印函数需要的底层函数是和其他编译器不同的,以前的是⽆法使⽤的,这⾥有两种⽅法,⼀种是使⽤gcc库⾥⾯的printf函数,⾃⼰实现底层IO函数_write。另外⼀种⽅法是⾃⼰定义 printf函数,这⾥给出...
如果没有这句,你的printf又没\n,log就会打不出来。 接下来是重定向的代码 这里有两个地方需要注意,第一,用gcc编译需要加_write()函数,然后在函数内部调用__io_putchar()函数将字符串一个一个发送出去。第二,使用LL库发送数据,要查看发送寄存器是否为空或者发送是否完成标志,否则发的太快会导致前面的数据还没...
——前提针对的是arm-none-eabi-gcc编译器,如果是Keil的armcc则不适用 啥程序都是从"hello world"开始的,但是单片机上的printf貌似没有那么简单,但网上搜一下也很容易实现出来,大概就是: 初始化串口(一般都是usart1) 重定向一个函数__io_putchar 通过cubeide配置一下基础时钟,打开串口1,开启电脑上的串口软件...
STM32通过串口输出中文的过程涉及底层的硬件寄存器操作。首先,我们需要定义一个函数原型,用于处理输出字符。在GCC编译器环境下,宏定义如下:ifdef __GNUC__define PUTCHAR_PROTOTYPE int __io_putchar(int ch)else define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)endif /* __GNUC__ */ ...
比较常见的方法是把printf重定向到串口,不过这需要外接一个串口线,比较麻烦。 其实STM32自带的SWO口是能够异步输出数据的,而且不需要外接什么设备, ST-LINK/J-Link等带SWO口的调试器都支持。 下面以STM32F4Discovery开发板+GCC为例说明。 根据这里的方法,也可以把printf定位到其他外设。
测试printf 测试printf函数的代码不变,在MDK设置中取消勾选USE MICROLIB,然后重新编译,下载代码后试验现象如下: 4.在GCC中使用标准库重定向printf 不同的编译器对于C库的底层实现机制是不同的,所以上面两种在MDK中的实现方法,在使用Gcc编译器的时候是不可行的。
在main函数之前加上如下代码对串口进行重定向,当然,串口一定要初始化之后再用printf,否则程序虽然不会飞,但是printf也不会有结果 下面代码公共使用的宏判断, 注意引用头文件#include "stdio.h" #ifdef__GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf ...