[开发工具] STM32无法用printf()的问题

[复制链接]
17275|26
 楼主| wormchen 发表于 2008-3-27 15:21 | 显示全部楼层 |阅读模式
我在程序里应用printf("aa")来想串口发送字符串,可编译通过在仿真的时候老是进不到main()里,老是死在一个地方
https://bbs.21ic.com/upfiles/img/20083/2008327152050715.jpg
我把printf("aa")这就话去掉仿真就正常了,这是怎么回事啊!已经#include <stdio.h>
香水城 发表于 2008-3-27 15:27 | 显示全部楼层

你要根据说明修改相应的函数

ST有一个应用笔记中谈到过这个问题,我忘记是哪一个了,你先自己找一找吧。
kelewang 发表于 2008-3-27 15:40 | 显示全部楼层

fputc

是否修改了fputc函数
dld2 发表于 2008-3-27 15:41 | 显示全部楼层

路过下

香水城 发表于 2008-3-27 16:33 | 显示全部楼层

因为printf()涉及到硬件的操作,硬件环境不同当然底层驱动也

__io_putchar(int ch)函数就是最最底层的驱动。
sunshine98 发表于 2008-3-28 09:00 | 显示全部楼层

跟编译器有关

我也遇到这个问题了,不过我在原来的项目里已经解决这个问题了,但是在前天的建的新项目有出现这个问题了,也忘了怎么解决的。只是把所有的都屏蔽掉了。。
最早的时候用keil编译器时,我是重新写了一个简单的支持有限的printf()来解决这个问题。。楼主如果觉得够用,也可以考虑,不要把太多的精力浪费到这里。。
luxinsun 发表于 2008-3-28 18:19 | 显示全部楼层

我曾经成功解决了这个问题,我把答案发在qq群里面了

我曾经成功解决了这个问题,我把答案发在qq群里面了。现在忘了怎么解决。以后还是把东西发到论坛上。好找啊。
我记得应该是printf()函数需要其他的函数支持,你少了一个支持printf()函数,所以出现了这种问题。
kewxke 发表于 2008-4-9 08:30 | 显示全部楼层

难道是RV编译器环境下需要retarget.c文件

不知道你用的是什么编译器呢?
alien2006 发表于 2008-4-9 13:06 | 显示全部楼层

我把自己一直再用的函数库贴一下,希望对楼主有帮助

这个是我自己写的UART_INTERFACE.H头文件
/***************************************************************************************
*说明:用于STM32F10XXX串口UART1通讯,可以将printf scanf等重定向到串口
*环境:KEIL FOR ARM MDK3.11
*硬件:对应PA9-UART1TX PA10-UART1RX,使用USART1
*版本:V0.1
*作者:alien2006
*备注:对应的PA9/PA10以及USART1已由UART_Init函数自身初始化,无需在程序中完成
***************************************************************************************/
#ifndef __UART_INTERFACE_H
#define __UART_INTEFFACE_H

#include "stm32f10x_lib.h"
#include "stdio.h"

/*私有变量----------------------------------------------------------------------------*/


/*函数声明----------------------------------------------------------------------------*/
void UART_Init(unsigned long UART_baud); //波特率,如115200
int fputc(int ch, FILE *f);    //fputc重定向
int fgetc(FILE *f); //fgetc重定向


#endif

下面是.C的部分内容,省去了初始化的部分,自己看着写好了
/*******************************************************************************
* Function Name  : int fputc(int ch, FILE *f)
* Description    : Retargets the C library printf function to the USART.printf重定向
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int fputc(int ch, FILE *f)
{
  /* Write a character to the USART */
  USART_SendData(USART1, (u8) ch);

  /* Loop until the end of transmission */
  while(!(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == SET))
  {
  }

  return ch;
}

/*******************************************************************************
* Function Name  : int fgetc(FILE *f)
* Description    : Retargets the C library printf function to the USART.fgetc重定向
* Input          : None
* Output         : None
* Return         : 读取到的字符
*******************************************************************************/
int fgetc(FILE *f)
{
  /* Loop until received a char */
  while(!(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET))
  {
  }
  
    /* Read a character from the USART and RETURN */
  return (USART_ReceiveData(USART1));
}

heroxx 发表于 2010-6-21 16:42 | 显示全部楼层
如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“

评论

哥哥,是你救了我啊,我从8点搞到现在,精神崩溃了N次,重建了N+1次工程都没弄好,你轻轻一句话就惊醒梦中人啊。  发表于 2013-8-23 00:57

评分

参与人数 2威望 +2 收起 理由
棋剪 + 1 很给力!
小铭 + 1 32个赞,解决问题!

查看全部评分

txcy 发表于 2010-6-21 17:09 | 显示全部楼层
赞同跟编译器有关的说法
neaphy 发表于 2010-6-21 19:35 | 显示全部楼层
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
dfsa 发表于 2010-6-22 09:43 | 显示全部楼层
那就是自己编写头文件了
haibianfeng 发表于 2010-8-27 16:39 | 显示全部楼层
10# heroxx

你说得非常正确啊
ilovezeno 发表于 2010-8-27 23:03 | 显示全部楼层
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
neaphy 发表于 2010-6-21 19:35

这样直接sprintf写到缓冲区,然后发送 似乎比直接用printf还要给力点阿 感觉这样不错啊
gaobq 发表于 2010-8-28 21:37 | 显示全部楼层
10楼提供的是最简单有效的方法。
hgjinwei 发表于 2010-8-29 10:11 | 显示全部楼层
我曾今这样实现过,还能勉强使用。
int dprintf(const char *fmt,...)

{

    char   *buff;

    int     len;

        va_list ap;



    buff = allocMemBlock();

    if(NULL == buff)

        return(-1);




    va_start(ap,fmt);

    len = vsprintf(buff,fmt,ap);

    va_end(ap);



    if(0 != COM_ComSend(DEBUG_PORT_ID,len,buff))
{
        len = -1;

    }


    freeMemBlock(buff);

    return(len);   

}
行不改名 发表于 2010-8-29 10:50 | 显示全部楼层
用10楼的方法即可呀
jbb2013 发表于 2012-12-20 16:21 | 显示全部楼层
10楼牛B,刚开始程序死活进不了主函数,一勾即好
lskam 发表于 2013-7-1 12:33 | 显示全部楼层
这种函数还是自己写的好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

61

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部