历史上的今天
返回首页

历史上的今天

今天是:2025年06月10日(星期二)

正在发生

2018年06月10日 | STM32中使用printf打印串口数据

2018-06-10 来源:eefocus

该方法适用于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 等多种方式重映流函数输出端口


推荐阅读

史海拾趣

EM Microelectronic-Marin SA公司的发展小趣事

进入1980年代,随着技术的不断进步,ASIC(应用特定集成电路)技术开始兴起。1982年,Mikron Integrated Microelectronics(EM Microelectronic-Marin的前身之一)开始了ASIC技术的研究,并在随后的几年中取得了显著成果。1987年,其奥地利分公司开始专注于识别和智能卡芯片的开发,这一领域的成功为公司带来了新的增长点。

ENTRELECUK公司的发展小趣事

随着业务的不断发展,ENTRELEC UK开始寻求全球市场的拓展。公司通过与国外代理商建立合作关系,将产品销往世界各地。同时,公司还在海外设立研发中心和生产基地,以便更好地了解当地市场需求,提供定制化的解决方案。这些举措使ENTRELEC UK在全球电子行业中树立了良好的品牌形象。

广州基安彼(GMB)公司的发展小趣事

在电子行业中,绿色环保和可持续发展已成为重要的议题。ENTRELEC UK积极响应这一趋势,致力于研发和生产环保型产品。公司采用环保材料和节能技术,降低产品对环境的影响。同时,公司还积极参与环保公益活动,推动行业的可持续发展。

Design Gateway公司的发展小趣事

1985年,泰德·维特(Ted Waitt)和Mike Hammond两位年轻人决定辍学创业。他们利用维特祖母的15,000美元存款作为担保,从银行获得了10,000美元贷款,租用了一台计算机,并准备了一份三页的经营计划。在维特父亲位于爱荷华州苏城的牧场里,他们创办了TIPC Network公司(Gateway的前身)。公司起步时,主要向得克萨斯电脑器械公司销售零配件,并开展计算机邮购业务。得益于直销商业模式,Gateway在短短四个月内就实现了10万美元的销售额。

ETC1公司的发展小趣事

金溢科技是国内ETC行业的领军企业之一。公司自创立之初,就致力于ETC技术的研发与应用。通过不断的技术创新,金溢科技成功推出了多款具有自主知识产权的ETC设备,并在市场中获得了广泛应用。同时,公司还积极参与国家标准的制定和修订工作,推动ETC行业的规范化发展。金溢科技凭借其在ETC领域的卓越表现,逐渐成为了行业的标杆企业。

创世(CS)公司的发展小趣事

创世公司在SD NAND存储产品的研发过程中,不断突破技术壁垒,实现了产品的创新。例如,2018年,为满足轨道交通、航空航天、工业控制等行业类客户对存储产品的特殊需求,创世公司首家推出了第二代SD NAND产品。这一产品不仅具有更快的读写速度和更宽泛的使用环境,还能承受高低温冷热冲击、随机掉电等苛刻的操作环境。同时,创世公司还为客户提供个性化的固件定制服务,进一步满足了客户的个性化需求。

问答坊 | AI 解惑

请问高手们,eeprom的读写次数是否可以想办法查到?

请问高手们,eeprom的读写次数是否可以想办法查到? 多谢~!…

查看全部问答>

PB生成的CE镜像NK.nb0如何写到Flash里?

大家好 我一直用DNW软件通过串口烧写nk.nbo,这样每次都要擦写Flash,我不知道Flash能擦写多少次,总觉得这样不方便 大家都是如何烧写的呢?是不是都烧写nk.nb0呢?…

查看全部问答>

ad9640使用

请问有人用过AD9640吗,他的时钟输入应该怎么 设计啊,采用什么样的时钟发生比较好啊…

查看全部问答>

高手进:手控机换程序后烧读卡模块

我们的水控机用以前的程序没出过问题,后来改成我的程序后,就另接了三根线,二个电源线,另一个线接的外部脉冲信号线,用来采集外界的脉冲信号数量,换了程序后,有时经常烧毁读卡蕊片,不知道为什么,电源没有问题,读卡蕊片以前也没出现在烧毁的情况,不知 ...…

查看全部问答>

求助网页如何加载到LM3S8962芯片里

使用的TI送的板子,跑了enet_io这个例程,不知道如何实现将网页加载到芯片,在查了相关资料后了解到写好的网页文件可以通过FCARM.EXE将.htm文件转换为.C文件,将.c文件添加到工程后不知道如何调用,希望达人给予知道,谢谢 参考帖子: https://bb ...…

查看全部问答>

STC12C5A60S2系列单片机的低压检测疑问

我写的低压检测程序如下(用的是STC12LE5A48S2,P4.6是低压检测口) void main() { P4SW=0xBF;//设置P4.6为低压检测口 EA=1;开总中断 ELVD=1;//开低压检测中断 void LVD_ROUTINE (void) interrupt 6 {       &n ...…

查看全部问答>

怎么样调整RCC线路中的频率占空比

怎么样调整RCC线路中的频率占空比?谢谢大家的指教,万分感谢…

查看全部问答>

怎么选择电容

如果是用RC做信号发生器的时基,那用什么样的电容(100PF)稳定性好?…

查看全部问答>

新手请教:AVR如何仿真

新入手AVR,请教一下,仿真的时候是不是PC上运行sdudio,电脑上联接一个叫mega16下载/仿真器的(逃宝上50块买来的,有块m16的芯片,一头是USB接电脑,一头带JTAG口),把JTAG口插到目标板,是这样吗? 这样的话就是要在每个设计的目标板上联一个JTAG ...…

查看全部问答>