我是AVR微控制器编程的乞丐,有时阅读数据表会让我感到头疼。我正在尝试在我的 AVR 和 PC 之间进行通信,只是为了发送一些 caracter 并在我的计算机上接收它。整个程序中有两行我不明白,那就是:
void USART_init(void)
{
UBRRH = (uint8_t)(BAUD_PRESCALLER>>8); <---- this one!
UBRRL = (uint8_t)(BAUD_PRESCALLER); <--- and this one
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<UCSZ0)|(1<<UCSZ1)|(1<<URSEL);
}
数据表
为什么我必须用 8 换BAUD_PRESCALLER?如果BAUD_PRESCALLER是一个数字,并且用 8 移动该数字并不意味着结果将为零?(因为我们转移了太多次(
从数据表中我了解到UBRRH包含四个最重要的位,UBRRL包含USART波特率的八个最低有效位。(注:UBBR为12位寄存器(
那么,我们实际上是如何将所有必需的数字放入UBBR寄存器中呢?
您必须将其向右移动 8 位,因为BAUD_PRESCALLER的结果大于 8 位。 将其向右移动 8 位可得到 16 位值的最高有效字节。
例如,如果BAUD_PRESCALAR的值0x123 - 则0x1将分配给UBRRH,0x23将分配给UBRRL。
如果库是智能的,它还可以对BAUD_PRESCALAR执行健全性检查,以确保它适合 16 位。 如果不能,这意味着您无法在给定使用的时钟的情况下达到您想要的波特率。 如果你的UBRRx真的是12位,那么健全性检查将如下所示:
#if BAUD_PRESCALAR > 0xFFF
#error Invalid prescalar
#endif