我是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包含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