QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2877|回复: 0

4510下的UART的问题

[复制链接]
发表于 2007-11-17 01:31:08 | 显示全部楼层 |阅读模式
大家帮帮忙,我在4510下写了一个用UART口来实现printf的功能的函数,可是不知道为什么总是在红色的那一行上循环,总是检测不到可写状态。我看了半天4510的手册,可是还是没有搞懂。望大家指点。下面是代码
/*
* Serial settings.......................
*/

#ifndef SYSCFG
#define SYSCFG      0x03FF0000
#endif

#define UART0_BASE (SYSCFG + 0xD000)

/* add 19200 for test uue */
#define BAUD_19200 (80 << 4)

#define ULCON 0x00
#define UCON 0x04
#define USTAT 0x08
#define UTXBUF 0x0C
#define URXBUF 0x10
#define UBRDIV 0x14

/*
* Line control register bits............
*/

#define ULCR8bits (3)

/*
* UART Control Register bits............
*/

#define  UCRRxM (1)
#define  UCRRxSI (1 << 2)
#define  UCRTxM (1 << 3)
#define  UCRLPB (1 << 7)

/*
* UART Status Register bits
*/

#define USRTxHoldEmpty  (1 << 6)
#define USRTxEmpty      (1 << 7)


// UART registers are on word aligned, D8

/* UART primitives */
#define GET_STATUS(p)  (*(volatile unsigned  *)((p) + USTAT))
#define RX_DATA(s)        ((s) & USRRxData)
#define GET_CHAR(p)      (*(volatile unsigned  *)((p) + URXBUF))
#define TX_READY(s)      ((s) & USRTxHoldEmpty)
#define PUT_CHAR(p,c)   (*(unsigned  *)((p) + UTXBUF) = (unsigned )(c))

void uart_init( unsigned int UART_BASE, unsigned int baud )
{
   /* Disable interrupts  */
   *(volatile unsigned *) (UART_BASE + UCON) = 0;
   /* Set port for 8 bit, one stop, no parity  */
   *(volatile unsigned *) (UART_BASE + ULCON) = (ULCR8bits);
   /* Enable interrupt operation on UART */
   *(volatile unsigned *) (UART_BASE + UCON) = UCRRxM | UCRTxM;
   /* Set baud rate  */
   *(volatile unsigned *) (UART_BASE + UBRDIV) = baud;
}

int uart_putchar( unsigned int UART_BASE, char ch )
{
/* read tx ready flag, when =1 break */
while(  TX_READY( GET_STATUS( UART_BASE ) ) ==0 );

PUT_CHAR(UART_BASE, ch);

return ch;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-23 16:18 , Processed in 0.058174 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表