Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231148
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 493
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-26 17:46
个人简介

做技术要:鹰击长空,鱼翔浅底。

文章分类

全部博文(59)

文章存档

2017年(1)

2016年(3)

2015年(27)

2014年(28)

分类: 嵌入式

2015-09-10 15:39:45

        本人在GD32F103上实现printf的时候,遇到一个问题是仿真时可以打印信息,
但是下载运行时始终没有打印信息。百度得出:

1:标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.

下面是串口输出的重定向:
1)包含printf 的头文件
#include  <stdio.h>
2)PUTCHAR_PROTOTYPE  将要替换的函数
#ifdef __GNUC__
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
这里没有定义__GNUC__ 所以实现的是int fputc(int ch, FILE *f)这个函数。
3)重新实现 PUTCHAR_PROTOTYPE 函数。
PUTCHAR_PROTOTYPE
{
  uart1.putc(ch);
// while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
// USART_SendData(USART1, ch);
return ch;
}

4)因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行,以下是解决方法:
    
方法1.使用微库,因为使用微库的话,不会使用半主机模式

.

方法2.仍然使用标准库,在主程序添加下面代码:
#pragma import(__use_no_semihosting) 
 _sys_exit(int x) 
{ 
x = x; 
} 
 struct __FILE 
{ 
int handle; 



}; 
可以简化为:
#pragma import(__use_no_semihosting) 
/****************************************************************************** 
*标准库需要的支持函数 
******************************************************************************/ 
struct __FILE 
{ 
int handle; 
/* Whatever you require here. If the only file you are using is */ 
/* standard output using printf() for debugging, no file handling */ 
/* is required. */ 
}; 
/* FILE is typedef’ d in stdio.h. */ 
FILE __stdout; 


/// <summary> 
/// 定义_sys_exit()以避免使用半主机模式 
/// </summary> 
/// <param name="x"></param> 
/// <returns></returns> 
_sys_exit(int x) 
{ 
x = x; 
} 


int fputc(int ch, FILE *f)
{
    //USART_SendData(USART1, (u8) ch);
    USART1->DR = (u8) ch;
    
    /* Loop until the end of transmission */
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
    {
    }


    return ch;
}
 

阅读(4212) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~