STM32中使用printf打印串口数据

STM32使用printf打印串口

  • 摘要

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

 

  • 实现原理

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

 

  • Keil环境 重映射

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

    •  使用标准的C函数库

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


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

/*
 * libc_printf.c
 *
 *  Created on: Dec 26, 2015
 *      Author: Yang
 *
 *		使用标准C库时,重映射printf等输出函数的文件
 *    添加在工程内即可生效(切勿选择semihost功能)
 */

#include <stdio.h>
//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 <stdio.h>
//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 等多种方式重映流函数输出端口


  • 23
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于如何在 STM32 使用 printf 函数进行串口输出,通常需要进行以下步骤: 1. 确定要使用的 USART 端口和波特率 2. 在代码配置 USART,并初始化时钟 3. 配置 printf 函数,使其将数据发送到 USART 端口 以下代码可以作为一个简单的示例来实现这一过程: ``` #include "stm32f4xx.h" #include <stdio.h> // 定义使用的 USART 端口 #define USART_PORT USART2 // 定义要使用的波特率 #define USART_BAUD 115200 int main(void) { // 启用 GPIOA 和 USART2 的时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 配置 USART 引脚 GPIO_InitTypeDef gpioInit; gpioInit.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; gpioInit.GPIO_Mode = GPIO_Mode_AF; gpioInit.GPIO_Speed = GPIO_Speed_50MHz; gpioInit.GPIO_OType = GPIO_OType_PP; gpioInit.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &gpioInit); // 配置 USART 应用 USART_InitTypeDef usartInit; usartInit.USART_BaudRate = USART_BAUD; usartInit.USART_WordLength = USART_WordLength_8b; usartInit.USART_StopBits = USART_StopBits_1; usartInit.USART_Parity = USART_Parity_No; usartInit.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART_PORT, &usartInit); // 配置 printf 函数 USART_Cmd(USART_PORT, ENABLE); setvbuf(stdout, NULL, _IONBF, 0); setvbuf(stderr, NULL, _IONBF, 0); printf("Hello, world!\n"); while (1) { // 代码运行,可以向 printf 函数传入需要输出的内容 } } ``` 此时,当代码运行时,使用 printf 函数输出的内容将通过 USART 端口进行发送。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值