zoukankan      html  css  js  c++  java
  • 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)https://blog.csdn.net/wu10188/article/details/97786989

    这个方式有助于编写好的工程。

    stm32添加串口调试

    https://blog.csdn.net/dream_feng/article/details/83504862按照这个方式,添加成功。

    首先在stm32中添加SWO输出功能,在uart.c中添加如下代码,作为printf的重定向。

    #ifdef __GNUC_
        #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
    #else
        #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
    #endif
    
    #ifdef SWO_PRINTF
    PUTCHAR_PROTOTYPE
    {
        ITM_SendChar(ch);
        return ch;
    }
    #else
    //重定义fputc函数
    PUTCHAR_PROTOTYPE
    {
        RS485PA8_TX;
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        RS485PA8_RX;
        return ch;
    }
    #endif

    这个SWO功能stlink和jlink都有的,可以代替uart输出,提高系统运行效率。

    具体怎么实现SWO功能可以参考strongerHuang博客的教程,这里不予重复。我在另外的文章也提到过了。

    第二新建 debug.h,文件名都可以自定义的,不局限的,然后在c文件添加该头文件。

    #ifdef DEBUG_OUT
    #define _MSG_DBG(...)	printf(__VA_ARGS__)
    #else
    #define _MSG_DBG(...)
    #endif
    
    #endif

    然后可以在keil的如下页面打开宏定义即可

    这个方法,可以是的keil管理两个target,一个debug,一个release,debug添加宏定义,用于调试的时候打印信息,release不添加宏定义,加快编译及运行速率。

    第三,使用方式更加简洁

    _MSG_DBG("i=%u ", i++);

    和printf函数一模一样,只是换了一个名称罢了。这种方法可以省去每添加一个printf都需要这么写,很费时费力。这样子实在是太麻烦了!万一要各个地方都要打印,会使版面看起来很乱。

    #if _DEBUG_
    printf("hello world!");
    #endif
  • 相关阅读:
    百度指数感想
    冲刺贡献分
    冲刺三
    通过myEclipse创建hibernate的实体类
    并发处理
    数据库设计原则(转载)
    Extjs学习
    关于oracle存储过程需要注意的问题
    oracle存储过程
    十大编程算法
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007393.html
Copyright © 2011-2022 走看看