先上代码:
//*****************************************************************************
//
// The UART interrupt handler.
//
//*****************************************************************************
void
UARTIntHandler(void)
{
uint32_t ui32Status;
unsigned char Temp = 0;
//
// Get the interrrupt status.
//
ui32Status = ROM_UARTIntStatus(UART0_BASE, true);
//
// Clear the asserted interrupts.
//
ROM_UARTIntClear(UART0_BASE, ui32Status);
//
// Loop while there are characters in the receive FIFO.
//
while(ROM_UARTCharsAvail(UART0_BASE))
{
switch(STE)
{
case 0:
{
Temp=ROM_UARTCharGetNonBlocking(UART0_BASE);
if(Temp==0xA5){DATA_OK=0;STE=1;}
else{STE=0;}
}break;
case 1:
{
Temp=ROM_UARTCharGetNonBlocking(UART0_BASE);
if(Temp==0x5A){STE=2;} else{STE=0;}
}break;
case 2:
{
Temp=ROM_UARTCharGetNonBlocking(UART0_BASE);
if((Temp==0x11)||(Temp==0x04)||(Temp==0x05))
{
cDATA[0]=Temp;
COUNT_M=Temp;
UART_COUNT=COUNT_M-1;
STE=3;
}
else{STE=0;COUNT_M=UART_COUNT=0;}
}break;
case 3:
{
cDATA[COUNT_M-UART_COUNT]=ROM_UARTCharGetNonBlocking(UART0_BASE);
if(UART_COUNT==2){STE=4;}
else{UART_COUNT--;}
}break;
case 4:
{
Temp=ROM_UARTCharGetNonBlocking(UART0_BASE);
if(Temp==0x12){STE=5;COUNT_M=UART_COUNT=0;}
else{STE=0;}
}break;
case 5:
{
Temp=ROM_UARTCharGetNonBlocking(UART0_BASE);
if(Temp==0x34){STE=6;}
else{STE=0;}
}break;
case 6:
{
ROM_UARTCharGetNonBlocking(UART0_BASE);
DATA_OK=1;
STE=0;
}break;
default:break;
}
}
}
然后,附上UART0配置:
//
// Enable the peripherals used by this example.
//
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//
// Set GPIO A0 and A1 as UART pins.
//
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//
// Configure the UART for 9,600, 8-N-1 operation.
//
ROM_UARTConfigSetExpClk(UART0_BASE, ROM_SysCtlClockGet(), 9600,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
ROM_UARTFIFOEnable(UART0_BASE);
ROM_UARTFIFOLevelSet(UART0_BASE,UART_FIFO_TX4_8, UART_FIFO_RX1_8);
ROM_IntMasterEnable();
ROM_IntEnable(INT_UART0);
ROM_UARTIntEnable(UART0_BASE, UART_INT_RX );
IntPrioritySet(INT_UART0, 0x00);
简单的执行程序,是可以正确接收到数据。
BUT,当我同时读取MPU6050并通过DCM解算欧拉角时,(在MAIN函数中while 1 循环读取MPU6050,然后定时器中断中进行DCM更新,并求Eulers,200Hz)
问题来了:
1 ) cDATA[ ]数组中的值竟然会发生变化,即使发送端没有发送任何UART信号。也没有对数组做任何操作。
2) 当我开始发送信号,能读回前几位,然而后面就不对了,而且会卡在STE=3。
3) 持续发送信号,出错,进入死循环
FaultISR(void)
{
//
// Enter an infinite loop.
//
while(1)
{
}
}
。。。
在排查问题的时候,我把更新DCM的定时器关了,即不进行200Hz的姿态解算,UART接收正常了。。发送停止时,数组也不会乱跳。
我已经把UART中断优先级放到最高,然后是I2C,再是TIMER。
系统时钟16M,没有用PLL,FPU已使能。
不知道问题出在哪了,求高手解答...
PS: UART发送格式:A5 5A 11 XX XX XX XX XX XX XX XX XX XX XX XX XX 12 34 XX;
状态机自己写的,很有可能有漏洞,请高手指点..如果有TI官方的UART 连续 接收 程序就更好了,在此我不关心发送。。