STM32应用开发教程进阶--UART串口重定向(printf)

实现目标

1、掌握STM32 HAL库的串口重定向

2、具体目标:1、实现printf  “打印”各种常用的类型的数据变量


一、串口“打印”

        UART串口通信协议是我们常用的通信协议(UART、I2C、SPI等)之一,全称叫做通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是异步串行通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。

        UART 在开发中应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一个UART 通信接口连接至电脑,用于在调试程序时可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错,具体在哪里出错等等。

二、原理图设计

三、STM32CubeMX 配置

1.USART配置

四、串口重定向程序设计

1.方式一:使用微库(Use MicroLIB)

①:需要在 main.c 文件中添加如下代码

/* USER CODE BEGIN Includes */#include <stdio.h>/* USER CODE END Includes */
/* USER CODE BEGIN 4 *//*********************************************************
*
*重定义 fputc 函数
*
*********************************************************/
int fputc(int ch,FILE *f)
{HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch;
}
/* USER CODE END 4 */

②:在Keil5中勾选如下选项

2.方式二:不勾选 MicroLIB

①:需要在 main.c 文件中添加如下代码

/* USER CODE BEGIN Includes */#include <stdio.h>/* USER CODE END Includes */
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ int handle; }; FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      //二选一,功能一样HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch;//	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
//    USART1->DR = (uint8_t) ch;      
//	return ch;
}

说明:上面两种方法二选一即可

五、“打印”测试程序设计

1、定义各类型变量

/* USER CODE BEGIN PV */int i = 0;float m = 3.14;char c = 'A';char *str  = "Hello 李银河!";/* USER CODE END PV */

2、在while (1) 里 打印各变量的值

	i++;printf("i = %d\r\n",i);printf("m = %.2f\r\n",m);	printf("c = %c\r\n",c);	printf("str = %s\r\n",str);HAL_Delay(200);

六、实验效果

七、仿真实现

说明:proteus不能使用printf发送浮点型数据,一旦发送就会卡死。仿真时将小数打印代码屏蔽。


总结

1、串口打印在开发中非常重要,它就像是工程师的眼睛一样。尤其是在调试代码时,工程师可以利用串口打印出想要知道的变量等的值,以利于查找问题所在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/650977.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS_第一个程序_Hello_world

ROS的第一个项目&#xff1a;输出Hello World 我们将学习如何创建一个简单的ROS&#xff08;Robot Operating System&#xff09;项目&#xff0c;该项目将在终端中输出"Hello World"。我们将使用Python语言进行编程。 环境准备 首先&#xff0c;确保你的计算机已…

QWidget | Qt::WindowType 枚举的取值及意义QFlags 模板类详解

01 与 QWidget 类有关的部分类的继承图 3、QObject 是所有 Qt 对象的基类,QPaintDevie 是所有可绘制对象的基类。 4、QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一…

【汇编语言】直接定址表

【汇编语言】直接定址表 文章目录 【汇编语言】直接定址表前言一、移位指令移位指令过程逻辑移位指令shl 和 shr 二、操作显存数据显示的原理显示缓冲区的结构显示信息的一种“直接”方式 三、描述内存单元的标号关于标号去了冒号的数据标号数据标号同时描述内存地址和单元长度…

NX系统软件使用说明

注意&#xff1a;只有下列目录重启后不会还原&#xff0c;其它目录重启后自动还原&#xff0c;尽量不要往其它目录写入数据。 a) /home/novasky/app b) /home/novasky/app-backup c) /home/novasky/data d) /home/novasky/config 1.系统启动&#xff1a; 系统启动脚本调用…

算法模版自用(杂)

文章目录 算法库函数next_permutation(start,end) prev_permutation(start,end) (全排列函数)nth_element &#xff08;求第k小值&#xff09;next(it,num),prev(it,num)min_element(begin(),end()),max_element(begiin(),end()) (取最小值最大值) _int128的输入输出STLlist 数…

LCD液晶显示屏强光老化测试设备太阳光模拟器仪器

1. LCD液晶显示屏老化测试的意义 LCD液晶显示屏老化测试是评估显示屏寿命和性能的重要手段。随着科技的发展&#xff0c;LCD液晶显示屏已经成为我们日常生活中不可或缺的一部分。长期使用后&#xff0c;LCD液晶显示屏可能会出现亮度下降、颜色失真、响应速度变慢等问题。通过进…

DRF 查询(排序、过滤、分页)

查询(排序、过滤、分页) 【0】准备 &#xff08;1&#xff09;Q查询 详细内容可见&#xff1a;Django模型层-CSDN博客Django 的 Q 对象提供了一种在数据库查询中构造复杂查询的方法。当你想在单个查询中组合多个过滤条件&#xff0c;并且这些条件之间不仅仅是简单的 AND 关系…

博睿数据亮相GOPS全球运维大会,Bonree ONE 2024春季正式版发布!

2024年4月25日&#xff0c;博睿数据 Bonree ONE 2024 春季正式版焕新发布。同时&#xff0c;博睿数据AIOps首席专家兼产品总监贺安辉携核心产品新一代一体化智能可观测平台 Bonree ONE 亮相第二十二届 GOPS 全球运维大会深圳站。 Bonree ONE 2024 春季版产品重点升级数据采集、…

Linux实现Nginx的安装与部署并实现html静态资源访问

文章目录 一、安装过程二、常用命令三、查看状态并启动nginx四、放置静态资源五、访问 一、安装过程 1、安装依赖包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel 2、下载Nginx安装包wget https://nginx.org/download/nginx-1.16.1.tar.gz 3、解压 tar -z…

【学习笔记】Python 使用 matplotlib 画图

文章目录 安装中文显示折线图、点线图柱状图、堆积柱状图坐标轴断点参考资料 本文将介绍如何使用 Python 的 matplotlib 库画图&#xff0c;记录一些常用的画图 demo 代码 安装 # 建议先切换到虚拟环境中 pip install matplotlib中文显示 新版的 matplotlib 已经支持字体回退…

el-date-picker 禁用时分秒选择(包括禁用下拉框展示)

2024.04.26今天我学习了对el-date-picker进行禁用时分秒&#xff0c; 在使用el-date-picker组件的时候&#xff0c;我们有可能遇到需要把时分秒的时间固定&#xff0c;然后并且不能让他修改&#xff1a; 1714120999296 比如右上角的这个时间&#xff0c;我们要给它固定是‘08:…

“AI 程序员入职系列”第二弹:如何利用通义灵码光速改写项目编程语言?

通义灵码入职阿里云云原生团队后&#xff0c;已经展示过 Ta 生成单元测试和自动生成代码的强大实力。今天&#xff0c;阿里云后端工程师云徊将从项目开发的实际需求出发&#xff0c;演示通义灵码在开发工作中可提供的帮助。 通义灵码在 Git 开发项目中起到了哪些作用&#xff…