为什么在 atmega32 中提供正确的输出和具有相同波特率的正常模式时将 uart 设置为双速模式?

Why setting uart to double speed mode when gives the right output and normal mode with same baud rate doesn't in atmega32?

为了获得正确的输出,我必须将 U2X 位设置为 1,当我将其设置为零并更改 UBRR 寄存器的值时,输出没有任何意义。 我检查过我使用的是 datasheet table 中的正确值,但它在 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 并从数据 sheet 写入值时,当我将 "a" 或任何字符写入其中之一时他们我在另一个错误的租船人那里。

我直接从数据 sheet 中获取了 UBBR 的值,您可以尝试不使用公式 F_CPU/8/bd-1 并直接从 table 中输入它们。

你能告诉我 U2X 对相同波特率有什么影响吗???? 或何时将 U2X 设置为一或零??????

enter image description here

再次查看数据表中的示例,了解 UBRR 与波特率和时钟的关系。您会看到类似 #define MYUBRR FOSC/16/BAUD-1 的内容。您的代码计算 UBRR 将时钟除以 8 而不是 16,因此要使 UART 正常工作,您必须将时钟加倍。