主题 : 串口裸奔程序不发送数据,谢谢 复制链接 | 浏览器收藏 | 打印
小童鞋我今年32,开始学ARM,还请大家多多关照.有经验的多指导,没经验的也多捧场.谢谢.
级别: 新手上路
UID: 22161
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
贡献值: 0 点
综合积分: 42 分
注册时间: 2010-05-27
最后登录: 2011-07-04
楼主  发表于: 2010-06-12 08:12

 串口裸奔程序不发送数据,谢谢

搞了很久,就是发不出信息来,
不知道怎么回事情呢.他和led点灯程序融合在一起,结果,led灯正常,就是串口收不到数据.
苦恼.
请帮我看看,谢谢  
// 略去特殊寄存器地址定义

#define    GPB5_out    (1<<(5*2))
#define    GPB6_out    (1<<(6*2))
#define    GPB7_out    (1<<(7*2))
#define    GPB8_out    (1<<(8*2))


#define TXD0READY   (1<<2)
#define RXD0READY   (1)
#define PCLK            50000000    //init.c中的clock_init函数设置PCLK为50MHz
#define UART_CLK        PCLK        //UART0的时钟源设为PCLK
#define UART_BAUD_RATE  115200      //波特率定义
#define UART_BRD        ((UART_CLK  / (UART_BAUD_RATE * 16)) - 1)


#define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))
void init_uart0(void)
{
    GPHCON = 0x00faaa;
    GPHUP  = 0x7ff;    // The pull up function is disabled GPH[10:0]


    UFCON0  = 0x00;     //不使用FIFO
    UMCON0  = 0x00;     //不使用流控
    ULCON0  = 0x03;     //8N1(8个数据位、无较验、1个停止位)
    UCON0   = 0x245;     //查询方式,UART时钟源为PCLK
    UBRDIV0=( (int)(UART_CLK/16./UART_BAUD_RATE+0.5) -1 );

}
//发送一个字符
void putc(unsigned char c)
{
    //等待,直到发送缓冲区中的数据已经全部发送出去
    while (!(UTRSTAT0 & TXD0READY));
    //向UTXH0寄存器中写入数据,UART即自动将它发送出去
    UTXH0 = c;
}

void init_clock(void)
{
    CLKDIVN  = 0x03;            // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1

    /* 如果HDIVN非0,CPU的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */
__asm__(
    "mrc    p15, 0, r1, c1, c0, 0\n"        /* 读出控制寄存器 */
    "orr    r1, r1, #0xc0000000\n"          /* 设置为“asynchronous bus mode” */
    "mcr    p15, 0, r1, c1, c0, 0\n"        /* 写入控制寄存器 */
    );
    MPLLCON = S3C2410_MPLL_200MHZ;  /* 现在,FCLK=200MHz,HCLK=100MHz,PCLK=50MHz */
}

void  wait(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}

int main(void)
{
    unsigned long i = 0,j;

    GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;        // 将LED1-4对应的GPB5/6/7/8四个引脚设为输出
    init_clock();
    j = 16000;
    i=0;
    init_uart0();
    while (j) {
        j--;
        wait(128000);
        putc('h');
        putc('e');
        putc('l');
        putc('l');
        putc('o');
        GPBDAT = (~(1 << (5+i))); // 根据i的值,点亮LED1-4
        if (++i == 4)
            i = 0;
    }
    return 0;
}
老小子学ARM。
级别: 新手上路
UID: 15395
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2010-03-04
最后登录: 2010-11-25
1楼  发表于: 2010-06-21 16:21
void led_test(void)
  { unsigned int dat=0x61f,i=4;
  
    rGPBDAT&=dat;    
   while(i<9)
     {   rGPBDAT=0x7ff&(0x07<<i++);
         if(i>=9)
         i=4;
          delay_ms(90000);
     }
  }
//********************************
//
//   串口0
//
//*******************************
void uart_init(U32 t)
  {  rUFCON0=0X00;
     rULCON0=0X03;
     rUCON0=0x205;
     rUBRDIV0=( (int)(PCLK/16./t+0.5) -1 );
      rUFCON0=0X00;
     rULCON0=0X03;
     rUCON0=0x205;
     rUBRDIV0=( (int)(PCLK/16./t+0.5) -1 );
  }
  void uart_sendbye(unsigned int c)
   {    
    while(!(rUTRSTAT0&0x02));
          rUTXH0=c;  
   }
   void uart_string( char *ptr)
   {
      while(*ptr)
         uart_sendbye(*ptr++);      
   }
  
void  uart_printf(char *fmt,...)
  {
     va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
   uart_string(string);
    va_end(ap);
  }
级别: 新手上路
UID: 23769
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2010-06-25
最后登录: 2010-08-14
2楼  发表于: 2010-07-23 16:32
你把波特率调低了看看~~如