单片机中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

  

单片机中printf函数的重映射的更多相关文章

  1. 如果简化stm32中printf函数的使用——首先重定向

    STM32单片机极简方法 使用宏定义 代替复杂的重定向printf()函数,实现串口打印.(HAL库例程)https://blog.csdn.net/wu10188/article/details/9 ...

  2. 关于STM32中printf函数的重定向问题

    printf函数一般是打印到终端的,stm32芯片调试中经常需要用到串口来打印调试信息,那能不能用串口实现类似windows的Console中的printf呢? 答案是肯定的,那就是printf函数的 ...

  3. C中printf函数的用法总结

    函数语法 stdio.h文件中的定义: /* Write formatted output to stdout. */ int printf (const char *__restrict __for ...

  4. C 中 关于printf 函数中度剖析

    题外话  这篇博文主要围绕printf函数分析的,主要讲解printf 使用C的可变参数机制, printf是否可重入(是否线程安全), printf函数的源码实现. 正文 1.C中可变参数机制 我们 ...

  5. 在keil中使用printf()函数的要点

    在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...

  6. OpenCV探索之路(八):重映射与仿射变换

    重映射 重映射就是把一幅图像中某个位置的像素放置到另一个图片中指定位置的过程. 用一个数学公式来表示就是: 其中的 f 就是映射方式,也就说,像素点在另一个图像中的位置是由 f 来计算的. 在Open ...

  7. printf 函数的实现原理

    /* * ===================================================================================== * * Filen ...

  8. c++中的函数重载、函数重写、函数重定义

    目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...

  9. 关于在MDK中使用 printf 函数

    microlib 提供了一个有限的 stdio 子系统,它仅支持未缓冲的 stdin.stdout 和 stderr. 这样,即可使用 printf() 来显示应用程序中的诊断消息. 要使用高级 I/ ...

随机推荐

  1. 原生js---ajax的封装插件.js---(对get和post做了兼容)

    function ajax(method,url,data,fn){ // 1.创建对象 var xhr=null; try{ xhr=new XMLHttpRequest(); }catch(e){ ...

  2. 实时计算DStream下求平均值(reduceByKey or combineByKey)

    对NC市的卡口数据进行分析,大概所有卡口每15秒接入的有效数据在3000条左右,现在产品经理要求对这些数据进行拥堵分析,通过两个卡口之间的车辆行驶时长来判断道路的拥堵情况.具体算法不展开.其中我需要做 ...

  3. HDU 1568 Fibonacci(大数前4位)

    转载自:http://blog.csdn.net/thearcticocean/article/details/47615241 分析:x=1234567.求其前四位数: log10(x)=log10 ...

  4. python爬虫-基础入门-爬取整个网站《3》

    python爬虫-基础入门-爬取整个网站<3> 描述: 前两章粗略的讲述了python2.python3爬取整个网站,这章节简单的记录一下python2.python3的区别 python ...

  5. LeetCode168.Excel表列名称

    给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...

  6. DOS命令下映射虚拟磁盘(驱动器)

    ---恢复内容开始--- subst命令,用于路径替换,进入dos窗口,键入“subst /?”(t和/之间有空格),会看到关于subst的用法如下: C:\Users\Administrator&g ...

  7. Discuz目录结构

    /source/class/task站点任务内置包 task_avatar.php头像类任务 task_blog.php发表日志任务 task_connect_bind.phpQQ 帐号绑定任务 ta ...

  8. XML系列之--解析电文格式的XML(二)

    上一节介绍了XML的结构以及如何创建.讲到了XML可作为一种简单文本存储数据,把数据存储起来,以XML的方式进行传递.当接收到XML时,必不可少的就是对其进行解析,捞取有效数据,或者将第三方数据以节点 ...

  9. appium随笔

    目录结构如下: Test_edaike---page object设计思想 定位元素和脚本分离Images目录---用例失败截图case目录 eTestfastfood.py---定位app界面元素& ...

  10. 前端框架VUE----babel

    这个是解析我们es6的代码的,为什么要用它呢,因为对于一些ie浏览器,甚至FF浏览器,低版本的还不能识别我们的es6代码,那么vue里面好多还让我们去写es6的代码,这个时候我们就可以用babel这个 ...