Usart中断注册

时间:2015-07-14 04:39:54

标签: c interrupt avr usart rs485

我正在为我的应用程序使用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中断。调用每个中断的函数也是主要的。有人可以解释我对实现中断的理解有什么问题。我还附上了相关代码的片段以供进一步参考。

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);
}

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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