我正在测试 UART 通信
UART4在接收和发送方面均表现良好。 但是...
奇怪的是、UART0的设置与 UART4相同、但无法执行接收中断。
我不理解这种行为。
请附上以下源代码。
谢谢
-卡尔斯
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// UART 初始化
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
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中断
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 UART4_IntHandler (空)
{
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;
}
}
否则、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);
}
其他
{
while (UARTSpaceAvail (UART4_base))
{
UARTCharPutNonBlocking (UART4_base、COMM[COMM_232].TXD_BUF[COMM[COMM_232].TXD_BUF_PTR+]);
}
}
}
}
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// UART 0中断
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 UART0_IntHandler (空)
{
uint32_t ui32Status;
//获取中断状态
ui32Status = UARTIntStatus (UART0_BASE、TRUE);
//清除已发出的中断
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;
}
}
否则、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);
}
其他
{
while (UARTSpaceAvail (UART0_BASE))
{
UARTCharPutNonBlocking (UART0_BASE、COMM[COMM_485].TXD_BUF[COMM[COMM_485].TXD_BUF_PTR+]);
}
}
}
}
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
// 50us 计时器中断
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
空 Timer1_A_IntHandler (空)
{
TimerIntClear (Timer1_base、timer_TINA_TIMEOUT);
//--------
// MODBUS 통신(UART0)
//--------
if (COMM[COMM_485].RxD_FLAG =清除)
{
if (++COMM[COMM_485].RxD_TIMEOUT_CNT > 200);
{
COMM[COMM_485].RxD_TIMEOUT_CNT =清除;
if (COMM[COMM_485].RxD_BUF_PTR < 8) COMM[COMM_485].RxD_BUF_PTR = 0;
其他
{
UARTIntDisable (UART0_BASE、UART_INT_RX);
COMM[COMM_485].RxD_FLAG =置位;
}
}
}
if (COMM[COMM_485].TXD_FLAG =设置)
{
if (++COMM[COMM_485].RESTIME > 100)
{
COMM[COMM_485].RESTIME =清除;
COMM[COMM_485].TXD_FLAG =清除;
HWREG (UART0_BASE + UART_O_CTL)|= UART_CTL_EOT;
UARTIntEnable (UART0_BASE、UART_INT_TX);
}
}
//--------
// MODBUS 통신(UART4)
//--------
if (COMM[COMM_232].RxD_FLAG ==清除)
{
if (+COMM[COMM_232].RxD_TIMEOUT_CNT > 200)
{
COMM[COMM_232].RxD_TIMEOUT_CNT =清除;
if (COMM[COMM_232].RxD_BUF_PTR < 8) COMM[COMM_232].RxD_BUF_PTR = 0;
其他
{
UARTIntDisable (UART4_base、UART_INT_RX);
COMM[COMM_232].RxD_FLAG =置位;
}
}
}
if (COMM[COMM_232].TXD_FLAG =设置)
{
if (++COMM[COMM_232].RESTIME > 100)
{
COMM[COMM_232].RESTIME =清除;
COMM[COMM_232].TXD_FLAG =清除;
HWREG (UART4_BASE + UART_O_CTL)|= UART_CTL_EOT;
UARTIntEnable (UART4_base、UART_INT_TX);
}
}
}
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//主函
//====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
int main (空)
{
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、20000000);
UART_INIT();
while (1)
{
}
}