c - Usart中断注册

标签 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 中断。调用每个中断的函数也在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 .

关于c - Usart中断注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31397778/

相关文章:

c++ - 如何比较 C++ 中的内存位?

android - 在 Android 中如何停止正在等待新套接字的线程

linux - 在 Linux-CentOS/Intel 机器上评估 SMI(系统管理中断)延迟

c - 结构数组的段错误

c - 接受 C 字符串输入中的空格

c - 标识符的命名空间如何在 C 中工作?

c - 尽管发生中断但未调用 WiringPi ISR?

keyboard - 从 USB HID 键盘发送语言布局

c - 修改AVR audioplayer代码播放随机轨道

c - AVR clean pin 别名解决方案——枚举 I/O 位