一、前言
实现原理:
在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。
二、printf串口打印实现
首先要在一开始 #include <stdio.h>
1.使用LL库
添加下面的fputc重定义代码:
//重映射fputc函数,此函数为多个输出函数的基础函数
int fputc(int ch, FILE *f)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, (uint8_t) ch);
return ch;
}
2.使用HAL库
添加下面的fputc重定义代码:
int fputc(int c, FILE *stream) //重写fputc函数
{
/*
huart1是工具生成代码定义的UART1结构体,
如果以后要使用其他串口打印,只需要把这个结构体改成其他UART结构体。
*/
HAL_UART_Transmit(&huart1, (unsigned char *)&c, 1, 1000);
return 1;
}
不成功的话,Use MicroLIB 打钩试一下
三、进阶使用:利用printf调试
示例:
#include <stdio.h>
/*宏定义调试输出格式*/
#define DEBUG(format,...) printf("[File:%s, Line:%d] "format, __FILE__, __LINE__, ##__VA_ARGS__)
int main(void)
{
printf("file=%s\n", __FILE__);
printf("line=%d\n", __LINE__);
printf("Date=%s\n", __DATE__);
printf("Time=%s\n", __TIME__);
DEBUG("Data:%d\n", 123);
}
输出效果:
补充:
__FILE__ 代码所在文件
__LINE__ 代码所在行号
__FUNCTION__ 代码所在函数名
__DATE__ 代码编译的日期
__TIME__ 代码编译的时间
##__VA_ARGS__ 用于在宏替换部分中,表示可变参数列表
详细介绍可参考:#、##、__VA_ARGS__的使用