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
  • 相关阅读:
    DataTable轉EXCEL 3/21
    中風預防知識
    unable to convert mysql date/time value to system.data.time 11/14
    win8 获得地理坐标 GIS
    页面嵌套 GIS
    win8 metro 弹出一个部分 GIS
    正则表达式基础 之 ? GIS
    windows phone pivot 开发过程中的使用心得 GIS
    线程不安全 GIS
    线程基础知识 GIS
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007393.html
Copyright © 2011-2022 走看看