是否可以、如果可以、我应如何配置 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个字符后生成的。 如果有更多的数据,我失去了它。 我在进入中断时一直亮起灯、在退出前将其关闭。 在收到每个字符后灯没有闪烁,我认为它应该在这种模式。 当然,我用逻辑分析仪测试了灯的状态,因为我可能不会用自己的眼睛做:-)
好的、我需要再次运行这个示例。
我在这个示例中试验了一点、可能意外地改变了一些东西。
但我觉得中断是在收到16个字符后生成的。
这是一个回声示例。 如果您在终端上只键入一个字符、它将回显该字符、对吧? 这意味着回显之前、它不会等待16个字符接收、而是一个字符将生成中断。
嗯、是的、但我对示例程序执行的功能不感兴趣。 回波没有回波。 我希望在每个字符之后都有一个中断、在本例中我没有看到以这种方式生成它们。
我必须逐字符分析数据流字符、因为发送的字符取决于我的其他操作。 假设我需要检测序列、例如0x01、0x02、0x03、0x04、0x05、 0x06在一个长得多的数据包中传输。 缓冲数据没有任何意义、因为事实可能证明、大部分内容都不会让我感兴趣。
您好!
为什么不只在 UARTIntHandler 中放置断点? 我只是尝试过、在"Terminal"窗口中输入一个字符后、处理器会立即在 ISR 停止。 这意味着中断是在接收到一个字符后生成的。
您好!
如果发送了单个字符、它会在您写入时发生。 即:字符、间隙、字符、间隙等。 然后、实际上、每个字符之后都有一个中断。 但是、如果依次发送多个字符而没有暂停、则在8个字符(1/2 FIFO -默认参数)之后报告中断。 但我似乎已关闭 FIFO。
我希望在流中的每个字符之后都报告一个中断、其中字符之间没有间隙。
我的 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));
尊敬的 Charles:
它开始为我工作了。 我还没有确切地研究使用缓冲和非缓冲指令时发生的情况。 我必须确切地检查它们之间的区别是什么。
只有一个中断被生成的事实是由示例的"while"指令引起的、这是我在我的程序中无意中使用的。
我们正在接近解决问题,但我还有一个疑问,我将尝试解决自己,如果不,我会打扰你一点;-)
好的、现在一切都正常。 从 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 的帮助我还有一个问题、不过可能是新问题