起因
最近在调试stm32片子,在调试的时候发现,原来的项目代码中没有实现printf函数,一直使用较为原始的打印方式:将需要打印的内容存在数组中(下称资源池),通知DMA进行搬运,最终通过usart输出到屏幕中。
分析
由于源代码中已经实现了stm32 中dma、usart的配置,且输功能正常,只需要简单的将输入到资源池中的数据流进行整形即可。考虑使用库函数
int vsnprintf(char* str, size_t size, const char* format, va_list ap);
来实现。
实现
根据文章分析需要打开MDK project中的MicroLIB
/*va_start、va_end、vsnprintf等需要的头文件*/
#include <stdarg.h>
#define WPRINTF_BUFSIZE 1024
uint8 WPRINTF_buf[WPRINTF_BUFSIZE];
void wprintf(const char* fmt, ...)
{
va_list args;
int32 n;
va_start(args, fmt);
n = vsnprintf(WPRINTF_buf, WPRINTF_BUFSIZE, fmt, args);
va_end(args);
/*这里调用原来的usart打印接口*/
DEBUG_UART_Write(WPRINTF_buf,(n&0xFFFF));
}
测试
随便在原来的stm32的task中加入一些打印,进行测试
wprintf("hello:%d.\n\r",cmd[7]);
char *p = "okkk";
float my_fl = 12.35;
wprintf("output:%s.\n\r", p);
wprintf("float:%f.\n\r",my_fl);
终端显示:
现在可以凑合使用了。
参考文章:
https://blog.csdn.net/qq_26904271/article/details/80113740
https://blog.csdn.net/clorymmk/article/details/82917978
https://www.cnblogs.com/birdBull/p/10939597.html