Atmega32A 与 PC 的 UART 通信

UART communication on Atmega32A with PC

我是 AVR 微控制器编程的初学者,有时阅读数据表让我头疼不已。 我正在尝试在我的 AVR 和 PC 之间进行通信,只是为了发送一些字符并在我的计算机上接收它。 整个程序有两行我没看懂,那就是:

 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);
}

Datasheet

为什么我要把 BAUD_PRESCALLER 换成 8?如果 BAUD_PRESCALLER 是一个数字,将这个数字移动 8 并不意味着结果将为零?(因为我们移动了太多次)

从数据表中我了解到 UBRRH 包含 USART 波特率的四个最高有效位,而 UBRRL 包含八个最低有效位。(注: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