公司有一款产品要完成经过串口更新开机画面的功用。产品用的是AVR的ATmega8单片机,配有两个通用同步和异步串行接收器和转发器(USART) 。在芯片的数据文档里给出了波特率寄存器UBRR的值的核算公式。
但是实践测验才发现,就算出的值底子不能用。也就是说,用算出的值宣布的波特率底子不是想要的波特率。百思不得其解,只好上网搜搜看有没有收成。公然,网上有个仁兄的症状和我相同,也是波特率不对。看了后边的答复,觉得有一个挺靠谱的,大概是说,在用了AVR的内部RC振荡器的情况下,实践波特率会和核算值有误差。由于芯片的内部RC振荡器频率不像外部晶振的频率那么安稳。
在不添加外部晶振的情况下,怎么解决问题呢?在网没有找到什么办法,只好自己用笨办法了。上示波器,看单片机宣布的波形的宽度,和规范的波特率的宽度比照,再一点点的在UBRR的核算值的基础上批改,直到单片机宣布的波形正确停止。
以下是我测验出的一组UBRR的实践值,希望对有需求的朋友有用。
注:
芯片型号:ATmega8L 运用形式:异步倍速形式(U2X = 1) 时钟源:内部RC振荡器 时钟频率:8Mhz
波特率寄存器(UBRR)核算公式:UBRR = f / (8*BAUD) – 1 (其间BAUD为希望波特率的值,f为时钟频率的值)
波特率 |
UBRR实践值 |
UBRR核算值 |
9600 |
96 |
103.16 |
14400 |
64 |
68.44 |
19200 |
48 |
51.08 |
28800 |
31 |
33.72 |
38400 |
22 |
25.04 |
56000 |
15 |
16.85 |
57600 |
15 |
16.36 |
115200 |
未测验 |
7.68 |
128000 |
未测验 |
6.81 |