要获得正确的输出,我必须将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);
}
}
这是一个简单的模拟我将2个虚拟终端添加到我的AVR ....当我将U2X设置为0并在写入时从数据表中写入值&#34; a&#34;或者其他人中的任何角色,我都会遇到另一个错误的租船人。
我从数据表中直接获取了UBBR的值,您可以在没有公式F_CPU/8/bd-1
的情况下尝试将它们直接放在表格中。
你能告诉我U2X对同一波特率的影响是什么? 或何时将U2X设置为1或零??????
答案 0 :(得分:0)
再看一下数据表中的示例,看看UBRR如何与波特率和时钟相关。你会看到像#define MYUBRR FOSC/16/BAUD-1
这样的东西。您的代码计算UBRR将时钟除以8而不是16,因此要使UART正常工作,您必须将时钟加倍。