16650串口初始化代码
static unsigned int uart16550_clock = 1843200; //串口时钟
#define UART_DEFAULT_BAUD 115200
void uart_init(void)
{
unsigned int divisor = uart16550_clock / (UART_DEFAULT_BAUD * 16);
/*关闭中断*/
writeb(0, UART_IER);
/*打开DLB字段,设置波特率分频*/
writeb(0x80, UART_LCR);
writeb((unsigned char)divisor, UART_DLL);
writeb((unsigned char)(divisor >> 8), UART_DLM);
/*设置串口数据格式*/
writeb(0x3, UART_LCR);
/*使能FIFO缓冲区,清空FIFO缓冲区,设置14字节阈值*/
writeb(0xc7, UART_FCR);
}
以上代码摘自《RISC-V 体系结构编程与实践》第一版,P39。
Deepseek思考内容
嗯,我现在需要理解这段UART初始化的代码。首先,用户定义了一个函数uart_init,里面做了一些UART的配置。让我仔细看一下每一部分的作用。
首先,divisor被计算为uart16550_clock除以(UART_DEFAULT_BAUD乘以16)。这里应该是在设置波特率的除数。因为UART通常使用除数来生成正确的波特率,而公式通常是除数=时钟频率/(波特率*16)。所以这一步应该是正确的。
接下来是关闭中断,用writeb(0, UART_IER)。UART_IER是中断使能寄存器,写入0的话就是禁止所有中断,这应该在初始化的时候避免中断干扰,对吧?所以这一步没问题。
然后,打开DLB字段,设置波特率分频。这里写入0x80到UART_LCR。LCR是线路控制寄存器,最高位(DLAB,即Divisor Latch Access Bit)是用来允许访问除数锁存器的。所以这时候设置DLAB为1,允许设置DLL和DLM的值。这一步是对的,因为需要先开启DLAB才能设置波特率的除数。
接着,写入divisor的低8位到UART_DLL,高8位到UART_DLM