jsk*_*jsk 1 c microcontroller assembly arduino atmel
所以我正在阅读有关 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
Run Code Online (Sandbox Code Playgroud)虽然在此 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);
}
Run Code Online (Sandbox Code Playgroud)这段代码按照制造CPU的Atmel的说法是完全一样的,那么为什么它可以被称为两个不同的东西呢?
谢谢 :)
根据Atmel 文档, UBRRnL 和 UBRRnH 是 USART 波特率寄存器。
UBRRnH 包含 USART 波特率的 4 个最高有效位,UBRRnL 包含 USART 波特率的 8 个最低有效位。
UBRRnL
正如我所看到的,如果您的设备有多个 USART,例如 USART0 和 USART1,您可以通过修改和UBRRnH
(也许还有其他寄存器)来选择您需要的一个。将(UBRRnL 和 UBRRnH 中的)更改n
为所需的 USART id 号并将其分配给UBRRnL
和UBRRnH
。
例如在汇编中:
.equ USART = 1
.if USART == 0
.equ UBRRnH = UBRR0H
.equ UBRRnL = UBRR0L
.else
.equ UBRRnH = UBRR1H
.equ UBRRnL = UBRR1L
.endif
Run Code Online (Sandbox Code Playgroud)
因此,当从 C 源代码生成汇编代码时,编译器可能会将UBRR0H
s 和UBRR0L
s 编译为UBRRnL
andUBRRnL
并将它们定义为UBRR0H
and UBRR0L
,正如Robert Harvey所说。
归档时间: |
|
查看次数: |
5572 次 |
最近记录: |