×
单片机 > 单片机程序设计 > 详情

STM32 printf 重定向问题

发布时间:2020-05-18 发布时间:
|

1、declaration conflicts with target of using declaration already in scope


不能使用.cpp文件,若要使用printf重定向,那就使用.c 文件


解决方法:


1、在main文件中包含 “stdio.h” 文件


2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中


在文件中输入如下内容(直接复制即可)


#include


#include


#pragma import(__use_no_semihosting_swi)


extern int  SendChar(int ch); // 声明外部函数,在main文件中定义


extern int  GetKey(void);


struct __FILE {


  int handle;                 // Add whatever you need here 


};


FILE __stdout;


FILE __stdin;


int fputc(int ch, FILE *f) {


  return (SendChar(ch));


}


int fgetc(FILE *f) {


  return (SendChar(GetKey()));


}


void _ttywrch(int ch) {


 SendChar (ch);


}


int ferror(FILE *f) {                            // Your implementation of ferror


  return EOF;


}


void _sys_exit(int return_code) {


label:  goto label;           // endless loop


}


 


3、在main文件中添加定义以下两个函数


int SendChar (int ch)  {


  while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口


  USART1->DR = (ch & 0x1FF);


  return (ch);


}


int GetKey (void)  {


  while (!(USART1->SR & USART_FLAG_RXNE));


  return ((int)(USART1->DR & 0x1FF));


}




另外一种配置方法(非解决方法)


1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。


2、在main文件中重定义


   // 发送数据


   int fputc(int ch, FILE *f)


   {


      USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等


      while (!(USART1->SR & USART_FLAG_TXE));


      return (ch);


   }


   // 接收数据


   int GetKey (void)  { 


      while (!(USART1->SR & USART_FLAG_RXNE));


      return ((int)(USART1->DR & 0x1FF));


   }


   这样在使用printf时就会调用自定义的fputc函数,来发送字符。


3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"” 


   MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录