前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >stm32开发过程中printf重定向问题(基于Platform IO)

stm32开发过程中printf重定向问题(基于Platform IO)

作者头像
iot-me.club
发布2022-02-11 11:14:52
1.4K0
发布2022-02-11 11:14:52
举报
文章被收录于专栏:iot-meiot-me

问题发现

在platform io中开发stm32g0系列芯片的串口通信程序,想使用printf函数,根据传统的方法重定义fputc函数,串口中没有输出。但是用keil同样的代码是可以输出的。

问题分析

根据传统的方法要使用printf函数,只需重定义fputc函数就可以了,如下:

代码语言:javascript
复制
#include "stdio.h"

#ifdef __GNUC__            //gcc编译器宏定义
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
 set to 'Yes') calls __io_putchar() */
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else

		#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif 

PUTCHAR_PROTOTYPE
{
  HAL_UART_Transmit(&hlpuart1,(uint8_t *)&ch,1,0xFFFF);
  return ch;
}

该方法在keil arm-mdk中能够实现的。但是到了platformio就不行了 应该是keil用的编译器编译资源跟platformio用的是不一样的。 爬了几天论坛发现有相似的问题,链接在下面 解决方案,论坛链接

接着干脆也写了个syscalls.c

重写_write函数

代码语言:javascript
复制
//syscalls.c文件

#include "main.h"
#include "usart.h"
#include  <errno.h>
#include  <sys/unistd.h> // STDOUT_FILENO, STDERR_FILENO


int _write(int file, char *data, int len)
{
   if ((file != STDOUT_FILENO) && (file != STDERR_FILENO))
   {
      errno = EBADF;
      return -1;
   }

   // arbitrary timeout 1000
   HAL_StatusTypeDef status =
      HAL_UART_Transmit(&hlpuart1, (uint8_t*)data, len, 1000);

   // return # of bytes written - as best we can tell
   return (status == HAL_OK ? len : 0);
}

这个_writre()函数是弱定义的,所以用户可以直接定义它

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年04月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题发现
    • 问题分析
      • 重写_write函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档