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.

[参考译文] EK-TM4C1294XL:TM4C1294XL 中的 UART

Guru**** 1744610 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1249905/ek-tm4c1294xl-uarts-in-tm4c1294xl

器件型号:EK-TM4C1294XL

是否可以、如果可以、我应如何配置 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 的帮助我还有一个问题、不过可能是新问题