我是编程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);
}
为什么我要将BAUD_PRESCALLER换成8?如果BAUD_PRESCALLER是一个数字并且将该数字移动到8并不意味着结果将为零?(因为我们将它移动了太多次)
从数据表中我了解UBRRH包含四个最高有效位,UBRRL包含USART信号速率的八个最不重要位。(注意:UBBR是一个12位寄存器)
那么我们如何将所有必需的数字放在UBBR寄存器中呢?
答案 0 :(得分:1)
由于BAUD_PRESCALLER的结果大于8位,因此必须将其右移8位。将其向右移8位可为您提供16位值的最高有效字节。
例如,如果BAUD_PRESCALAR的值为0x123 - 那么0x1将分配给UBRRH,0x23将分配给UBRRL。
如果库是智能的,它还可以对BAUD_PRESCALAR执行完整性检查,以确保它适合16位。如果不能,则意味着在您使用的时钟下,您无法达到所需的波特率。如果您的UBRRx是真正的12位,那么完整性检查将如下所示:
#if BAUD_PRESCALAR > 0xFFF
#error Invalid prescalar
#endif