gpt4 book ai didi

c++ - AVR XMEGA USART 仿真

转载 作者:行者123 更新时间:2023-11-30 05:36:50 27 4
gpt4 key购买 nike

使用下面的测试代码,我尝试使用 中的 simulator 通过 xmega128a3uUSART 发送数据Atmel Studio. 观察 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++;
}

enter image description here

最佳答案

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

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

编辑以包含来自以下评论的信息:由于您无法读回刚刚写入 DATA 寄存器的内容,因此在写入数据后立即检查 STATUS 寄存器中的 DREIF 标志将确认数据是否正在传输。

关于c++ - AVR XMEGA USART 仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33441772/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com