主题中讨论的其他器件:EK-TM4C129EXL、
我们在 EK-TM4C129EXL 上运行 TM4C129ENCPDT、并尝试在电路板和运行 PuTTY 的 PC 之间发送和接收字符。
我们正在使用电路板的 ICDI 虚拟 UART、跳线设置正确、并且位于 C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c129exl\UART_echo 的 TivaWare 示例程序工作正常。 该程序不使用中断。 它只是在循环中运行、在接收器可用时从接收器读取字符并将其写回发送器。
现在、我们要使用我们基于中断的代码。 接收中断工作正常。 发送中断永远不会被触发。 因此、字符会被正确接收和处理、但字符不会被传输。
如果我们将发送代码从中断处理程序中取出、并将其粘贴到程序的主循环中、则该程序将按预期工作、处理接收的中断处理、但轮询发送的处理。 我们还需要基于中断进行传输。 不仅如此、由于我们不是始终进行传输、而是突发传输、因此我们需要在任何内容被放入软件缓冲区后立即启用传输中断、并且在软件缓冲区变为空时需要将其禁用。 但现在我们只是告诉它始终被启用、只是为了使它正常工作。
我们已经尝试过具有各种水线位的 UARTFIFOEnable()和 UARTFIFOLevelSet(),但这没有什么不同。 我们已经尝试过 UARTFIFODisable(),但这也不起作用。
这是初始化代码:
void SetupUart0 (void)
{
global.SysClockFreqHz = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、SYSTEM_CLOCK_FREQ_Hz);
SysCtlPeripheralEnable (GPIO_Porta_base);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
while (SysCtlPeripheralReady (SYSCTL_Periph_UART0)!= true)
{
}
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk (UART0_BASE、Global. SysClockFreqHz、115200、(UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE | UART_CONFIG_WLEN_8));
//将 UART 设置为在 Tx FIFO 几乎为空或接收到任何字符时中断
//UARTFIFOEnable (UART0_BASE);
//UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);
IntEnable (INT_UART0);
UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT | UART_INT_TX);
}
注释代码不能通过 FIFO 尝试不同的操作。
这是中断处理程序:
空 Uart0InterruptHandler (空)
{
uint32_t InterruptFlags;
InterruptFlags = UARTIntStatus (UART0_BASE、false);
UARTIntClear (UART0_BASE、InterruptFlags);
IF (InterruptFlags & UART_INT_TX)
{
// Tx FIFO 中的空间
while (UARTSpaceAvail (UART0_BASE))
{
UARTCharPutNonBlocking (UART0_BASE、BufGet (&Tx));
}
}
IF (InterruptFlags &(UART_INT_RX | UART_INT_RT))
{
// Rx FIFO 中的数据
while (UARTCharsAvail (UART0_BASE))
{
BufPut (&Rx、UARTCharGetNonBlocking (UART0_BASE));
}
}
}
正如我说过的、从中断处理程序中删除带有 UARTSpaceAvail ()和 UARTCharPutNonBlocking ()的 while 循环并将其放入主循环中会使代码正常工作、但随后会轮询发送、而不是基于中断。
初始化后、寄存器包含以下内容: