news 2026/5/30 14:14:58

【普中STM32F1xx开发攻略--标准库版】-- 第 22 章 printf 重定向

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【普中STM32F1xx开发攻略--标准库版】-- 第 22 章 printf 重定向

(1)实验平台:普中STM32F103朱雀、玄武开发板


上一章我们介绍了 STM32F1 的 USART 串口通信, 这一章我们来学习如何在STM32 上使用 printf 输出函数。 相信只要学习过 C 语言的朋友, 都会使用 printf函数。 本章要实现的功能是: 通过 printf 函数将信息打印在串口调试助手上显示。 学习本章的可以参考串口通信章节内容。 本章分为如下几部分内容:

22.1 printf 重定向介绍

22.1.1 printf 重定向简介

22.1.2 printf 函数格式

22.2 硬件设计

22.3 软件设计

22.3.1 USART1 初始化函数

22.3.2 printf 重定向函数

22.3.3 主函数

22.4 实验现象

课后作业


22.1 printf 重定向介绍

22.1.1 printf 重定向简介

我们知道 C 语言中 printf 函数默认输出设备是显示器, 如果要实现在串口或者 LCD 上显示, 必须重定义标准库函数里调用的与输出设备相关的函数。 比如使用 printf 输出到串口, 需要将 fputc 里面的输出指向串口,这一过程就叫重定向。

那么如何让 STM32 使用 printf 函数呢? 很简单, 只需要将 fputc 里面的输出指向 STM32 串口即可, fputc 函数有固定的格式, 我们只需要在函数内操作STM32 串口即可, 代码如下:

int fputc(int ch,FILE *p) //函数默认的, 在使用 printf 函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch; }

如果要让其他的串口也使用 printf 函数, 只需要修改下串口号即可。

22.1.2 printf 函数格式

printf 函数调用格式如下:

printf("<格式化字符串>", <参量表>);

其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符,用来确定输出内容格式。

参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。

常用格式化规定字符如下:

%d 按照十进制整型数打印
%6d 按照十进制整型数打印, 至少 6 个字符宽
%f 按照浮点数打印
%6f 按照浮点数打印, 至少 6 个字符宽
%.2f 按照浮点数打印, 小数点后有 2 位小数
%6.2f 按照浮点数打印, 至少 6 个字符宽, 小数点后有 2 位小数
%x 按照十六进制打印
%c 打印字符
%s 打印字符串

例如: 使用 printf 函数输出一个整型数据 1234, 则调用格式如下:

int data=1234; printf(“输出整型数据 data=%d\r\n” ,data);

在 KEIL 中使用 printf 一定要勾选“微库” 选项, 否则不会输出。 配置如下:

在 STM32 程序开发中 printf 应用是非常广的, 当我们需要查看某些变量数值或者其他信息等, 都可以通过 printf 打印到串口调试助手上查看。

22.2 硬件设计

本章硬件电路与上一章串口通信实验一样, 使用到了 STM32F1 的串口 1 和LED 指示灯, 这里不多说。

22.3 软件设计

本章所要实现的功能是: 通过 printf 函数将信息打印在串口调试助手上显示, 同时 D1 指示灯不断闪烁, 表示系统正常运行。 程序框架如下:

(1) 初始化 USART1

(2) 编写 printf 重定向程序

(3) 编写主函数

本章软件部分非常简单, 只需要在上一章串口通信程序基础上, 加上一个printf 重定向函数即可。 下面我们打开“\4--实验程序\1--基础实验\14-printf重定向” 工程。

22.3.1 USART1 初始化函数

USART1 串口初始化程序同上一章串口通信实验一样。

22.3.2 printf 重定向函数

初始化 USART1 后, 就需要将 fputc 里面的输出指向 STM32 的串口, 代码如下

int fputc(int ch,FILE *p) //函数默认的, 在使用 printf 函数时自动调用 { USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return ch; }

当使用 printf 函数时, 自动会调用 fputc 函数, 而 fputc 函数内又将输出设备重定义为 STM32 的 USART1, 所以要输出的数据就会在串口 1 上输出。

22.3.3 主函数

编写好前面几部分程序后, 接下来就可以编写主函数了, 代码如下:

#include "system.h" #include "SysTick.h" #include "led.h" #include "usart.h" /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ int main() { u8 i=0; u16 data=1234; float fdata=12.34; char str[]="Hello World!"; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); USART1_Init(115200); while(1) { i++; if(i%50==0) { LED1=!LED1; printf("输出整型数data=%d\r\n",data); printf("输出浮点型数fdata=%0.2f\r\n",fdata); printf("输出十六进制数data=%X\r\n",data); printf("输出八进制数data=%o\r\n",data); printf("输出字符串str=%s\r\n",str); } delay_ms(10); } }

主函数实现的功能很简单, 首先调用之前编写好的硬件初始化函数, 包括SysTick 系统时钟, LED 初始化等。 然后调用我们前面编写的 USART1 初始化函数,这里我们设定串口通信波特率为 115200。 最后进入 while 循环语句, 不断让 LED指示间隔 200ms 闪烁, 同时通过串口 1 输出一连串字符信息。

其实如果你学会了重定向到 USART1, 对于其他的串口重定向都是类似的。

22.4 实验现象

将工程程序编译后下载到开发板内, 可以看到 DS0 指示灯不断闪烁, 表示程序正常运行。 打开“\5--开发工具\4-常用辅助开发软件\串口调试助手\串口调试助手(丁丁)” 内串口调试助手。 实验现象如下: (前提一定要连接好线路,USB 线一端连接电脑, 另一端连接开发板“USB 转串口模块” 上的 USB 下载口,并且在“USB 转 TTL&电源” 模块上 P4 端子短接片已插上

课后作业

(1) 使用 printf 函数, 在串口调试助手上打印出九九乘法表。

(2) 使用 printf 函数, 在串口调试助手上打印杨辉三角。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 19:55:24

12、深入了解Samba:文件系统差异与权限管理

深入了解Samba:文件系统差异与权限管理 1. 文件系统差异处理 在使用Samba时,需要解决Unix和非Unix文件系统之间的差异问题,这涉及到符号链接、隐藏文件、点文件以及文件权限等方面。 1.1 隐藏和禁止访问文件 隐藏点文件( hide dot files ) :这是一个布尔选项。当设…

作者头像 李华
网站建设 2026/5/29 20:41:50

MNN深度学习框架多模型部署终极指南:从架构解析到生产实践

MNN深度学习框架多模型部署终极指南&#xff1a;从架构解析到生产实践 【免费下载链接】MNN MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases in Alibaba 项目地址: https://gitcode.com/GitHub_Trending/mn/MNN…

作者头像 李华
网站建设 2026/5/29 12:23:01

字节开源Dolphin-v2: 基于异构锚点提示的文档图像解析

Dolphin-v2是一款增强型通用文档解析模型&#xff0c;在原始Dolphin基础上实现显著提升。该模型通过采用具备文档类型感知能力的双阶段架构及可扩展锚点提示技术&#xff0c;能够无缝处理任何类型的文档——无论是数字原生文件还是拍摄图像。 &#x1f4d1; 概述 由于文档类型…

作者头像 李华
网站建设 2026/5/29 19:48:41

JELOS:重新定义掌上娱乐体验的终极Linux系统

还在为掌上娱乐设备的性能瓶颈而烦恼吗&#xff1f;想要一个既能畅玩复古内容又能运行现代大作的轻量级操作系统吗&#xff1f;JELOS&#xff08;Just Enough Linux Operating System&#xff09;正是你苦苦寻找的答案&#xff01;这款专为ARM架构掌机打造的不可变Linux发行版&…

作者头像 李华
网站建设 2026/5/29 20:37:19

Kotaemon深度解析:构建可复现检索增强生成系统的最佳实践

Kotaemon深度解析&#xff1a;构建可复现检索增强生成系统的最佳实践 在金融、医疗和法律等高合规性要求的行业中&#xff0c;一个常见的挑战是&#xff1a;如何让大语言模型&#xff08;LLM&#xff09;的回答既准确又可追溯&#xff1f;我们见过太多“听起来很专业&#xff0…

作者头像 李华
网站建设 2026/5/29 18:03:38

【R语言量子计算噪声模拟】:掌握5大核心参数设计高效容错算法

第一章&#xff1a;R语言在量子计算噪声模拟中的应用背景 量子计算作为前沿计算范式&#xff0c;其物理实现极易受到环境噪声干扰&#xff0c;导致量子态退相干和门操作误差。准确模拟这些噪声过程对于设计容错量子算法和优化量子硬件至关重要。R语言凭借其强大的统计建模能力、…

作者头像 李华