历史上的今天
今天是:2024年10月13日(星期日)
2021年10月13日 | STM32中使用printf打印串口数据
2021-10-13 来源:eefocus
摘要
该方法适用于STM32,实现了使用printf等标准C流函数输出数据的办法,极大的减少了输出串口数据时所需要做的数据处理。
实现原理
在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。
Keil环境 重映射
在STM32的Keil开发环境中,C的库函数有两种实现方式
使用标准的C函数库
就是我们平常在PC Window平台上用的C库函数,此库的的优点在于实现的功能全面。但是由于这个库基本上是专为PC设计的,故而如果在嵌入式芯片中调用时将会使得工程文件变得十分庞大。
将下列代码加入工程,无需使用#include调用即可生效。
/*
* libc_printf.c
*
* Created on: Dec 26, 2015
* Author: Yang
*
* 使用标准C库时,重映射printf等输出函数的文件
* 添加在工程内即可生效(切勿选择semihost功能)
*/
#include //include "stm32f10x.h" #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重映射fputc函数,此函数为多个输出函数的基础函数 int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); USART_SendData(USART1, (uint8_t) ch); return ch; } 使用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.keil.com/arm/microlib.asp > 基本就是说:Microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。 同样的将下列代码加入工程,并在Keil设置中勾选Use MicroLib /* * microlib_printf.c * * Created on: Dec 26, 2015 * Author: Yang * * keil工程内勾选使用microlib时,重映射printf等输出函数的文件 * 添加在工程内即可生效(注意:仅在使用microlib有效) */ #ifdef UART_PRINT #include //include "stm32f10x.h" //重映射fputc函数,此函数为多个输出函数的基础函数 int fputc(int ch, FILE *f) { // while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //修改此处的while循环条件 // USART_SendData(USART1, (uint8_t) ch); //与寄存器,以修改输出端口 return ch; } //输入函数,如上 int GetKey (void) { // while (!(USART1->SR & USART_FLAG_RXNE)); //如上 // return ((int)(USART1->DR & 0x1FF)); } #endif GCC环境 重映射 在GCC开源开发环境中,则可以调用nano_printf.c 等多种方式重映流函数输出端口

下一篇:STM32 串口详细讲解
史海拾趣
|
作者:gooogleman 刚才一觉醒来,我就淘宝了一番,分析各家2440开发板的性价比。 首先抛弃那些土枪开发板,太低价格没有啥保障因素的。 从500~800的开发板,搜索一下,发现友善,飞凌,天嵌,占据了90% ...… 查看全部问答> |
|
有研究tcpmp的么?想请教一下里面顶部的那个播放/暂停控件的位置在那修改? 有研究tcpmp的么?想请教一下里面顶部的那个播放/暂停控件的位置在那修改?我想把file,options,和播放,暂停,还有全屏等控件放在底部,就是那个时间进度条那....可是找不到具体代码的位置... 另外那个控件的大小只能是16和32两种相素选择,能不能改大一 ...… 查看全部问答> |
|
我今年大四就快出去找工作了,想问问各位有经验的大姐,大哥们,哪些公司在FPGA方面有比较好的前景啊?还有如果可以的话能否说说去应聘FPGA工作时的面试和笔试经历或者遇到的一些试题,让我汲取一些你们宝贵 ...… 查看全部问答> |
|
Buffersize 具体指代缓冲区的大小(多少字节大小的缓冲区)还是缓冲区的数目(多少个指定宽度(DMA_PeripheralDataSize 或DMA_MemoryDataSize)的缓冲区)呢? 手册中给出: Specifies the buffer size, in data unit, of the specified Cha ...… 查看全部问答> |
|
如图所示,左端经过电阻分压,然后经过电压跟随器和光耦后接PA0,但是采集的电压和计算的不同,而且采集的电压用于程序里也没有达到预想的效果,求用过的好心人给看看,谢谢。… 查看全部问答> |




