STM32无法用printf()的问题

ppm009   2008-3-27 15:21 楼主
我在程序里应用printf("aa")来想串口发送字符串,可编译通过在仿真的时候老是进不到main()里,老是死在一个地方
https://bbs.eeworld.com.cn/upfiles/img/20083/2008327152050715.jpg
我把printf("aa")这就话去掉仿真就正常了,这是怎么回事啊!已经#include <stdio.h>

回复评论 (23)

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

                                 ST有一个应用笔记中谈到过这个问题,我忘记是哪一个了,你先自己找一找吧。
点赞  2008-3-27 15:27

fputc

                                 是否修改了fputc函数
点赞  2008-3-27 15:40

路过下

                                  
点赞  2008-3-27 15:41

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

                                 __io_putchar(int ch)函数就是最最底层的驱动。
点赞  2008-3-27 16:33

跟编译器有关

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

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

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

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

                                 不知道你用的是什么编译器呢?
点赞  2008-4-9 08:30

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

这个是我自己写的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));
}

点赞  2008-4-9 13:06
                                 如果使用的是MDK,请在工程属性的“Target“-》”Code Generation“中勾选”Use MicroLIB“
点赞  2010-6-21 16:42
                                 赞同跟编译器有关的说法
点赞  2010-6-21 17:09
                                 我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
点赞  2010-6-21 19:35
                                 那就是自己编写头文件了
点赞  2010-6-22 09:43


你说得非常正确啊
点赞  2010-8-27 16:39
我一般都是自己写printf函数,然后用标准sprintf来格式化,可以完全实现标准printf
这样直接sprintf写到缓冲区,然后发送 似乎比直接用printf还要给力点阿 感觉这样不错啊
点赞  2010-8-27 23:03
                                 10楼提供的是最简单有效的方法。
点赞  2010-8-28 21:37
我曾今这样实现过,还能勉强使用。
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:11
                                 用10楼的方法即可呀
点赞  2010-8-29 10:50
10楼给力啊
点赞  2011-10-2 08:56
点赞  2012-3-21 19:48
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复