我在互联网上找到了这部分代码,关于如何在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寄存器的确切用法是什么,为什么我需要使用它们?
非常感谢您提前
答案 0 :(得分:4)
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源文件中看到此计算。