如果简化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\n", i++);
和printf函数一模一样,只是换了一个名称罢了。这种方法可以省去每添加一个printf都需要这么写,很费时费力。这样子实在是太麻烦了!万一要各个地方都要打印,会使版面看起来很乱。
#if _DEBUG_
printf("hello world!");
#endif
如果简化stm32中printf函数的使用——首先重定向的更多相关文章
- 关于STM32中printf函数的重定向问题
printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...
- 单片机中printf函数的重映射
单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...
- STM32 的 printf() 函数串口重定向(HAL库标准库都适用)
1.建立工程 2.核心:添加新文件usar_fputc.c (名字随便自己命名),把文件添加到项目中去 #include "stdio.h" #include "stm3 ...
- MDK中STM32使用Printf函数详细解析【转载】
在用MDK调试STM32板子串口时,为了方便串口调试,调用了printf()函数,用Keil仿真是,串口不能正确的输出,软件仿真时,总是卡在那 里.有点纳闷,然后调用USART_SendData()函 ...
- STM32中printf重定向到串口
学习STM32过程中,经常打交道的莫过于串口,你可以将任何信息,当然重要的是调试信息打印到串口中输出,总是用一个字节发送函数或者字符串发送函数 总是有些不放便,之前编程中熟悉的莫过于printf了,下 ...
- C中printf函数的用法总结
函数语法 stdio.h文件中的定义: /* Write formatted output to stdout. */ int printf (const char *__restrict __for ...
- 在keil中使用printf()函数的要点
在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...
- STM32使用printf丢失第一个字母的问题
STM32使用printf函数给串口打印信息的执行步骤为: 1.重定向printf函数 给uart.c文件中增加如下函数: //重定向c库函数printf到USART1 int fputc(int c ...
随机推荐
- Python视频教程免费分享(2020年最新版)
为期92天的全套Python视频教程免费分享,总计57G! 里面还有我的笔记,希望对大家有帮助哈~ 1-32天 … … 65-92天 百度云网盘: 链接: https://pan.baidu.com/ ...
- web平台大数据请求传输性能处理
在XMLHttpRequest请求中使用ArrayBuffer方式,和后端服务器进行二进制的传输交互. 在项目中发现随着用户增长,部分前端功能,请求的数据量越来越大,传统的josn的方式,在下载.序列 ...
- C++程序设计学习-第2章
第二章 变量与基本类型 1.基本内置类型 C++定义了一套包括算术类型和空类型在内的基本数据类型 算术类型:整型和浮点型,包括带符号类型(signed)和无符号类型(unsigned),带符号类型可以 ...
- PAT甲级 图的遍历 相关题_C++题解
图的遍历 PAT (Advanced Level) Practice 图的遍历 相关题 目录 <算法笔记>重点摘要 1021 Deepest Root (25) 1076 Forwards ...
- 探索grafana
因为zabbix的监控图形不够美观,功能也不够强大, 那么就用到了grafana 填写zabbix插件配置: 如下需要根据主机群组和主机名来完成图形: grafana报警如下: 解决如下: 更改标准设 ...
- ndarray笔记续
数组的索引与切片 多维数组的索引 import numpy as np arr=np.arange(1,25).reshape(2,3,4) arr # 输出 array([[[ 1, 2, 3, 4 ...
- TZOJ2882: 美食节之感恩父母
#include<stdio.h> int main() { ],b[],i,j,max,m,t1,t2,t3; while(scanf("%d",&m),m) ...
- access 数据库创建表SQL语法
create table R_CAIFA_B13 ( ID AUTOINCREMENT PRIMARY KEY, XB varchar(255), C1 varchar(50), C2 varchar ...
- HTTP协议探究(五):H2中一些重要的概念
一 复习与目标 1 复习 简单密码学.对称加密与非对称加密 数字签名.数字证书 SSL/TLS HTTPS = HTTP + SSL/TLS,SSL/TLS为HTTP提供了保密性.完整性和鉴别性 2 ...
- WeChat App Word
chats:聊天:n werun:微信运动 contacts:联系人:n official accounts:官方账号(公众号) discover:发现:vi moments:片刻(朋友圈动态):n ...