Atmel 微控制器:UBRR0H 和 UBRRnH 的区别

Posted

技术标签:

【中文标题】Atmel 微控制器:UBRR0H 和 UBRRnH 的区别【英文标题】:Atmel microcontroller: difference between UBRR0H and UBRRnH 【发布时间】:2013-08-02 00:54:25 【问题描述】:

所以我正在阅读有关 Atmel 328p 编程的内容,我希望能够对串行输入和输出进行编程,但我看到了一些我没有完全理解的东西:

UBRR0H 在此汇编代码中称为 UBRRnH:

USART_Init:
    ; Set baud rate
    out UBRRnH, r17
    out UBRRnL, r16
    ; Enable receiver and transmitter
    ldi r16, (1<<RXENn)|(1<<TXENn)
    out UCSRnB,r16
    ; Set frame format: 8data, 2stop bit
    ldi r16, (1<<USBSn)|(3<<UCSZn0)
    out UCSRnC,r16
    ret

虽然它在此 C 代码中保留为名称 UBRR0H:

#define FOSC 1843200 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
void main( void ) 
    ...
    USART_Init(MYUBRR)
    ...


void USART_Init( unsigned int ubrr) 
    /*Set baud rate */
    UBRR0H = (unsigned char)(ubrr>>8);
    UBRR0L = (unsigned char)ubrr;
    Enable receiver and transmitter */
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    /* Set frame format: 8data, 2stop bit */
    UCSR0C = (1<<USBS0)|(3<<UCSZ00);

根据制造 CPU 的 Atmel 的说法,这段代码完全一样,那为什么它可以被称为两个不同的东西呢?

谢谢:)

【问题讨论】:

【参考方案1】:

根据Atmel documentation UBRRnL 和 UBRRnH 是 USART 波特率寄存器。

UBRRnH 包含 4 个最高有效位,而 UBRRnL 包含 8 个最低有效位的 USART 波特率。

我看到您的设备是否有多个 USART,例如 USART0 和 USART1,您可以通过修改 UBRRnLUBRRnH(也可能还有其他寄存器)来选择您需要的一个。将 n(在 UBRRnL 和 UBRRnH 中)更改为所需的 USART id 号,并将其分配给 UBRRnLUBRRnH

例如在汇编中:

.equ USART = 1 
.if USART == 0 
    .equ UBRRnH = UBRR0H 
    .equ UBRRnL = UBRR0L 
 .else 
    .equ UBRRnH = UBRR1H 
    .equ UBRRnL = UBRR1L 
 .endif

因此,当从 C 源代码生成汇编代码时,编译器可能会将UBRR0Hs 和UBRR0Ls 编译为UBRRnLUBRRnL,并将它们定义为UBRR0HUBRR0L,如@ 987654322@声明。

【讨论】:

【参考方案2】:

在Nut/OS,我看到了这个#define

#define     UBRRnH   UBRR0H

它们完全有可能是等价的。

【讨论】:

【参考方案3】:

在数据表(使用 ATmega164P/324P/644P 数据表)中,Atmel 解释了命名中“n”的使用。这是因为 MCU 有 2 个 USART,USART0 和 USART1,因此您可以根据您使用的 USART 将“n”替换为“0”或“1”。 使用#define可以解决这个问题,

#define UBRRnH UBRR0H

【讨论】:

以上是关于Atmel 微控制器:UBRR0H 和 UBRRnH 的区别的主要内容,如果未能解决你的问题,请参考以下文章

Arduino Uno微控制器采用的是Atmel的ATmega328

在 Atmel SAMD21J18A 微控制器中查找剩余的闪存大小?

如何延迟 avr 微控制器的组装?

使用 AVRDUDE 通过 CAN 对 Atmel 芯片 (AT90CAN128) 进行编程

Atmel Studio Dummy_Handler

初学者:AVR C++ Atmel Studio 6