我正在为我的应用程序使用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);
}
提前致谢!
答案 0 :(得分:1)
您正在为同一个中断(AVR32_USART2_IRQ
)注册两个不同的例程,因此第二个注册只会覆盖第一个中断。
请注意,AT32UC中的RX和TX只有一个 IRQ / ISR,您必须确定自己在ISR中发生了哪一个,参见例如: http://www.avrfreaks.net/forum/how-distinguish-usart-interrupts-txrdy-rxrdy