C++ AVR XMEGA USART仿真

C++ AVR XMEGA USART仿真,c++,avr,atmel,usart,atmelstudio,C++,Avr,Atmel,Usart,Atmelstudio,使用下面的测试代码,我试图使用Atmel Studio中的模拟器通过xmega128a3u的USART发送数据。观察I/O视图数据寄存器从未设置,即使我正在设置它。我的代码或模拟器有什么问题吗 #include <avr/io.h> #include <avr/interrupt.h> #define bscale 0 #define bsel 0x0003 //250kbps #define packetFormat (USART_SBMODE_bm | USART_

使用下面的测试代码,我试图使用Atmel Studio中的
模拟器
通过
xmega128a3u
USART
发送数据。
观察I/O视图数据寄存器从未设置,即使我正在设置它。我的代码或模拟器有什么问题吗

#include <avr/io.h>
#include <avr/interrupt.h>

#define bscale 0
#define bsel 0x0003 //250kbps
#define packetFormat (USART_SBMODE_bm | USART_CHSIZE_8BIT_gc | USART_PMODE_DISABLED_gc)


uint8_t n;

int main(void)
{
    //ALLOW PORTB AND PORTF TO BE WRITTEN TO! TURNS OFF JTAG
    CCP = 0xD8; //Allow Protected IO changing
    MCU_MCUCR = 0x1;

    //CRYSTAL SETUP
    OSC_XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_16KCLK_gc; // 16Mhz Crystal
    OSC_CTRL |= OSC_XOSCEN_bm;
    while(!(OSC_STATUS & OSC_XOSCRDY_bm)); //Wait for crystal to stabilize.
    CCP = CCP_IOREG_gc;
    CLK_CTRL = CLK_SCLKSEL_XOSC_gc;
    //END CRYSTAL SETUP


    cli();


    //Enable Interrupts
    USARTF0.CTRLA = USART_TXCINTLVL_LO_gc | USART_DREINTLVL_LO_gc;

    //Enable transmitter
    USARTF0.CTRLB = USART_TXEN_bm;

    PMIC.CTRL |= PMIC_LOLVLEX_bm;

    //Set baud
    USARTF0.BAUDCTRLB = bscale;
    USARTF0.BAUDCTRLA = bsel;

    //Set packet format
    USARTF0.CTRLC = packetFormat;

    sei();

    while (1) 
    {
        if(n < 255) {
            USARTF0.DATA  = n;

        } else {
            n = 0;  
        }
    }
}

ISR(USARTF0_TXC_vect) {
    n++;
}

ISR(USARTF0_DRE_vect) {
    n++;
}

#include

是否正在更新其他寄存器,而不是数据?如果没有,请确保已启用USART时钟。许多微型计算机也使用一个数据寄存器进行读取和写入。因此,在写入后尝试读取数据寄存器(即,调试视图正在执行读取)不会返回任何内容,除非已接收到数据。因此,即使在硬件上执行,您也可能会看到相同的行为

也就是说,根据我的经验,Atmel Studio中的模拟器并不擅长模拟中断或外围操作

编辑以包含以下评论中的信息:
因为你不能读回你刚刚写进数据寄存器的东西,在写入数据后,立即检查状态寄存器中的DREIF标志将确认数据是否正在传输。

在这种情况下,您可能应该使
n
不稳定,因为编译器很可能没有看到ISR代码,因此优化分支
if(n<255)
因为
n
在该部分代码中没有更改。是的,其他寄存器正在更新。我添加了一个截图。我查阅了xmega128A3U的手册,USART的数据寄存器具有双重功能:当您写入时,它会将该字符复制到其“传输移位寄存器”,当您读取时,它会读出接收到的数据。因此,每当您将数据写入寄存器进行传输时,您将无法将其读回。尝试在写入数据后立即检查USART状态寄存器中的DREIF标志。这应该可以提供数据是否被发送的指示,尽管我不确定模拟器是否能很好地显示这一点。我在一个真正的芯片上试用了这个代码,一切都正常。因此,模拟器不能显示数据寄存器值。很高兴知道它只是模拟器。如果这回答了你的问题,我将不胜感激,如果你能标记我的答案以上接受。