STM32中如何使用printf()函数

在STM32中使用printf函数 实际上的printf函数就是一个串口输出函数,只不过它相比之前我们直接调用串口发送函数更加方便、更加实用,无非是在GPIO的定义与初始化上有点儿区别。因此,我们完全可以将printf函数看成一个串口发送函数。... 阅读详情
AI摘要

本文介绍在STM32开发环境中使用printf函数进行串口通信的两种配置方法,包括工程属性配置和添加Regtarge.c文件,适用于Keil RVMDK开发环境。

STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK

在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。

 

下面就说一下使用printf需要做哪些配置。

 

有两种配置方法:

一、对工程属性进行配置,详细步骤如下

1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。

2、在main文件中重定义函数如下:

// 发送数据

int fputc(int ch, FILE *f)

{

USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等

while (!(USART1->SR & USART_FLAG_TXE));

return (ch);

}

// 接收数据

int GetKey (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

这样在使用printf时就会调用自定义的fputc函数,来发送字符。

3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”

MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。

 

至此完成配置,在工程中可以随意使用printf向串口发送数据了。

 

二、第二种方法是在工程中添加“Regtarge.c”文件

1、在main文件中包含 “stdio.h” 文件

2、在工程中创建一个文件保存为 Regtarge.c ,然后将其添加工程中

在文件中输入如下内容(直接复制即可)

#include

#include

#pragma import(__use_no_semihosting_swi)

extern int SendChar(int ch); // 声明外部函数,在main文件中定义

extern int GetKey(void);

struct __FILE {

int handle; // Add whatever you need here

};

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f) {

return (SendChar(ch));

}

int fgetc(FILE *f) {

return (SendChar(GetKey()));

}

void _ttywrch(int ch) {

SendChar (ch);

}

int ferror(FILE *f) { // Your implementation of ferror

return EOF;

}

void _sys_exit(int return_code) {

label: goto label; // endless loop

}

 

3、在main文件中添加定义以下两个函数

int SendChar (int ch) {

while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口

USART1->DR = (ch & 0x1FF);

return (ch);

}

int GetKey (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

至此完成配置,可以在main文件中随意使用 printf 。

【STM32学习5】STM32使用printf函数 打印到电脑串口助手 介绍如何在STM32开发时使用printf函数,辅助调试 阅读详情

相关推荐

STM32开发printf函数支持

用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机简单说:就是通过仿真器实现开发板在电脑上的输入和输出一般我们:不使用半主机模式!!!方法一:微库法在魔术棒→Target选项卡,勾选:Use Micro LlB,即可避免半主机模式方法二:代码法1个预处理、2个定义、3个函数1、,确保不从C库中使用半主机函数_FILE结构体,避免HAL库某些情况下报错,避免编译报错_ttywrch_sys_exit和等三个函数。

qq_40170041的博客 1756

STM32使用printf函数

用于ARM目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机简单说:就是通过仿真器实现开发板在电脑上的输入和输出一般我们:不使用半主机模式!!微库法代码法 (推介) 一个预处理、两个定义、三个函数确保不从C库中使用半主机函数2,定义:__FILE 结构体,避免HAL库某些情况下报错3,定义:FILE__stdout,避免编译报错。

2302_76921930的博客 5971

数控弯管机xyz转换ybc的算法_花了一年时间开发的三维弯管机交互式转档软件(三维管子模型UG,SOLIDWORK,PRO/E文件转成YBC)...

在弯管机加工中,由管子模型生成可直接进行弯管加工的YBC数据可以大大提高弯管编程过程.传统的做法是先用dxf数据文件(用autocad绘制管子的轴心线数据)转出XYZ数据,然后由XYZ数据转成YBC数据,而且大部分厂家对文件版本以及软件做管方式都有不少限制,这大大花费了用户的时间跟精力.随着企业的信息化管理以及不断的技术升级,传统用autocad线条模式来描述管子的方式正在被用户用PRO/E,UG...

weixin_29065959的博客 1966

【stm32串口打印】printf函数的使用方法,注意事项,原理以及拓展,个人学习理解总结

对于stm32使用printf函数在不同库下的一些注意事项,使用方式总结,问题原因及解决办法,其他博客文章传送门,以及USART外设的封装等源码分享。

weixin_55902760的博 2万+

重装系统后,恢复Oracle的.ORA文件

前几天,系统莫名奇妙产生很多宏病毒,进而感染整个C盘,不得已,格式化后重装了系统。 重装系统之后,突然想到D盘中的oracle中很多数据没导出来备份,安装文件下有很多有用的.ORA文件,抱着死马当活马医的态度,居然成功了。 1、将原来D盘(D:\oracle\product\10.2.0\oradata\orcl)下的数据文件备份下其他盘,将D盘的oracle目录名改成oracle1。安装数据

zhanggnol的blog 5551

linux redis7 完整的集群搭建过程

一。安装: 1.1 说明: Redis官方只提供了源码,并没有提供经过编译之后的安装包。 因此,安装Redis,要先编译、后安装。(即源码安装方式) 注意:需要联网安装 1.2 安装编译的工具: yum install gcc gcc-c++ -y 1.3 下载tar包,上传到linux服务器,解压配置环境变量 1.4 cd +解压的目录下:编译 make 注意:如果编译失败,请重新进行解压编译,...

m0_38028438的博客 719

STM32L152RC 在keil4中使用printf()和scanf() 函数

STM32L152RC 在keil4中使用printf()和scanf函数1、在keil中配置使用Micro LIB,如下图2、配置USART模块 void SYS_USARTInit(void) { static USART_InitTypeDef USART_InitStructure; static GPIO_InitTypeDef GPIO_InitStructure; USART

jnu_fangzebin的专栏 3144

STM32+HX711实战:5分钟搞定拉力传感器数据采集(附完整代码)

本文详细介绍了如何使用STM32微控制器和HX711模数转换器快速搭建高精度拉力测量系统。通过硬件连接指南、驱动实现代码和校准方法,帮助开发者在5分钟内完成拉力传感器数据采集,适用于工业自动化和消费电子等场景。

y7z8a9的博客 877

print函数 stm32_STM32中如何使用printf()函数

STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。下面就说一下使用printf需要做哪些配置。有两种配置方法:一、对工程属性进行配置,详细步骤如下1、首先要在你的main 文件中 包含“stdi...

weixin_28716769的博客 1839

华为交换机与思科/华三设备LACP对接实战:手把手教你配置链路聚合

本文详细解析了华为交换机与思科、华三设备间的LACP链路聚合配置实战,涵盖核心原理、配置步骤及排错技巧。通过对比不同厂商的实现差异,提供可落地的跨厂商对接方案,助力企业网络工程师高效部署高可靠性链路聚合。

weixin_30836759的博客 424

华为OD机试真题 新系统 2026-04-26 Python&JS 实现【最大化游戏试玩资格分发】

新研发了一台游戏设备可以面向用户接受试玩。现有 n 个试玩申请,每个试玩有开始时间和结束时间。作为协调员,为了能让更多人体验到游戏,你需要对试玩申请进行选择,使得:

MISAYAONE的博客 291

【基础】STM32中如何使用printf()函数

可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中。至此完成配置,可以在main文件中随意使用 printf。二、第二种方法是在工程中添加“Regtarge.c”文件。

qq_65102825的博客 1637

Agent应用实践之二十九 - 设计模式:人机协同

本章讲解了一种比较常见的设计模式:人机协同。通过一些场景举例,同时使用AgentScope本身自带的能力实现的人机协同模式,最后通过源码分析了AgentScope中如何实现。通过了解人机协同模式对于实际工程使用也是非常有用的。

代码让AI扣 306

STM32中使用HAL库重定向printf()函数

STM32中使用HAL库重定向printf()函数1. 函数添加头文件2. 添加函数 1. 函数添加头文件 #include "stdio.h" 2. 添加函数 int fputc(int ch,FILE *f) { uint8_t temp[1]={ch}; HAL_UART_Transmit(&UartHandle,temp,1,2); //UartHandle是串口的句柄 } 之后就可以 使用printf()函数,像C语言一样输出打印信息,支持 %d %x

宁静致远的博客 2309

YOLOv8模型改进、剪枝、蒸馏和Web端界面的直观展示

模型蒸馏与性能提升 为了进一步优化YOLOv8模型,可以使用蒸馏技术将大型模型的知识转移到小型模型中。在模型蒸馏过程中,通过定义适当的损失函数和训练策略,学生网络可以学习教师网络的知识,并达到接近教师网络性能的效果。这样做不仅可以减少模型的存储和计算开销,还可以提高模型的推理速度和实时应用的响应能力。这样,用户可以直观地观察到模型的性能和应用的效果。为了优化YOLOv8模型并实现直观地观看检测效果或训练结果的全家通应用,本文将探讨如何通过改进、剪枝和蒸馏技术,并结合Web端界面来提升模型性能。

weixin_51988935的博客 2397

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

stm32中如何使用printf()函数!

stm32下直接使用printf,虽编译时无任何问题,但运行时,会导致程序无法进行,在使用前应该做到以下两步: 1.使用microlib 工程设置-->TARGET---->use microlib ,打勾 2.主文件中添加以下代码: int fputc(int ch,FILE *f) {   /* Write a character to the USART */   USART_

tkzsld的专栏 1039

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32(MDK)中不能使用printf()函数的问题

简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISON

* . Benirus的专栏 2789

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32串口使用Printf()函数问题

标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.  例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: 只要自己添加一个int fputc(int ch, FILE *f)函数,能够输出字符就可以了 #if 1 #pragma import(__use_no_semihostin

wandermen的专栏 1927

转载:STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印。(HAL库例程)

但是如果我们使用的是单片机运行C语言代码,如果不经任何修改直接使用 printf() 函数,结果是什么现象都没有。接下来我介绍一种特别简单的方法,让你不需要重定向 printf() 函数也可以实现相似的功能,就是那种%d,%f,%c。以上代码表示用 ps() 这个宏函数代替HAL库的串口发送函数,并且可以使用格式控制符%c,%d,%f,\r,\n等可变参数控制符。2.__VA_ARGS__是三个点”…对于 printf() 函数我们并不陌生,初学C语言使用的第一个函数,其作用是在终端打印显示格式化字符串。

q1793556674的博客 725

怎么解决STM32(MDK)中不能使用printf()函数的问题

简单地说:想在mdk 中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式), 标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数. 例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ /* With GCC/RAISONANC

wenyufei2013的专栏 5661

keil5| printf()函数 | 使用技巧 | STM32|UARST串口输出

【注】由于printf()函数是向屏幕打印信息,但是STM32单片机没有屏幕,故需fputc()函数重定向到串口,那么printf()函数就可输出到串口,借助串口助手显示打印信息。方法一:在Misc Controls中 填写 --no-multibyte-chars,同时编码格式在keil中和串口助手中都选择UTF-8格式。2、点击“Target”,勾选“use MicroLIB”,前的对钩,点击“OK”,完成设置。3、在头文件中添加#include <stdio.h>,同时对printf()函数重定向。

ADC654的博客 5387

STM32重定位printf函数后,不能使用print函数,单步调试卡在printf()函数

反复检查了代码,确认代码没有任何问题后,我开始在options for Target中寻找问题,检查了我已经勾选了Target-&gt;Use MicroLIB库但是还是无法使用Printf()函数进行串口输入,随后又检查了C/C++页面中,发现编译器默认帮我勾选了好多 重点是编译器默认 勾选了GNU extensions ,随后我把它取消了,Printf()函数又可以正常使用了  ...

AFunnyBoy的博客 2159

STM32中使用标准库重定义printf()函数

//重定义函数1 PUTCHAR_PROTOTYPE { /* Place your implementation of fputc here */ /* e.g. write a character to the USART */ USART_SendData(USART1, (uint8_t) ch); /* 循环等待直到发送结束*/ while (USART_GetFla...

CoolBreeze的博客 4097
上一篇: 陶瓷电容的简单介绍--MLCC(NPO,C0G,X7R和Y5V等),瓷片电容(低频瓷介电容和高频瓷介电容)
下一篇: DS18B20 for STM32
oshan2012
博客等级 码龄15年 300粉丝 91原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值