关于xv6中uartinit函数38.4K波特率计算的技术问询
xv6中UART 38.4K波特率的计算逻辑
1. 16550 UART波特率发生器说明(翻译自官方文档)
可编程波特率发生器:16550包含一个可编程波特率发生器,可跟踪DC到8MHz的任意时钟输入,并将其除以1到2^16-1之间的任意除数。波特率发生器的输出频率(Baudout)等于传输波特率的16倍(Baudout = 16 × 波特率)。通过为波特率发生器的MSB和LSB选择合适的除数,可以实现自定义波特率。
2. 核心计算逻辑
xv6采用PC兼容系统的标准UART参考时钟:1.8432MHz(1843200Hz)。结合文档公式推导除数计算方式:
从文档给出的关系:Baudout = 16 × 波特率
同时,波特率发生器的输出频率由时钟分频得到:Baudout = 时钟频率 / 除数
将两个公式合并,得到除数的计算公式:除数 = 时钟频率 / (16 × 波特率)
3. 38.4K波特率的具体计算
代入38400波特率和1.8432MHz时钟参数:
- 16×波特率:
16 × 38400 = 614400 - 除数:
1843200 / 614400 = 3
4. 对应xv6代码的实现
代码中通过以下步骤设置波特率:
- 写入
LCR寄存器进入波特率锁存模式,此时寄存器0和1被映射为除数的LSB(低8位)和MSB(高8位) WriteReg(0, 0x03):设置除数低8位为3(0x03)WriteReg(1, 0x00):设置除数高8位为0(0x00)
最终得到16位除数0x0003(十进制3),与计算结果完全一致,从而实现38.4K波特率。
内容的提问来源于stack exchange,提问作者Yutong Song
相关产品推荐
相关产品推荐

