为什么只要一加printf函数,程序就不能运行

[复制链接]
7048|12
 楼主| LIU_XF 发表于 2009-9-27 18:24 | 显示全部楼层 |阅读模式
想通过stdio.h中的Printf函数来打印程序中的变量

不加printf的时候程序能运行,加了printf函数程序就不跑了,中断也不能进,用仿真器查看,程序一直死在这,动不了

令人费解.....

不知大家有没有遇到过这种问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| LIU_XF 发表于 2009-9-27 18:26 | 显示全部楼层
单片机是STM32的,一个简单的中断LED程序

串口初始化了,直接操作串口发数据可以,用printf就不行
ningling_21 发表于 2009-9-27 19:24 | 显示全部楼层
程序在哪呢?
wjp2009 发表于 2009-9-27 19:58 | 显示全部楼层
O(∩_∩)O哈哈~,这个问题也困惑了我很久,不过我后来知道了其中的奥秘。建议你好好看看keil的例子
 楼主| LIU_XF 发表于 2009-9-27 20:12 | 显示全部楼层
楼上的兄弟说明白点啊
看哪个例子,为什么不把你的经验拿出来分享一下。
wjp2009 发表于 2009-9-27 20:40 | 显示全部楼层
keil里很多例子都有用到printf,注意在printf使用前有些设置,可能你遗漏了。
wjp2009 发表于 2009-9-27 20:47 | 显示全部楼层
printf相当于查询方式,发送数据量大的话,最好不要用。我一般在打印票据时才用,因为好排版。
wjp2009 发表于 2009-9-27 20:50 | 显示全部楼层
有关keil的问题,建议到keil 的网站去,先search一下,不行再post question。一般都能得到满意的答复。
 楼主| LIU_XF 发表于 2009-9-28 08:26 | 显示全部楼层
呵呵,问题解决

少写了一个函数,fputc

加上就好了,printf在调用的时候,要将字符输出到串口终端,还要调用fputc才能完成字符的输出

函数如下:
/*******************************************************************************
* Function Name  : fputc
* Description    : Retargets the C library printf function to the USART.
* Input          : None
* Output         : None
* Return         : None
***************************************************************************** **/
int fputc(int ch, FILE *f)
{
  // Place your implementation of fputc here  
  //e.g. write a character to the USART  
  USART1->DR.W = ((u16)ch & (u16)0x01FF);

  ///Loop until the end of transmission  
  while(USART1->SR.B.TC==0);       
  return ch;
}
 楼主| LIU_XF 发表于 2009-9-28 08:27 | 显示全部楼层
感谢wjp2009兄热心的回复,呵呵
 楼主| LIU_XF 发表于 2009-9-28 08:31 | 显示全部楼层
发上STM32的串口程序,供大家学习

usart1.c   

在程序调试的时候,用printf来打印程序中的变量,监测程序的运行很不错

/****************************************************************
      
    程 序 名:stm32_usart1.c
    作    者:liu_xf
    版 本 号:V1.00
    建立日期:
    修改日期:   
    编译环境:
    硬件平台:
    功能描述:
   
              

***************************************************************/


#include "com.h"
#include "usart1.h"
#include "stdio.h"

/********************************************************************
函数功能:串口1初始化
入口参数:无
返    回:无。
备    注:
********************************************************************/
void Usart1_Init(void)
{
        u32 USART_BaudRate=9600;  //要设定的波特率
        u32 PCLK2_Freq=72000000;             //PCLK2的频率
        u32 tmpreg = 0x00;
    u32 integerdivider = 0x00;
    u32 fractionaldivider = 0x00;
   
        //打开USART1时钟 ------------------------------------
           RCC->APB2ENR.B.USART1EN=1;

        //IO配制----------------------------------------
        //Configure USART1 Tx (PA.09) as alternate function push-pull
        GPIOA->CRH.B.MODE9 = 2;  //2M
    GPIOA->CRH.B.CNF9 =  2;  //复用推挽输出       
   
    //Configure USART1 Rx (PA.10) as input floating
        GPIOA->CRH.B.MODE10 = 0;  //输入
    GPIOA->CRH.B.CNF10 =  1;  //浮空       
          //end------------------------------------------------

        //串口配制 -------------------------------------
        USART1->CR2.B.STOP=0;  //1位停止位
        USART1->CR1.B.M=0;  //1个超始位,8个数据位
        USART1->CR1.B.PS=0;  //偶校验
        USART1->CR1.B.TE=1;  //发送使能
        USART1->CR1.B.RE=1;  //接收使能

        USART1->CR3.B.RTSE=0;  //RTS硬件流控制被禁止
        USART1->CR3.B.CTSE=0;  //CTS硬件流控制被禁止

        //波特率设置
        //Determine the integer part
    integerdivider = ((0x19 * PCLK2_Freq) / (0x04 * (USART_BaudRate)));
    tmpreg = (integerdivider / 0x64) << 0x04;

    //Determine the fractional part
    fractionaldivider = integerdivider - (0x64 * (tmpreg >> 0x04));
    tmpreg |= ((((fractionaldivider * 0x10) + 0x32) / 0x64)) & ((u8)0x0F);

    // Write to USART BRR
    USART1->BRR.W = (u16)tmpreg;

        //end-------------------------------------------

    USART1->CR1.B.UE        =1 ;  //USART1模块使能
       
        printf("\r\n Usart1 OK! \r\n");   
}

/*******************************************************************************
* Function Name  : fputc
* Description    : Retargets the C library printf function to the USART.
* Input          : None
* Output         : None
* Return         : None
***************************************************************************** **/
int fputc(int ch, FILE *f)
{
  // Place your implementation of fputc here  
  //e.g. write a character to the USART  
  USART1->DR.W = ((u16)ch & (u16)0x01FF);

  ///Loop until the end of transmission  
  while(USART1->SR.B.TC==0);         //等待发送完成

  return ch;
}

/********************************************************************
函数功能:串口1发送数据
入口参数:DatBuf:要发送的数据缓存区。         len:要发送的数据长度
返    回:无。
备    注:
********************************************************************/
void Usart1_SendData(u8 *DatBuf, u32 len)
{
  u32 i;
  for(i=0;i<len;i++)
  {
           while(USART1->SR.B.TC==0);         //等待发送完成
           USART1->DR.W = ((u16)DatBuf[i] & (u16)0x01FF);         
  }

}
古道热肠 发表于 2009-9-28 11:15 | 显示全部楼层
哈哈,解决就好,俺也喜欢用这函数.
icecut 发表于 2009-9-28 11:45 | 显示全部楼层
恩.lz很热心
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:无

68

主题

372

帖子

3

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