AVR单片机串口的波特率设置
时间:11-30
来源:互联网
点击:
公司有一款产品要实现通过串口更新开机画面的功能。产品用的是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 |
AVR单片机串口波特率设 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)