STM32开发 --- printf输出串口助手、防卡死办法

一、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

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值