2

我在网上找到了这部分代码,关于如何在 atmega32 上初始化 USART。它适用于我的应用程序,但我想更好地理解它。

void USART_initial (void){
#define BAUD 9600 // We set the desired baud rate( here we set it at 9600bps)
#include <util/setbaud.h>  // 
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif

UCSRB = (1<<RXEN)|(1<<TXEN); // Enable transmitter/receiver.
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Character size : 8 bit

我的问题是 UBRRH 和 UBRRL 寄存器的确切用途是什么,为什么我需要使用它们?

非常感谢您提前

4

1 回答 1

5

UART 需要一个时钟信号来确定波特率。它是通过将 CPU 时钟频率除以 UBRR 寄存器值在芯片中生成的。它必须比所需的波特率高 16 倍。UART 使用 x16 因子对接收到的串行数据进行二次采样,它通过从 16 个样本的平均值计算接收到的位值来提高抗噪性。

因此,如果所需的波特率为 9600 波特且 CPU 时钟为 16 MHz,则 UBBR 为 (16000000 / (16 x 9600)) - 1 = 103.167。将其四舍五入到最接近的整数 = 103。这使得 UBRRL = 0x67,UBRRH = 0x00。您应该会在 util/setbaud.h 源文件中看到此计算。

于 2013-11-12T15:36:47.643 回答