• 笔记:stm32 printf重定向到UART疑点解析


      在调试过程中往往需要通过打印来看系统运行状态;在STM32平台上,打印重定向有多种实现方案;其一是编译时使用keil自带的MacroLIB,据说这个库对一些C语言基础设施做了新的实现,代码结构更加紧凑;但这种库没法取得源码,所以就不能进一步研究具体怎么实现的,很遗憾;还有一种实现方案是使用标准C(I/O)库,但这种方式下要注意修改避免使用semihosting(半主机模式),下面对两种方案做以简单说明。

    方案一 使用mcrolib库:

      1、首先在option里边勾选mcrolib

      

      2、重写putchar函数,已验证,如果使用当前库,printf会调用putchar;换句话说就是printf的具体实现会调用putchar

      /// 重定向printf到uart
      int fputc(int ch, FILE *f)
      {
    	//发送一字节数据到UART
         ch = 0x0a; USART_SendData(macUSARTx, (uint8_t) ch); //检测UART状态 while (USART_GetFlagStatus(macUSARTx, USART_FLAG_TXE) == RESET); return (ch);   }

      3、在使用printf之前初始化UART,之后调用即可。效果如下:

      

    方案二 使用默认C库:

      这种方案要注意一点,程序不能使用半主机模式,据说半主机模式是STM32的默认模式,用调试器时会用到,所以在程序中要明确加上以下语句

    #pragma import(__use_no_semihosting)  
    _sys_exit(int x)  
    {  
        x = x;  
    }  
    struct __FILE  
    {  
    int handle;  
    /* Whatever you require here. If the only file you are using is */  
    /* standard output using printf() for debugging, no file handling */  
    /* is required. */  
    };  
    /* FILE is typedef’ d in stdio.h. */  
    FILE __stdout; 

      然后再重写putchar函数,可参考上面的。

      

  • 相关阅读:
    border-radius
    快速搭建本地服务器
    sublime中侧边栏字体大小的设置
    关于git中git pull --rebase中的一些坑
    css中外边距合并
    php中$row=mysql_fetch_row()出错问题
    学习笔记2
    AMD Ryzen的性价比
    javascript变量提升
    手机网页里的模态对话框
  • 原文地址:https://www.cnblogs.com/zhangyi-studio/p/7955761.html
Copyright © 2020-2023  润新知