atmega32中UBRRH和UBRRL寄存器的作用是啥?

Posted

技术标签:

【中文标题】atmega32中UBRRH和UBRRL寄存器的作用是啥?【英文标题】:What is the function of UBRRH and UBRRL registers in atmega32?atmega32中UBRRH和UBRRL寄存器的作用是什么? 【发布时间】:2013-11-24 12:21:43 【问题描述】:

我在网上找到了这部分代码,关于如何在 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 寄存器的具体用途是什么,为什么需要使用它们?

非常感谢您

【问题讨论】:

【参考方案1】:

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 源文件中看到此计算。

【讨论】:

以上是关于atmega32中UBRRH和UBRRL寄存器的作用是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Atmega32 移位 PORTA 不会循环遍历整个寄存器

ATmega8仿真——LED 数码管的学习

atmega328 上的 SPI 不工作

在 Atmel AVR studio 中使用 ATMega2560 读取 RC PWM 信号

使用 ATmega32 在 LCD 上显示阵列中的 ASCII 字符

atmega 32u4 中的 UCAP 连接