是否可以、如果可以、我应如何配置 TM4C1294XL 评估板上的 UART、以便在接收到每个字符时激活 Rx 中断?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
是否可以、如果可以、我应如何配置 TM4C1294XL 评估板上的 UART、以便在接收到每个字符时激活 Rx 中断?
您好!
请看一下 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\uart_echo 中的 uart_demo 示例。 此示例将在接收到的每个字符上生成中断。 默认情况下、禁用 UART FIFO。 当被禁用并且如果接收中断被启用、每个接收到的字符将生成一个中断。 启用 FIFO 后、您可以配置 FIFO 级别、在哪个级别使用
感谢您的快速回复。
当然、我测试了这个示例、但我感觉中断是在接收到16个字符后生成的。 如果有更多的数据,我失去了它。 我在进入中断时一直亮起灯、在退出前将其关闭。 在收到每个字符后灯没有闪烁,我认为它应该在这种模式。 当然,我用逻辑分析仪测试了灯的状态,因为我可能不会用自己的眼睛做:-)
好的、我需要再次运行这个示例。
我在这个示例中试验了一点、可能意外地改变了一些东西。
嗯、是的、但我对示例程序执行的功能不感兴趣。 回波没有回波。 我希望在每个字符之后都有一个中断、在本例中我没有看到以这种方式生成它们。
我必须逐字符分析数据流字符、因为发送的字符取决于我的其他操作。 假设我需要检测序列、例如0x01、0x02、0x03、0x04、0x05、 0x06在一个长得多的数据包中传输。 缓冲数据没有任何意义、因为事实可能证明、大部分内容都不会让我感兴趣。
我的 UART 的初始化过程如下所示:
g_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
ROM_IntMasterEnable ();
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART (GPIO_PORTA_BASE、GPIO_PIN_0 | GPIO_PIN_1);
ROM_UARTConfigSetExpClk (UART0_BASE、g_ui32SysClock、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
uart_config_PAR_NONE));
UARTTxIntModeSet (UART0_BASE、UART_TXINT_MODE_EOT);
ROM_IntEnable (INT_UART0);
ROM_UARTIntEnable (UART0_BASE、UART_INT_RT | UART_INT_RX);
但是,如果连续发送字符而没有暂停,则在8个字符之后报告中断(半 FIFO -默认参数)。 但我似乎已关闭 FIFO。
我希望在流中每个字符之间没有间隙的字符之后报告一个中断。
您好!
我想原因是在 UARTIntHandler 的示例中、使用了非阻塞调用来读取输入。 此外、ISR 会始终检查 FIFO 中的可用字符。 当您在 ISR 中处理传入数据时、已经有一个新字符在等待。 因此、由于有更多数据可用、因此不会退出 ISR。 如果您查看我的以下修改代码、我更改为使用阻塞调用、而不检查 RXFIFO 中是否有可用字符。 我还添加了一个变量"count"、指示进入 ISR 的次数。 在 Tera 终端中、我输入一个由16个字符组成的字符串。 请看右上角表达式窗口中的 count、count 显示16。 这意味着 ISR 已进入16次。
void UARTIntHandler(void) { uint32_t ui32Status; count++; // // Get the interrrupt status. // ui32Status = ROM_UARTIntStatus(UART0_BASE, true); // // Clear the asserted interrupts. // ROM_UARTIntClear(UART0_BASE, ui32Status); // // Read the next character from the UART and write it back to the UART. // ROM_UARTCharPut(UART0_BASE, ROM_UARTCharGet(UART0_BASE));
好的、现在一切都正常。 从 UART 接收到每个字符后、都会生成中断。 在 ISR 中、我读取字符并将其发送回 UART。
UART 初始化:ISR:
void ini(void) { g_ui32SysClock = MAP_SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); ROM_IntMasterEnable(); GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); ROM_UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 115200, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE)); // Configure the UART for 115,200, 8-N-1 operation UARTTxIntModeSet(UART0_BASE, UART_TXINT_MODE_EOT); ROM_IntEnable(INT_UART0); ROM_UARTIntEnable(UART0_BASE, UART_INT_RT|UART_INT_TX); }
ISR:
void UARTIntHandler(void) { uint32_t ui32Status; int32_t ReadChar; ui32Status = ROM_UARTIntStatus(UART0_BASE, true); ROM_UARTIntClear(UART0_BASE, ui32Status); ReadChar=ROM_UARTCharGet(UART0_BASE); //Read character from UART ROM_UARTCharPut(UART0_BASE,ReadChar); //Put character to UART }
谢谢 Charles 的帮助我还有一个问题、不过可能是新问题