STM32串口printf函数重定向

在进行MCU处理器的程序调试时,免不了需要使用串口打印调试信息到PC端进行程序代码运行状态的追踪监视,使用串口自身的发送函数进行输出打印,难免不是很灵活,一般情况下对printf函数进行重定向,打印调试信息。

printf函数是由C语言标准库实现的,使用时需要包含头文件include <stdio.h>,在C语言标准库中定义了三类终端,stdin,stdout,stderr,其中printf默认输出数据到stdout终端中,我门可以通过修改printf底层函数fputc(),来使printf函数输出数据到我们指定的设备,例如串口、LCD显示屏、SD卡等。

printf函数重定向的实现分为使用microLib(微库)和不使用微库,我门先看不使用微库的情况,只需要在程序文件中加入:

int fputc(int ch, FILE *f)
{
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
    USART_SendData(USART1,(uint8_t)ch);
    return ch;
}


fputc是printf的底层函数,我们通过修改这个函数,即可实现printf函数输出数据到其他设备。

同时需要MDK,支持使用微库。

第二种方式是使用C语言标准库,推荐使用这种方式,因为微库是面向内存资源有限的设备,对C表标准库进行裁剪优化后的库,它的功能和运行速度是不如标准库的(有些支持FPU浮点数运算单元的MCU可能需要使用微库,要不可能会出错)。

使用标准库重定向printf函数,首先需要禁止半主机模式,这个半主机模式是用于MCU使用仿真器进行程序调试的,不禁用的话,是没法进行printf函数重定向的。

在C程序文件中加入以下代码:

struct __FILE
{
    int handle; 
};
 
FILE __stdout;
 
_sys_exit(int x)
{
    x = x;
}
修改printf函数底层函数fputc
 
int fputc(int ch, FILE *f)
{
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
    USART_SendData(USART1,(uint8_t)ch);
    return ch;
}
记得要勾掉MDK中使用MicroLib的选项。