STM32的printf函数重定向

在前面学习了STM32的串口编程,通过USART1向计算机的串口调试助手打印数据,或者接收计算机串口调试助手的数据,接下来我们可以实现STM32工程上的printf()函数了,方便用于程序开发中调试信息的打印。

###1. 法1:使用MicroLIB库

####1.1 KEIL-MDK中的Use MicroLIB选项
在MDK开发环境中,
这里写图片描述

MicroLib是缺省c库的备选库,它可装入少量内存中,与嵌入式应用程序配合使用,且这些应用程序不在操作系统中运行。
MicroLib进行了高度优化以使代码变得很小,功能比缺省c库少,不具备某些ISO c特性,部分库函数的运行速度也比较慢,如内存拷贝函数memcpy()。
MicroLib与缺省c库之间的主要差异在网上有许多文章都有写到,这里摘抄记录:
(1)MicroLib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。
(2)MicroLib 不符合 IEEE 754 二进制浮点算法标准。
(3)MicroLib 进行了高度优化以使代码变得很小。
(4)无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。
(5)不能将 main() 声明为使用参数,并且不能返回内容。
(6)不支持 stdio,但未缓冲的 stdin、stdout 和 stderr 除外。
(7)MicroLib对 C99 函数提供有限的支持。
(8)MicroLib不支持操作系统函数

  • 58
    点赞
  • 268
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用STM32printf函数时,可以通过重定向来将其输出重定向串口或其他输出设备上。这样可以方便地在开发过程中通过串口输出调试信息。 首先,需要在代码中定义一个文件描述符,并重写该文件描述符的_write函数。在这个函数中,可以将要输出的字符通过串口发送出去。 以下是一个使用USART1作为串口输出的示例代码: ```c #include "stdio.h" // 重写文件描述符的 _write 函数 int _write(int file, char *ptr, int len) { for (int i = 0; i < len; i++) { // 将字符发送到串口 USART_SendData(USART1, (uint8_t) *ptr++); // 等待发送完毕 while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } return len; } int main(void) { // 初始化串口 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); // 使用printf输出 printf("Hello, world!\n"); while (1) { // 其他操作 } } ``` 在这个例子中,我们将USART1作为串口输出设备,并将printf函数的输出重定向到USART1。需要注意的是,在使用重定向后,printf函数会比较耗费资源,因此在实际应用中要谨慎使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值