atmega32中UBRRH和UBRRL寄存器的作用是啥?
Posted
技术标签:
【中文标题】atmega32中UBRRH和UBRRL寄存器的作用是啥?【英文标题】:What is the function of UBRRH and UBRRL registers in atmega32?atmega32中UBRRH和UBRRL寄存器的作用是什么? 【发布时间】:2013-11-24 12:21:43 【问题描述】:我在网上找到了这部分代码,关于如何在 atmega32 上初始化 USART。它适用于我的应用程序,但我想更好地理解它。
void USART_initial (void)
#define BAUD 9600 // We set the desired baud rate( here we set it at 9600bps)
#include <util/setbaud.h> //
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
UCSRB = (1<<RXEN)|(1<<TXEN); // Enable transmitter/receiver.
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Character size : 8 bit
我的问题是 UBRRH 和 UBRRL 寄存器的具体用途是什么,为什么需要使用它们?
非常感谢您
【问题讨论】:
【参考方案1】:UART 需要一个时钟信号来确定波特率。它是通过将 CPU 时钟频率除以 UBRR 寄存器值在芯片中生成的。它必须比所需的波特率高 16 倍。 UART 使用 x16 因子对接收到的串行数据进行二次采样,它通过计算 16 个样本的平均值来计算接收到的位值来提高抗噪性。
因此,如果所需的波特率为 9600 波特且 CPU 时钟为 16 MHz,则 UBBR 为 (16000000 / (16 x 9600)) - 1 = 103.167。将其四舍五入到最接近的整数 = 103。这使得 UBRRL = 0x67,UBRRH = 0x00。您应该会在 util/setbaud.h 源文件中看到此计算。
【讨论】:
以上是关于atmega32中UBRRH和UBRRL寄存器的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 Atmel AVR studio 中使用 ATMega2560 读取 RC PWM 信号