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.

[参考译文] TM4C1294NCPDT:通过 RS232接收数据、并使用 FIFO 和 RX IRQ

Guru**** 2470720 points
Other Parts Discussed in Thread: TM4C1294NCPDT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/676527/tm4c1294ncpdt-receive-data-over-rs232-and-using-fifo-and-rx-irq

器件型号:TM4C1294NCPDT

我将 TM4C1294NCPDT 与 CCS 6.1.2和 TIRTOS 2.16.0.08搭配使用。

在 TM4C1294NCPDT 上、我正在使用 UART0、并希望使用 FIFO 和 IRQ 从 RS232器件接收数据。 在我的测试中、我看到、如果 FIFO 关闭、我每次从 RS232设备获取字符时都可以启用 IRQ 并获得中断。  如果我打开 FIFO、我可以将 FIFO 的级别设置为在生成 IRQ 之前达到的级别。  如果我使用将 FIFO 设置为最低级别

#define UART_FIFO_TX1_8         0x00000000  // 1/8满时的发送中断

我在每个其他字符上都有 IRQ、因此、如果我收到一个奇数或字符、我将不会获得中断来了解如何读取 RS232器件的最后一个字符。

目前、我通过禁用 FIFO 来使其工作、但如果由于任何原因软件在接收到下一个字符之前延迟读取数据、那么禁用 FIFO 会导致缺少字符的风险。

 

一些代码:

  ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

  ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

  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、

                                           EE_prom_rs232GenCfg.baudate、// 19200、//115200、//9600、

                          (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

  UARTFIFODisable (UART0_BASE);//如果 FIFO 关闭、这将中断每个字符。

  UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);//如果使用 FIFO、这将每2个字符中断一次。

  ERROR_INIT (&EB);

  Hwi_Params_init (hwiParams);

  myHwi = Hwi_create (INT_UART0_TM4C129、RX232_IrqCallback、&hwiParams、&EB);

UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_TX);

 

我更喜欢使用 IRQ 和 FIFO、并且能够在接收到的每个字符上获得 IRQ。

 

我缺少什么吗?

 

谢谢、

道格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Doug、
    FIFO 中有16个条目。 如果配置1/8的 FIFO 来生成中断、那么只要 FIFO 中仍有两个或更少的数据、您很可能会看到现在看到的内容。 您能否尝试使用 UART_TXINT_MODE_EOT 以便在 FIFO 中的最后一个数据完全传输时生成中断?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不仅适用于微控制器的 TX 吗? 我不想错过从另一个器件接收到的 char。

    我尝试了以下操作、但没有任何不同。
    UARTTxIntModeSet (UART0_BASE、UART_TXINT_MODE_EOT);

    道格
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Doug、
    在您已经尝试的情况下禁用 FIFO 是一个选项。 是否尝试根据接收 FIFO 达到指定阈值而不是发送 FIFO 达到水线位来生成中断? 在 ISR 中、您可以尝试以下操作以确保从接收 FIFO 中读取的所有数据。 还有一个接收超时中断、您可以使用它来确保接收 FIFO 中没有在计时器过期之前未读的数据。

    while (!UARTCharsAvail (UART0_BASE))


    //
    //获取接收 FIFO 中的字符。
    //
    while (UARTCharGetNonBlocking (UART0_BASE))

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我确实以这种方式实现了 IRQ、在这里我获得一个 RX IRQ 并在 FIFO 为空前进行读取。  

    while (UARTCharsAvail (UART0_BASE))

    rxChar =(char) UARTCharGetNonBlocking (UART0_BASE);

    问题是微读取第一个 char 的速度太快了第二个 char 还没有在缓冲区中、所以我没有得到第二个 char。  我正在考虑使用 FIFO、因此我不会错过任何东西、只需进行轮询、或者可以使用我现在使用 IRQ 的方法、只需关闭 FIFO。

    道格

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Doug、
    还有接收超时中断(UART_INT_RT)、可确保在计时器过期之前接收 FIFO 中没有未读的数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢你的帮助。  在与 Doug 交谈时、他成功地实施了这项计划、尽管目前还没有正式的资格认证和扩展测试。  总之、选择的是 IRQ 方法而不是 FIFO 实现(我们都想知道用户是否在基于 TM4C Tiva 的系统中实现了这两种方法?)。  此后,一个任务可以通过调用 SendNonBlockingRS232()来发送数据,然后 IRQ 将根据需要处理其余字符的发送。 也就是说、接收字符出现在 IRQ 中、并在找到终止字符之前进行缓冲; 然后根据需要处理缓冲数据。

    当然、我们欢迎您提出任何其他意见或反馈。  我已将代码片段转发给您以供参考、并且还可以将其粘贴到该主题中、以便在我们熟悉其内容后进行进一步审阅、或许可以与可能有兴趣查看示例的其他人分享。

    Ty、

    Chris