STM32中如何使用printf()函数
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)
在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。
下面就说一下使用printf需要做哪些配置。
有两种配置方法:
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义函数如下:
// 发送数据
1 int fputc(int ch, FILE *f)
2 {
3 USART_SendData(USART1, (unsigned char) ch); // USART1 可以换成 USART2 等
4 while (!(USART1->SR & USART_FLAG_TXE));
5 return (ch);
6 }
// 接收数据
1 int GetKey (void)
2 {
3 while (!(USART1->SR & USART_FLAG_RXNE));
4 return ((int)(USART1->DR & 0x1FF));
5 }
这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”
MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。
至此完成配置,在工程中可以随意使用printf向串口发送数据了。
二、第二种方法是在工程中添加“Regtarge.c”文件
1、在main文件中包含 “stdio.h” 文件
2、在工程中创建一个文件保存为 Regtarge.c ,然后将其添加工程中
在文件中输入如下内容(直接复制即可)
1 #include "stdio.h"
2
3 #pragma import(__use_no_semihosting_swi)
4 extern int SendChar(int ch); // 声明外部函数,在main文件中定义
5 extern int GetKey(void);
6
7 struct __FILE
8 {
9 int handle; // Add whatever you need here
10 };
11
12 FILE __stdout;
13 FILE __stdin;
14
15 int fputc(int ch, FILE *f)
16 {
17 return (SendChar(ch));
18 }
19
20 int fgetc(FILE *f)
21 {
22 return (SendChar(GetKey()));
23 }
24
25 void _ttywrch(int ch)
26 {
27 SendChar (ch);
28 }
29
30 int ferror(FILE *f)
31 {
32 // Your implementation of ferror
33 return EOF;
34 }
35
36 void _sys_exit(int return_code)
37 {
38 label: goto label; // endless loop
39 }
注释:
fputc和 fgetc是c语言的标准函数(形参是标准的) FILE *f 是文件指针,具备文件系统的操作系统有用。对于简单的无文件系统的嵌入式系统无用。
3、在main文件中添加定义以下两个函数
1 int SendChar (int ch)
2 {
3 while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口
4 USART1->DR = (ch & 0x1FF);
5 return (ch);
6 }
7
8 int GetKey (void)
9 {
10 while (!(USART1->SR & USART_FLAG_RXNE));
11 return ((int)(USART1->DR & 0x1FF));
12 }
至此完成配置,可以在main文件中随意使用 printf 。
STM32中如何使用printf()函数的更多相关文章
- STM32中如何对printf函数重定向
通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们现STM32工程上的printf()函数,方便用于程序开发中调试信息的打印. 方法一:使用MicroLIB库 ...
- php中sprintf与printf函数用法区别
下面是一个示例:四舍五入保留小数点后两位 代码如下 复制代码 <?php$num1 = 21;echo sprintf("%0.2f",$num1)."<b ...
- STM32 KEIL 下的 printf 函数
1 //加入以下代码,支持printf函数,而不需要选择use MicroLIB 2 #if 1 3 #pragma import(__use_no_semihosting) 4 //标准库需要的支持 ...
- stm32中如何进行printf重定向用于串口调试输出
1 在main中包含stdio.h 文件 2 Target选项框里选Use MicroLib 选项 3 在main中添加UART1_Configuration()初始化的代码 Uart1初始化,voi ...
- 如果简化stm32中printf函数的使用——首先重定向
STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...
- 关于STM32中printf函数的重定向问题
printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...
- STM32 printf()函数和scanf()函数重定向到串口
STM32 printf()函数和scanf()函数重定向到串口 printf()函数和scanf()函数重定向 在学习STM32的时候,常常需要用串口来测试代码的正确与否,这时候就要要用到print ...
- 单片机中printf函数的重映射
单片机中printf函数的重映射 一.源自于:大侠有话说 1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能 除了打印你想要的字符到屏幕上外,还能把数字进行格式化 ...
- STM32 中的 assert_param 函数
在学STM32的时候函数assert_param出现的几率非常大,上网搜索一下,网上一般解释断言机制,做为程序开发调试阶段时使用. 断言机制函数assert_param我们在分析库函数的时候,几乎每一 ...
- C 中 关于printf 函数中度剖析
题外话 这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...
随机推荐
- Winform窗体控件双向绑定数据模拟读写PLC数据
1.用Modbus工具模拟PLC 2.创建一个实体类 点击查看代码 internal class Data : INotifyPropertyChanged { ushort[] ushorts = ...
- [转载] 6 个技巧,提升 C++11 的 vector 性能
转载:https://www.sohu.com/a/120595688_465979 Vector 就像是 C++ STL 容器的瑞士军刀.Bjarne Stoutsoup 有一句话 – " ...
- .NET Aspire Apps 集成测试
原文:https://fiodar.substack.com/p/integration-testing-dotnet-aspire-apps 对于软件开发来说,拥有自动化的覆盖测试非常重要.尽管手工 ...
- PDF 图书
我找到的深入介绍 PDF 结构的图书主要有 2 本: PDF Explained,这本书比较早,首发于 2011 年11 月 30 日 Developing with PDF,首发于 2013年10月 ...
- 2024年1月Java项目开发指南13:登录注册实现
创建文件,如上图 创建好文件后去router.index.js配置路由 import { createRouter, createWebHistory } from 'vue-router'; // ...
- Linux readonly
1. 概念readonly在shell脚本中,用来标记变量是只读的,后续执行过程中就不能对其值进行改变,这个用来定义一些常量类的变量. 如果对其进行重新赋值,会提示错误 [root@localhost ...
- Qt/C++编写物联网组件/支持modbus/rtu/tcp/udp/websocket/mqtt/多线程采集
一.功能特点 支持多种协议,包括Modbus_Rtu_Com/Modbus_Rtu_Tcp/Modbus_Rtu_Udp/Modbus_Rtu_Web/Modbus_Tcp/Modbus_Udp/Mo ...
- Qt项目升级到Qt6经验总结
1 直观总结 增加了很多轮子,同时原有模块拆分的也更细致,估计为了方便拓展个管理. 把一些过度封装的东西移除了(比如同样的功能有多个函数),保证了只有一个函数执行该功能. 把一些Qt5中兼容Qt4的方 ...
- 即时通讯技术文集(第44期):微信、QQ技术精华合集(Part1) [共14篇]
为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第44 期. [-1-] 微信朋友圈千亿访问量背后的技术挑战和实践总结 [链接] http:/ ...
- Flybirds 问题汇总
1. HOOK-ERROR in before_all: AttributeError: 'ScreenRecordInfo' object has no attribute 'dev' 解决方法: