当前位置: 首页 > news >正文

单片机中printf函数的重映射

单片机中printf函数的重映射

一、源自于:大侠有话说

1.如果你在学习单片机之前学过C语言,那么一定知道printf这个函数.它最最好用的功能

除了打印你想要的字符到屏幕上外,还能把数字进行格式化.例如十进制的33,用十进制

方式输出就是33,用十六进制的形式就输出成21,如果用字符形式输出,那就是ASCII码

表对应的’!’.

2. 51年代,一些人软件仿真的时候也很喜欢使用printf,但实际代码运行中,用的人则不多,因

为别说51年代,就是用AVR的,也会觉得printf这个函数耗费的CPU资源相当可观.所以

printf在8位单片机时代,熟悉的人的确不多.但到了ARM时代,情况则大为不同.毕竟

ARM的处理能力和51完全不是一个级别,这使得不少人开始喜欢使用printf在实际项目

中作为调试过程的串口输出.因为它的格式化功能实在是相当方便.

而本例程就是教会你这么使用printf.

3.程序把printf的输出对象设定为串口1.有一个标准的函数是必须要自己定义的,那就是

fputc,把这个函数的功能写成串口输出一个字符.建议在串口的初始化模块中定义

int fputc(int ch)

{

USART_SendData(USART1, (u8) ch);

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

return ch;

}

 

然后记得一点,就是MicroLib要勾上.其实大部分情况下,都建议使用MDK附带的

MicroLib,这东西是有一定用途的.留待以后再更多地介绍.

 

以上两步做好后,还记得要包含printf的头文件:

#include <stdio.h>

那么,所有工作就大功告成了,你可以尽情的尝试printf带来的便利.

4.另外大家是否意识到一点,就是printf输出到哪,其实是由fputc函数决定的.所以如果有兴

趣,可以改写这个fputc函数,使得其printf的对象是DX-32板上的TFT屏或者黑白屏.大家有

兴趣的不妨试试.

 

二、源自于:STM32开发板(正点原子)

//加入以下代码,支持printf函数,而不需要选择use MicroLIB  

#if 1

#pragma import(__use_no_semihosting)            

//标准库需要的支持函数                 

struct __FILE

{

       int handle;

       /* Whatever you require here. If the only file you are using is */

       /* standard output using printf() for debugging, no file handling */

       /* is required. */

};

/* FILE is typedef’ d in stdio.h. */

FILE __stdout;       

//定义_sys_exit()以避免使用半主机模式   

_sys_exit(int x)

{

       x = x;

}

//重定义fputc函数 ,串口1

int fputc(int ch, FILE *f)

{     

       while((USART1->SR&0X40)==0);//循环发送,直到发送完毕  

       USART1->DR = (u8) ch;     

       return ch;

}

#endif

  

 

 

转载于:https://www.cnblogs.com/Ph-one/p/9317401.html

相关文章:

  • Tensorflow一些常用基本概念与函数(1)
  • STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结
  • 线性回归、Logistic回归、Softmax回归
  • TensorFlow学习---tf.nn.dropout防止过拟合
  • 神经网络优化算法如何选择Adam,SGD
  • tf.nn.relu
  • tf.nn.max_pool
  • 【TensorFlow】tf.nn.max_pool实现池化操作
  • git博客好的例子
  • 桌面版Ubuntu系统固定IP设置和Network-manager设置
  • ubuntu----VMware 鼠标自由切换问题及主机虚拟机共享剪切板问题
  • markdownpad2-注册码-2017-02-23
  • zynq基础--linux下软件应用
  • tftp 传输文件
  • TensorFlow模型保存和加载方法
  • Github访问慢解决办法
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript学习总结——原型
  • java取消线程实例
  • Lucene解析 - 基本概念
  • orm2 中文文档 3.1 模型属性
  • php ci框架整合银盛支付
  • Python_OOP
  • 安卓应用性能调试和优化经验分享
  • 初识MongoDB分片
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 高程读书笔记 第六章 面向对象程序设计
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 日剧·日综资源集合(建议收藏)
  • 通信类
  • 我的zsh配置, 2019最新方案
  • 用Canvas画一棵二叉树
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • raise 与 raise ... from 的区别
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​你们这样子,耽误我的工作进度怎么办?
  • ###C语言程序设计-----C语言学习(3)#
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (离散数学)逻辑连接词
  • (五)关系数据库标准语言SQL
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • .apk 成为历史!
  • .a文件和.so文件
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 托管代码与非托管代码
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET开源快速、强大、免费的电子表格组件