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\n", i++);

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

#if _DEBUG_
printf("hello world!");
#endif

如果简化stm32中printf函数的使用——首先重定向的更多相关文章

  1. 关于STM32中printf函数的重定向问题

    printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...

  2. 单片机中printf函数的重映射

    单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...

  3. STM32 的 printf() 函数串口重定向(HAL库标准库都适用)

    1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm3 ...

  4. MDK中STM32使用Printf函数详细解析【转载】

    在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,用Keil仿真是,串口不能正确的输出,软件仿真时,总是卡在那 里.有点纳闷,然后调用USART_SendData()函 ...

  5. STM32中printf重定向到串口

    学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数 总是有些不放便,之前编程中熟悉的莫过于printf了,下 ...

  6. C中printf函数的用法总结

    函数语法 stdio.h文件中的定义: /* Write formatted output to stdout. */ int printf (const char *__restrict __for ...

  7. 在keil中使用printf()函数的要点

    在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...

  8. STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...

  9. STM32使用printf丢失第一个字母的问题

    STM32使用printf函数给串口打印信息的执行步骤为: 1.重定向printf函数 给uart.c文件中增加如下函数: //重定向c库函数printf到USART1 int fputc(int c ...

随机推荐

  1. CNN-1: LeNet-5 卷积神经网络模型

    1.LeNet-5模型简介 LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document      ...

  2. C++:标准模板库Sort

    一.概述 STL几乎封装了所用的数据结构中的算法,这里主要介绍排序算法的使用,指定排序迭代器区间后,即可实现排序功能. 所需头文件#include <algorithm> sort函数:对 ...

  3. PHP常量:define()和const的区别

    常量,就是一个用于存储“不会(也不允许)变化的数据”的标识符.比如圆周率,在一定的应用场景中,就是一个固定的值(人为规定为某个值).常量默认大小写敏感.通常常量标识符总是大写的. (1)define( ...

  4. 笔记-8:mysql触发器

    1.触发器介绍 触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件出现时,将会被激活. mysqk触发器只支持:INSERT.UPDATE.DELETE语句. 每个表每个事件每次只允许一 ...

  5. Scratch与物理·天文:模拟中国嫦娥探月工程,探索月球的背面!

    北京时间2019年5月16日凌晨,国际顶级学术期刊<自然>(Nature)在线发表了一篇来自中国科学家的成果:中国的嫦娥四号月球探测器2019年1月3日在月球背面的冯卡门陨石坑(Von K ...

  6. webapi IHttpActionResult无引用和config.MapHttpAttributeRoutes()无引用解决办法

    1. 打开NuGet,打开方法 工具->库程序包管理器->程序包管理器控制台,如下图所示: 2. 输入如下命令Install-Package Microsoft.AspNet.WebApi ...

  7. ndk-build 修改输出so位置 (change ndk-build output so lib file path )

    期望的目录结构: Folder --- | --- build.bat | --- Source | --- All sources codes *.cpp *.h | --- Android --- ...

  8. vue 实现的评分小星星组件,包括半星

    github源码地址:https://github.com/13476075014/node-vue/blob/master/mynodeproject/13.sell/sell/src/compon ...

  9. babel-plugin-transform-remove-strict-mode

    场景:在VUE项目中,需要用到横向滚动条,在引入MUI相关的组件后,模板中的代码如下 在控制台中报错 报错内容说的是在严格模式下(strict mode)类型错误 经过推测,觉得可能是mui.js中用 ...

  10. drunk_admin_hacking_challenge靶机之旅?

    注:  只是记录本人玩的时候发现的新奇点  如果你也想玩且看了这篇文章还是不会,请联系gg 靶机下载地址 https://www.vulnhub.com/entry/drunk-admin-web-h ...