分享

STM32中使用printf打印串口数据

 圆锥的布袋 2018-07-17

 STM32使用printf打印串口

  • 摘要

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

 

  • 实现原理

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

 

  • Keil环境 重映射

STM32Keil开发环境中,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. #include <stdio.h>
  11. //include "stm32f10x.h"
  12. #pragma import(__use_no_semihosting)
  13. //标准库需要的支持函数
  14. struct __FILE
  15. {
  16. int handle;
  17. };
  18. FILE __stdout;
  19. //定义_sys_exit()以避免使用半主机模式
  20. _sys_exit(int x)
  21. {
  22. x = x;
  23. }
  24. //重映射fputc函数,此函数为多个输出函数的基础函数
  25. int fputc(int ch, FILE *f)
  26. {
  27. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  28. USART_SendData(USART1, (uint8_t) ch);
  29. return ch;
  30. }
    • 使用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官网介绍 <http://www./arm/microlib.asp


基本就是说: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 <stdio.h>
  12. //include "stm32f10x.h"
  13. //重映射fputc函数,此函数为多个输出函数的基础函数
  14. int fputc(int ch, FILE *f)
  15. {
  16. // while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //修改此处的while循环条件
  17. // USART_SendData(USART1, (uint8_t) ch); //与寄存器,以修改输出端口
  18. return ch;
  19. }
  20. //输入函数,如上
  21. int GetKey (void)
  22. {
  23. // while (!(USART1->SR & USART_FLAG_RXNE)); //如上
  24. // return ((int)(USART1->DR & 0x1FF));
  25. }
  26. #endif
                     

    • GCC环境 重映射

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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多