一、printf() 如何通过 usart 输出数据到电脑串口助手
- 方法1:使用 use MicroLIB(微库),在魔术棒 / Targer 选项页中勾选use MicroLIB(勾了就成,方法二中代码不用添加到工程文件)
- 方法2:不使用use MicroLIB(微库),就要在工程中加入以下代码, 以支持printf函数 。
-
/****************************************************************************** * 【功 能】 printf函数重定向支持代码 * 加入以下代码, 使用printf函数时, 不再需要选择use MicroLIB * 参 数: * 返回值: * 备 注: 魔女开发板团队 资料存放Q群:262901124 最后修改_2020年07月15日 ******************************************************************************/ #pragma import(__use_no_semihosting) struct __FILE { int handle; }; // 标准库需要的支持函数 FILE __stdout; // FILE 在stdio.h文件 void _sys_exit(int x) { x = x; } // 定义_sys_exit()以避免使用半主机模式 int fputc(int ch, FILE *f) // 重定向fputc函数,使printf的输出,由fputc输出到UART, 这里使用串口1(USART1) { //if(xFlag.PrintfOK == 0) return 0; // 判断USART是否已配置,防止在配置前调用printf被卡死 while((USARTx ->SR&0X40)==0); // 等待上一次串口数据发送完成 USARTx ->DR = (u8) ch; // 写DR,串口1将发送数据 return ch; }
代码是写在USART的初始化文件中,记得修改USARTx,换成你要输出的USART端口号。具体何用,可打开常用的示例代码参考。
二、printf卡死的问题
如果调用printf前,没USART初始化并重定向fputc, 会出现程序卡死的情况.
处理办法:
- 定义一个全局变量,如 char PrintfOK =0;
- 在USART的初始化函数中,标记变量值,如: PrintfOK= 1;
- 最后,fputc函数中,加入判断语句: if(PrintfOK==0) return;, // 如果未完成初始化,就退出
三、关于用不用微库的疑问
微库适合场景:程序快要撑爆芯片资源的情况。
个人建议:尽量不用。
use MicroLIB(微库)详解:如何在KEIL中使用MicroLIB