打印
[开发工具]

STM32无法用printf()的问题

[复制链接]
16041|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 | 只看该作者

路过下

使用特权

评论回复
5
香水城| | 2008-3-27 16:33 | 只看该作者

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

__io_putchar(int ch)函数就是最最底层的驱动。

使用特权

评论回复
6
sunshine98| | 2008-3-28 09:00 | 只看该作者

跟编译器有关

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

使用特权

评论回复
7
luxinsun| | 2008-3-28 18:19 | 只看该作者

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

我曾经成功解决了这个问题,我把答案发在qq群里面了。现在忘了怎么解决。以后还是把东西发到论坛上。好找啊。
我记得应该是printf()函数需要其他的函数支持,你少了一个支持printf()函数,所以出现了这种问题。

使用特权

评论回复
8
kewxke| | 2008-4-9 08:30 | 只看该作者

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

不知道你用的是什么编译器呢?

使用特权

评论回复
9
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));
}

使用特权

评论回复
10
heroxx| | 2010-6-21 16:42 | 只看该作者
如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“

使用特权

评论回复
评论
少先队员 2013-8-23 00:57 回复TA
哥哥,是你救了我啊,我从8点搞到现在,精神崩溃了N次,重建了N+1次工程都没弄好,你轻轻一句话就惊醒梦中人啊。 
评分
参与人数 2威望 +2 收起 理由
棋剪 + 1 很给力!
小铭 + 1 32个赞,解决问题!
11
txcy| | 2010-6-21 17:09 | 只看该作者
赞同跟编译器有关的说法

使用特权

评论回复
12
neaphy| | 2010-6-21 19:35 | 只看该作者
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf

使用特权

评论回复
13
dfsa| | 2010-6-22 09:43 | 只看该作者
那就是自己编写头文件了

使用特权

评论回复
14
haibianfeng| | 2010-8-27 16:39 | 只看该作者
10# heroxx

你说得非常正确啊

使用特权

评论回复
15
ilovezeno| | 2010-8-27 23:03 | 只看该作者
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
neaphy 发表于 2010-6-21 19:35

这样直接sprintf写到缓冲区,然后发送 似乎比直接用printf还要给力点阿 感觉这样不错啊

使用特权

评论回复
16
gaobq| | 2010-8-28 21:37 | 只看该作者
10楼提供的是最简单有效的方法。

使用特权

评论回复
17
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);   

}

使用特权

评论回复
18
行不改名| | 2010-8-29 10:50 | 只看该作者
用10楼的方法即可呀

使用特权

评论回复
19
jbb2013| | 2012-12-20 16:21 | 只看该作者
10楼牛B,刚开始程序死活进不了主函数,一勾即好

使用特权

评论回复
20
lskam| | 2013-7-1 12:33 | 只看该作者
这种函数还是自己写的好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

61

帖子

0

粉丝