Deepseek 解析16650串口初始化代码

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值