对于stm32中printf函数的移植方法

一、准备工作

使用printf之前需要先打开工程选项,把use microLIB选项打开。microlib是keil为嵌入式平台优化的一个精简库,本文使用到的printf将会用到这个microlib。

二、对printf进行重定向

        将printf打印的东西输出到串口,由于printf默认输出到屏幕,但是单片机没有屏幕,所以要进行重定向。

        1.在串口的c文件里加上#include<stdio.h>

        2.在后面重写fputc函数

int fputc(int ch, FILE *f)	//参数按此配置即可,
{	
	//将fputc重定向到串口
	Serial_sendByte(ch);	
	return ch;	
}

        3.fputc和printf之间的联系

        fputc是printf的底层,printf函数在打印的时候,就是不断调用fputc一个一个打印的。我们把fputc重定向到串口,那么printf自然就输出到串口。

        4.main函数中调用

        经过上面的步骤,printf已经移植完成。在主函数输入下面内容

#include "stm32f10x.h"                  
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"

int main()
{
	OLED_Init();
	
	Serial_Init();
	
	printf("date:%d\r\n",20240312);
	while(1)
	{

	}
}

        程序烧录后,单片机将会直接在串口输出        date:20240312        这行内容,并自动进行换行处理(\r\n)。

三、多串口使用printf

        使用sprintf,sprintf可以把格式化字符输出到一个字符串里面。

	char string[100];
	sprintf(string,"date:%d\r\n",2024031266);
	Serial_SendString(string);	//把字符串string通过串口发送出去
	//因为sprintf可以指定打印位置,不涉及重定向的东西,所以每个串口都可以使用sprintf进行格式化打印
	

四、封装sprintf

        由于printf这类函数比较特殊,支持可变参数。

首先在串口的头文件里添加#include<stdarg.h>,然后在最末尾处对printf函数进行封装。

void Serial_printf(char *format,...) //第一个参数用来接收格式化字符串 三个点用来接收可变参数列表
{
	char string[100];
	va_list arg;	//定义一个参数列表变量 va_list是类型名 arg是变量名
	va_start(arg,format);	//	从format位置开始接收参数表,放在arg里面
	vsprintf(string,format,arg);
	//这里的sprintf要改成vsprintf 前者只能接收直接写的参数 对于封装格式要用vsprintf
	va_end(arg);//释放参数表
	Serial_SendString(string);//把string发送出去
}

在main部分进行调用

Serial_printf("date:%d\r\n",20240312);

 输出结果如下

五、printf显示汉字的方法

        在keil里面我们选择的汉字编码格式是utf8,所以发送到串口的时候汉字会以utf8的方式编码。在串口助手也得选择utf8才能解码正确,为了防止写入中文的时候编译器报错,需要先在小魔术棒里面的c/c++处输入下述参数。(这个步骤是针对于使用utf8的用户)

        

--no-multibyte-chars

        由于我编译器使用的是GB2312编码,所以串口助手处要使用GBK解码。如图,正确解码得到“你好,世界”,中间的乱码部分是因为我选择了UTF8进行解码。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32 HAL库是STMicroelectronics公司提供的一种软件抽象层,用于简化STM32系列微控制器的编程和开发。它提供了一系列的API,可以方便地访问STM32微控制器的外设,如GPIO、UART、SPI、I2C、定时器等。而标准库则是由C语言标准提供的一组库函数,用于对不同的硬件平台进行抽象和封装,提供一些常用的函数,如memcpy()、memset()、printf()等。 将STM32 HAL库移植到标准库,需要先了解两者的差异和共同点,然后进行逐个函数的替换和调试。 1. 差异: STM32 HAL库是针对STM32系列微控制器设计的,提供了非常丰富和方便的API,但是也存在以下一些问题: - 耗用的ROM和RAM资源较大,不适合一些资源受限的应用场景; - 由于API过于丰富和复杂,容易导致代码臃肿和难以维护; - 由于HAL库是由STMicroelectronics公司提供的,所以在一些商业项目可能存在授权和版权问题。 而标准库则是基于C语言标准提供的,具有以下一些优点: - 软件资源占用较小,适合资源受限的应用场景; - 由于是标准库,所以不会涉及授权和版权问题; - 软件架构简单,易于维护和移植。 2. 共同点: STM32 HAL库和标准库都提供了一些常用的函数,如GPIO控制、定时器控制、串口通信等。这些函数在使用方法和参数上存在一些差异,但是功能是相同的。因此,移植的过程,可以逐个函数进行替换和调试。 移植的具体步骤如下: 1. 了解STM32 HAL库和标准库的API,确定需要替换的函数。 2. 根据需要,修改工程的编译选项,将HAL库的头文件和库文件从工程删除。 3. 修改代码函数调用,将HAL库的函数替换为标准库的函数。例如,将HAL_GPIO_WritePin()替换为GPIO_WritePin()。 4. 修改函数调用的参数,确保函数参数的类型和数量与标准库的要求相符。例如,将HAL_GPIO_Init()的参数修改为GPIO_Init()的参数。 5. 编译、调试,直到程序能够正常运行。 需要注意的是,由于两种库的API存在一些差异,移植过程需要对代码进行一定的修改和调试。如果不是很熟悉STM32 HAL库和标准库的使用方法,建议先学习官方文档和示例程序,再进行移植工作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值