gpt4 book ai didi

c - Atmega32A 与 PC 上的 UART 通信

转载 作者:行者123 更新时间:2023-11-30 14:49:49 25 4
gpt4 key购买 nike

我是 AVR 微 Controller 编程的初学者,有时阅读数据表会让我感到非常头疼。我正在尝试在我的 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

关于c - Atmega32A 与 PC 上的 UART 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49348939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com