I am testing UART communication
UART4 works well for both recieve and transmit. but..
Strangely, UART0 is set the same as UART4, but receive interrupt can not be executed.
I do not understand this behavior.
Attach the source code below.
thanks
-karls
//==============================================================================
// UART Initialize
//==============================================================================
void UART_INIT(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART4);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
GPIOPinConfigure(GPIO_PA2_U4RX);
GPIOPinConfigure(GPIO_PA3_U4TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3);
UARTConfigSetExpClk(UART0_BASE, ui32SysClock, 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
UARTConfigSetExpClk(UART4_BASE, ui32SysClock, 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX1_8, UART_FIFO_RX1_8);
//UARTTxIntModeSet(UART0_BASE, UART_TXINT_MODE_FIFO);
UARTFIFOEnable(UART0_BASE);
UARTFIFODisable(UART0_BASE);
//UARTFIFOLevelSet(UART4_BASE, UART_FIFO_TX1_8, UART_FIFO_RX1_8);
//UARTFIFOEnable(UART4_BASE);
UARTFIFODisable(UART4_BASE);
IntEnable(INT_UART0);
//UARTIntDisable(UART0_BASE, UART_INT_RX | UART_INT_TX);
UARTIntEnable(UART0_BASE, UART_INT_RX);
IntEnable(INT_UART4);
//UARTIntDisable(UART4_BASE, UART_INT_RX | UART_INT_TX);
UARTIntEnable(UART4_BASE, UART_INT_RX);
}
//==============================================================================
// UART 4 interrupt
//==============================================================================
void UART4_IntHandler(void)
{
uint32_t ui32Status;
ui32Status = UARTIntStatus(UART4_BASE, true);
UARTIntClear(UART4_BASE, ui32Status);
if(ui32Status & UART_INT_RX)
{
while(UARTCharsAvail(UART4_BASE))
{
COMM[COMM_232].RxD_TIMEOUT_CNT = 0;
COMM[COMM_232].RxD_BUF[COMM[COMM_232].RxD_BUF_PTR] = UARTCharGetNonBlocking(UART4_BASE);
if(++COMM[COMM_232].RxD_BUF_PTR >= 100) COMM[COMM_232].RxD_BUF_PTR = 0;
}
}
else if(ui32Status & UART_INT_TX)
{
if(COMM[COMM_232].TxD_BUF_PTR > COMM[COMM_232].TxD_END_PTR)
{
COMM[COMM_232].TxD_BUF_PTR = 0;
UARTIntDisable(UART4_BASE, UART_INT_TX);
UARTIntEnable(UART4_BASE, UART_INT_RX);
}
else
{
while(UARTSpaceAvail(UART4_BASE))
{
UARTCharPutNonBlocking(UART4_BASE, COMM[COMM_232].TxD_BUF[COMM[COMM_232].TxD_BUF_PTR++]);
}
}
}
}
//==============================================================================
// UART 0 interrupt
//==============================================================================
void UART0_IntHandler(void)
{
uint32_t ui32Status;
// Get the interrupt status
ui32Status = UARTIntStatus(UART0_BASE, true);
// Clear the asserted interrupt
UARTIntClear(UART0_BASE, ui32Status);
if(ui32Status & UART_INT_RX)
{
while(UARTCharsAvail(UART0_BASE))
{
COMM[COMM_485].RxD_TIMEOUT_CNT = 0;
COMM[COMM_485].RxD_BUF[COMM[COMM_485].RxD_BUF_PTR] = UARTCharGetNonBlocking(UART0_BASE);
if(++COMM[COMM_485].RxD_BUF_PTR >= 100) COMM[COMM_485].RxD_BUF_PTR = 0;
}
}
else if(ui32Status & UART_INT_TX)
{
if(COMM[COMM_485].TxD_BUF_PTR > COMM[COMM_485].TxD_END_PTR)
{
COMM[COMM_485].TxD_BUF_PTR = 0;
UARTIntDisable(UART0_BASE, UART_INT_TX);
UARTIntEnable(UART0_BASE, UART_INT_RX);
}
else
{
while(UARTSpaceAvail(UART0_BASE))
{
UARTCharPutNonBlocking(UART0_BASE, COMM[COMM_485].TxD_BUF[COMM[COMM_485].TxD_BUF_PTR++]);
}
}
}
}
//==============================================================================
// 50 us timer interrupt
//==============================================================================
void Timer1_A_IntHandler(void)
{
TimerIntClear(TIMER1_BASE, TIMER_TIMA_TIMEOUT);
//--------------------
// MODBUS 통신 (UART0)
//--------------------
if(COMM[COMM_485].RxD_FLAG == CLEAR)
{
if(++COMM[COMM_485].RxD_TIMEOUT_CNT > 200);
{
COMM[COMM_485].RxD_TIMEOUT_CNT = CLEAR;
if(COMM[COMM_485].RxD_BUF_PTR < 8) COMM[COMM_485].RxD_BUF_PTR = 0;
else
{
UARTIntDisable(UART0_BASE, UART_INT_RX);
COMM[COMM_485].RxD_FLAG = SET;
}
}
}
if(COMM[COMM_485].TxD_FLAG == SET)
{
if(++COMM[COMM_485].RESTIME > 100)
{
COMM[COMM_485].RESTIME = CLEAR;
COMM[COMM_485].TxD_FLAG = CLEAR;
HWREG(UART0_BASE + UART_O_CTL) |= UART_CTL_EOT;
UARTIntEnable(UART0_BASE, UART_INT_TX);
}
}
//--------------------
// MODBUS 통신 (UART4)
//--------------------
if(COMM[COMM_232].RxD_FLAG == CLEAR)
{
if(++COMM[COMM_232].RxD_TIMEOUT_CNT > 200)
{
COMM[COMM_232].RxD_TIMEOUT_CNT = CLEAR;
if(COMM[COMM_232].RxD_BUF_PTR < 8) COMM[COMM_232].RxD_BUF_PTR = 0;
else
{
UARTIntDisable(UART4_BASE, UART_INT_RX);
COMM[COMM_232].RxD_FLAG = SET;
}
}
}
if(COMM[COMM_232].TxD_FLAG == SET)
{
if(++COMM[COMM_232].RESTIME > 100)
{
COMM[COMM_232].RESTIME = CLEAR;
COMM[COMM_232].TxD_FLAG = CLEAR;
HWREG(UART4_BASE + UART_O_CTL) |= UART_CTL_EOT;
UARTIntEnable(UART4_BASE, UART_INT_TX);
}
}
}
//==============================================================================
// Main
//==============================================================================
int main(void)
{
ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480), 20000000);
UART_INIT();
while(1)
{
}
}