0

为了获得正确的输出,我必须将 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??????

在此处输入图像描述

4

1 回答 1

1

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

于 2018-03-19T12:32:21.277 回答