所以我正在阅读有关 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 的说法,这段代码的作用完全相同,那么为什么它可以被称为两个不同的东西呢?
谢谢:)
最佳答案
根据 Atmel documentation UBRRnL 和 UBRRnH 是 USART 波特率寄存器。
UBRRnH 包含 USART 波特率的四个最高有效位,而 UBRRnL 包含八个最低有效位。
据我所知,如果您的设备有多个 USART,例如 USART0 和 USART1,您可以通过修改 UBRRnL
和 UBRRnH
(也许还有其他寄存器)来选择您需要的一个.将 n
(在 UBRRnL 和 UBRRnH 中)更改为所需的 USART id 编号,并将其分配给 UBRRnL
和 UBRRnH
。
例如在汇编中:
.equ USART = 1
.if USART == 0
.equ UBRRnH = UBRR0H
.equ UBRRnL = UBRR0L
.else
.equ UBRRnH = UBRR1H
.equ UBRRnL = UBRR1L
.endif
因此,当从 C 源代码生成汇编代码时,编译器可能会将 UBRR0H
和 UBRR0L
编译为 UBRRnL
和 UBRRnL
并将它们定义为 UBRR0H
和 UBRR0L
,如 Robert Harvey声明。
关于c - 爱特梅尔微 Controller : difference between UBRR0H and UBRRnH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18007064/