基础信息介绍
- ls1c102中有三个UART控制器
- UART0和UART1是使用的主时钟频率,且引脚复用都是主功能
- UART2使用的32KHz的时钟,在使用内部时钟时可能会因为时钟不准确导致乱码,建议使用外部32KHz晶振,引脚需要修改复用
- 三个UART寄存器的基地址分别为:0xbfe80000、0xbfe88000和0xbfe8c000
配置寄存器
配置寄存器基于基地址的偏移分别为:
- 0x00:DAT/DL_L(数据寄存器/分频值地字节寄存器该寄存器是一个复用寄存器,由LCR寄存器掩码为0x80的位控制;数据寄存器读取的时候是获取接收FIFO中的数据,写入时是写入到发送FIFO中,即接收数据和发送数据复用一个地址)
- 0x01:IER/DL_H(中断使能寄存器/分配值高字节寄存器,同0x00寄存器一样是复用的空间)
- 0x02:IIR(中断状态寄存器,此处的0x02偏移和下面的0x02是一个地址,不同的是这个地址读的时候和写入的时候功能不一样,此处是只读的功能,下面是只写的功能)
- 0x02:FCR/DL_D(FIFO控制寄存器/分频值小数寄存器,同0x00寄存器一样是复用的空间)
- 0x03:LCR(线路控制寄存器)
- 0x04:SAMPLE_CTRL(bit窗口划分和采样控制寄存器)
- 0x05:LSR(线路状态寄存器)
- 0x06:TF_CNT(发送队列数据存量)
- 0x07:STATUS(状态寄存器)
更加详细的详细请参考用户手册
UART控制器的初始化
void uart_init(uint32_t baud)
{
uint32_t div = (SystemFreq << 4);
div = div/baud;
LCR |= 0x80;
IIR_FCR_DL_D = div & 0xff;
div >>= 8;
DAT_DL_L = div & 0xff;
div >>= 8;
IER_DL_H = div & 0xff;
LCR &= (~0x80);
IER_DL_H = 0x00;
IIR_FCR_DL_D = (0x01<<1)|(0x01<<2);
LCR = (0x03<<0)|(0x00<<2)|(0x00<<3)|(0x00<<5)|(0x00<<6);
}
UART控制器数据发送
void uart_send_byte(uint8_t byte)
{
while(!(LSR&0x20));
DAT_DL_L = byte;
}
UART控制器数据接收
uint8_t uart_read_byte()
{
while(!(LSR&0x01));
return DAT_DL_L;
}