|
引用 3 楼 mxm1986 的回复:
看看你串口的实现程序,有没有加__irq,里面的数组有没有越界。。如果,定时器的中断可以使用,那么串口中断按理也不错。。你贴出串口中断处理程序看看哪。。。另外,一般irq中断模式下的stack是256B,如果你串口中断里面函数调用很复杂的话,可能越界。
楼上的讲得很有道理,我没有加_irp,
void UART0_Exception(void)
{
uint8 IIR, temp, i;
OS_ENTER_CRITICAL();
while(((IIR = U0IIR) & 0x01) == 0)
{ /* 有中断未处理完 */
switch (IIR & 0x0e)
{
case 0x02: /* THRE中断 */
for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向发送FIFO填充数据 */
{
if (QueueRead(&temp, UART0SendBuf) == QUEUE_OK)
{
U0THR = temp;
}
else
{
U0IER = U0IER & (~0x02); /* 队列空,则禁止发送中断 */
}
}
break;
case 0x04: /* 接收数据可用 */
case 0x0c: /* 字符超时指示 */
do /* 读取FIFO全部数据 */
{
QueueWrite((void *)UART0_ReceiveBuf,U0RBR);
}while((U0LSR & 0x00000001) != 0);
break;
case 0x06:
temp = U0LSR;
break;
default :
break;
}
}
VICVectAddr = 0; // 通知中断控制器中断结束
OS_EXIT_CRITICAL();
}
中断模式下
IRQ_Stack_Size EQU 0x00000080
USR_Stack_Size EQU 0x00000400
|
|