打印

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

[复制链接]
5412|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
LIU_XF|  楼主 | 2009-9-27 18:24 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
沙发
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的例子

使用特权

评论回复
5
LIU_XF|  楼主 | 2009-9-27 20:12 | 只看该作者
楼上的兄弟说明白点啊
看哪个例子,为什么不把你的经验拿出来分享一下。

使用特权

评论回复
6
wjp2009| | 2009-9-27 20:40 | 只看该作者
keil里很多例子都有用到printf,注意在printf使用前有些设置,可能你遗漏了。

使用特权

评论回复
7
wjp2009| | 2009-9-27 20:47 | 只看该作者
printf相当于查询方式,发送数据量大的话,最好不要用。我一般在打印票据时才用,因为好排版。

使用特权

评论回复
8
wjp2009| | 2009-9-27 20:50 | 只看该作者
有关keil的问题,建议到keil 的网站去,先search一下,不行再post question。一般都能得到满意的答复。

使用特权

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

使用特权

评论回复
10
LIU_XF|  楼主 | 2009-9-28 08:27 | 只看该作者
感谢wjp2009兄热心的回复,呵呵

使用特权

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

}

使用特权

评论回复
12
古道热肠| | 2009-9-28 11:15 | 只看该作者
哈哈,解决就好,俺也喜欢用这函数.

使用特权

评论回复
13
icecut| | 2009-9-28 11:45 | 只看该作者
恩.lz很热心

使用特权

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

本版积分规则

个人签名:无

68

主题

372

帖子

3

粉丝