STM32中使用printf打印串口数据

2018-06-10 12:16:27来源: eefocus 关键字:STM32  printf打印  串口数据

该方法适用于STM32,实现了使用printf等标准C流函数输出数据的办法,极大的减少了输出串口数据时所需要做的数据处理。

实现原理


在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。

 

Keil环境 重映射


在STM32的Keil开发环境中,C的库函数有两种实现方式


使用标准的C函数库


就是我们平常在PC Window平台上用的C库函数,此库的的优点在于实现的功能全面。但是由于这个库基本上是专为PC设计的,故而如果在嵌入式芯片中调用时将会使得工程文件变得十分庞大。


将下列代码加入工程,无需使用#include调用即可生效。


  1. /* 

  2.  * libc_printf.c 

  3.  * 

  4.  *  Created on: Dec 26, 2015 

  5.  *      Author: Yang 

  6.  * 

  7.  *      使用标准C库时,重映射printf等输出函数的文件 

  8.  *    添加在工程内即可生效(切勿选择semihost功能) 

  9.  */  

  10.   

  11. #include   

  12. //include "stm32f10x.h"    

  13.   

  14.   

  15. #pragma import(__use_no_semihosting)               

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

  17. struct __FILE  

  18. {  

  19.     int handle;  

  20.   

  21. };  

  22. FILE __stdout;  

  23.   

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

  25. _sys_exit(int x)  

  26. {  

  27.     x = x;  

  28. }  

  29.   

  30. //重映射fputc函数,此函数为多个输出函数的基础函数  

  31. int fputc(int ch, FILE *f)  

  32. {  

  33.     while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);  

  34.     USART_SendData(USART1, (uint8_t) ch);  

  35.     return ch;  

  36. }  


    • 使用MDK提供的 MicroLib

MicroLib is a highly-optimized library for ARM-based embedded applications written in C. When compared to the standard C library included with the ARM Compiler toolchain, MicroLib provides significant code size advantages required for many embedded systems.

                                              
摘自Keil官网介绍  



基本就是说:Microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。


同样的将下列代码加入工程,并在Keil设置中勾选Use MicroLib


  1. /* 

  2.  * microlib_printf.c 

  3.  * 

  4.  *  Created on: Dec 26, 2015 

  5.  *      Author: Yang 

  6.  *    

  7.  *    keil工程内勾选使用microlib时,重映射printf等输出函数的文件 

  8.  *    添加在工程内即可生效(注意:仅在使用microlib有效) 

  9.  */  

  10. #ifdef UART_PRINT  

  11. #include   

  12. //include "stm32f10x.h"    

  13.   

  14. //重映射fputc函数,此函数为多个输出函数的基础函数  

  15. int fputc(int ch, FILE *f)  

  16. {  

  17. //  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);    //修改此处的while循环条件  

  18. //  USART_SendData(USART1, (uint8_t) ch);                           //与寄存器,以修改输出端口  

  19.     return ch;  

  20. }  

  21. //输入函数,如上  

  22. int GetKey (void)    

  23. {   

  24. //  while (!(USART1->SR & USART_FLAG_RXNE));                  //如上  

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

  26. }  

  27. #endif  

                     


    • GCC环境 重映射

                   在GCC开源开发环境中,则可以调用nano_printf.c 等多种方式重映流函数输出端口


关键字:STM32  printf打印  串口数据

编辑:什么鱼 引用地址:http://www.eeworld.com.cn/mcu/article_2018061039728.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:在STM32中使用printf发送字符串到串口
下一篇:最后一页

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

网友正在学习IC视频

推荐阅读
全部
STM32
printf打印
串口数据

小广播

独家专题更多

东芝在线展会——芯科技智社会创未来
东芝在线展会——芯科技智社会创未来
2017东芝PCIM在线展会
2017东芝PCIM在线展会
TI车载信息娱乐系统的音视频解决方案
TI车载信息娱乐系统的音视频解决方案
汇总了TI汽车信息娱乐系统方案、优质音频解决方案、汽车娱乐系统和仪表盘参考设计相关的文档、视频等资源

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2018 EEWORLD.com.cn, Inc. All rights reserved