avr128db48 USART_RXC_vect 中断不工作

问题描述 投票:0回答:1
#define F_CPU 4000000
#define BAUD_RATE(BAUD) ((64.0*F_CPU)/(BAUD*16.0))
#include <avr/io.h>
#include <avr/interrupt.h>


volatile uint8_t a;
volatile uint8_t b;

void UART_sw_write(char c)
{
    while(!(USART3.STATUS & USART_DREIF_bm))
    {
        ;
    }
    
    USART3.TXDATAL = c;
}

uint8_t UART_sw_read()
{
    while(!(USART3.STATUS & USART_RXCIF_bm)) //WAIT UNtil done reading
    {
        ;
    }
    a = USART3.RXDATAL;
    return a;
}

ISR(USART3_RXC_vect){
    cli();
    b = UART_sw_read();
    UART_sw_write(b);
    sei();
}

 
int main(void)
{
    USART3.BAUD = BAUD_RATE(9600);
    VPORTB_DIR |= PIN0_bm;  //TX as output RX as input
    USART3.CTRLA |= USART_RXCIE_bm | USART_TXCIE_bm | USART_RXSIE_bm | USART_DREIE_bm;
    USART3.CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
    USART3.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_SBMODE_1BIT_gc | USART_CHSIZE_8BIT_gc;
    sei();
    while (1) 
    {
        //b = UART_sw_read();
        //UART_sw_write(b);
        asm volatile("nop");
    }
}

在 USART3.STATUS RXCIF 中设置,但此 ISR(USART3_RXC_vect)中断从未被调用。

我为 USART3 控件尝试了不同的设置,但都不起作用。 代码应该在每次使用中断接收到字符时发回一个字符。

c interrupt avr usart
1个回答
0
投票

我认为这是您的处理程序中的

sei()
cli()
指令。
cli()
清除中断,所以我会先尝试改变它。

如果有的话,他们应该去你在

main()
中配置异常的地方:

cli();
USART3.BAUD = BAUD_RATE(9600);
VPORTB_DIR |= PIN0_bm;  //TX as output RX as input
USART3.CTRLA |= USART_RXCIE_bm | USART_TXCIE_bm | USART_RXSIE_bm | USART_DREIE_bm;
USART3.CTRLB |= USART_RXEN_bm | USART_TXEN_bm;
USART3.CTRLC = USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_SBMODE_1BIT_gc | USART_CHSIZE_8BIT_gc;
sei();
© www.soinside.com 2019 - 2024. All rights reserved.