为了获得正确的输出,我必须将 U2X 位设置为 1,当我将其设置为零并更改 UBRR 寄存器的值时,输出没有意义。我检查了我是否使用了数据表中的正确值,但它在 U2X=0 时没有给出正确的输出。
我的 .h 文件
#ifndef USRAT_TEST_H_
#define USRAT_TEST_H_
#include <avr/io.h>
void USRAT_INIT(uint16_t bd);
char USRAT_RECIEVE_CHR(void);
void USRAT_SEND_CHR(char c);
#endif /* USRAT_TEST_H_*/
我的 .c 文件
#include <avr/io.h>
#define F_CPU 2000000UL
#include <util/delay.h>
#include "USRAT_TEST.h"
void USRAT_INIT(uint16_t bd)
{
UCSRA = (1<<U2X);//when removing this line and edit F_CPU/8 to F_CPU/16 things go wrong
UCSRB|=(1<<RXEN)|(1<<TXEN);// enable send and receive
UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);//8-bit width
UBRRL=(F_CPU/8/bd-1);
UBRRH=(F_CPU/8/bd-1)>>8;
}
char USRAT_RECIEVE_CHR()
{
while((UCSRA&(1<<RXC))==0)
{
}
return UDR;
}
void USRAT_SEND_CHR(char c)
{
while((UCSRA&(1<<UDRE))==0)
{
}
UDR=c;
}
main.c 文件
#include <avr/io.h>
#define F_CPU 2000000UL
#include <util/delay.h>
#include "USRAT_TEST.h"
#include <stdio.h>
char data;
int main(void)
{
USRAT_INIT(9600);
/* Replace with your application code */
while (1)
{
data = USRAT_RECIEVE_CHR();
USRAT_SEND_CHR(data);
}
}
这是一个简单的模拟,我在我的 AVR 中添加了 2 个虚拟终端......当我将 U2X 设置为 0 并从数据表中写入值时,当我向其中一个写入“a”或任何字符时,我得到了另一个错误的租船人。
我直接从数据表中获取了 UBBR 的值,您可以尝试不使用公式F_CPU/8/bd-1
并将它们直接从表中放入。
你能告诉我U2X对相同波特率的影响吗????或何时将 U2X 设置为 1 或 0??????