Uart中断注册

Usart interrupt registeration

我正在为我的应用程序使用 AT32UC 系列(定制板),今天 Usart RS485 中断让我很烦。 我有 Rx 中断设置和工作。现在尝试添加要在数据可发送时调用的 Tx 中断。 我的问题是从未调用 tx 中断。为此奋斗了几个小时后,我发现了一些奇怪的东西。

int main()
.....// other initialisations
INTC_init_interrupts();
INTC_register_interrupt(&timerInterrupt, AVR32_TC_IRQ0, AVR32_INTC_INT0);
INTC_register_interrupt(&rs485TxInterrupt, AVR32_USART2_IRQ, AVR32_INTC_INT1);
INTC_register_interrupt(&rs485RxInterrupt, AVR32_USART2_IRQ, AVR32_INTC_INT0);              
Enable_global_interrupt();

从上面,我得到 rx 中断工作,如果我用 tx 中断改变 INTC rx 中断的顺序,我得到 tx 中断工作,没有 rx 中断。调用每个中断的函数也在main中。有人能解释一下我对实现中断的理解有什么问题吗?我还附上了相关代码的片段以供进一步参考。

static void SendTx(void)
{   
    txLength = 5;
    gpio_set_pin_high(AVR32_PIN_PA10);
    txBuf[0] = ATEAddress;
    AVR32_USART2.THR.txchr = txBuf[0];
    tx_outctr = 1;

    if(peaksRdy_flag == true)
    {
        txBuf[1] = peaks[loop][0];  
        txempty_flag = false;
        AVR32_USART2.ier = AVR32_USART_IER_TXRDY_MASK;
    }
}
__attribute__((__interrupt__)) static void rs485TxInterrupt(void)
{   
    //AVR32_USART2.IDR.txrdy = 1;
    AVR32_USART2.THR.txchr = txBuf[1];
    AVR32_USART2.CR.sttbrk = 1;
    gpio_set_pin_low(AVR32_PIN_PA10);
    gpio_set_pin_low(AVR32_PIN_PA06);
    if(!txempty_flag)
    {   
       //gpio_set_pin_high(AVR32_PIN_PA06);
        //AVR32_USART2.IMR.txrdy;
    }
}

static void readRx(void)
{   
AVR32_USART2.CR.txdis = 1;
AVR32_USART2.ier = AVR32_USART_IER_RXRDY_MASK;
}

__attribute__((__interrupt__)) static void rs485RxInterrupt(void)
{

//AVR32_USART2.IDR.rxrdy = 1;
uint32_t data;
static char RxDatalength = 98;
data = AVR32_USART2.RHR.rxchr;

    if(data & 0x00000100)
    {
        if((data & 0x000000ff) == 0x92) //dsp board address = 0x92
        {

            rxBuf[0] = data;
            addr_flag = true;
            rxInCtr = 1;
        }
        else
        {
            addr_flag = false;
            return;
        }
     }

     else if (addr_flag == true)
     {
         rxBuf[rxInCtr++] = data;
         if(rxInCtr == 2)           // command check
         {
            if(data < 0x80)
            {   
                addr_flag = false;  // reset addr flag
                if(data==0x10)//START
                {

                    start_flag = true;

                }
                else if(data == 0x11) //CANCEL
                {
                    gpio_set_pin_high(AVR32_PIN_PA13);
                    break_flag = true;
                }
            }
            else if(data >= 0x80)

                RxDatalength = 3;
        }

         if ((rxInCtr == RxDatalength) || ((RxDatalength == 98) && (rxInCtr == rxBuf[2]+1)))
         {
            //gpio_set_pin_high (AVR32_PIN_PA16);
            addr_flag = false;
            start_flag = true;
         }
     }
gpio_set_pin_low(AVR32_PIN_PA13);
}

提前致谢!

您正在为同一个中断 (AVR32_USART2_IRQ) 注册两个不同的例程,因此第二个注册只会覆盖第一个。

请注意,AT32UC 中的 RX 和 TX 只有 一个 IRQ/ISR,您必须自己确定在您的 ISR 中发生了哪一个,例如,参见http://www.avrfreaks.net/forum/how-distinguish-usart-interrupts-txrdy-rxrdy.