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.

[参考译文] MSP430F5659:寻求 UART 中断模式帮助以发送和接收大型数据集

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1310913/msp430f5659-seeking-help-with-uart-interrupt-mode-for-transmitting-and-receiving-large-data-sets

器件型号:MSP430F5659
主题中讨论的其他器件:MSPM0G3507

您好、TI 社区:

我目前正在从事一个项目、涉及在 TI 平台上以中断模式实现 UART 通信。 我正在使用 MSP430微控制器、在处理数据的发送和接收方面需要帮助、尤其是在处理最多256字节的数据集时。

以下是我询问的要点:

  1. 初始化和配置: 为在中断模式下设置 UART 通信、我想获得有关正确初始化和配置步骤的指导。

  2. 中断服务例程(ISR): 我应该如何组织 ISR 以用于发送和接收数据? 在使用大型数据集(高达256字节)时、是否有任何最佳实践或具体注意事项?

  3. 缓冲区管理: 考虑到可能高达256字节的大小、管理数据缓冲区的推荐方法是什么? 我是否应该实现循环缓冲器、如果是、最佳大小是多少?

  4. 错误处理: 是否应该实施特定的错误处理技术、尤其是在处理长数据传输和接收时?

我非常感谢可以帮助我有效解决这一难题的任何见解、代码片段或相关文档的引用。

提前感谢您的帮助。

基尔

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

    您是否看过 Resource Explorer 中的示例? 这些资源可帮助您快速入门。

    虽然不是 TI、但这是一个很好的参考:

    http://www.simplyembedded.org/tutorials/msp430-uart/

    至于缓冲区大小、这取决于您的应用以及您对数据的期望速度。 但也有错误。

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

    感谢您的答复。 我希望发送一组大约112640字节的更大数据、并且在尽可能短的时间内、与接收相同。

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

    问题是您处理数据的速度有多快。 如果字节每秒出现一次、即使没有缓冲区、MCU 也可以处理它们。 如果它们的速度为每秒4 MB、那么无论是否有缓冲器、MCU 都可能无法满足要求。

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

     当我从软件获得请求时、我需要通过 UART 与软件进行通信。 因此、这不是一个任务关键型系统、我只需要在尽可能短的时间内将数据发送到软件即可。  如果 我逐字节发送数据、需要花费更多的时间。 因此、我可能需要发送块性消息、记住该错误。我可能需要发送 CRC 来验证数据的有效性。 如果数据是 112640字节并且我逐字节发送数据、则需要的时间要多得多、所以我的问题是我能否发送数据块、比如256字节等。  你明白我的观点了吗?  

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

    如果将其排列正确、发送数据"逐字节"所需的时间不应超过发送256字节块、但可以进行设置以自动发送数据块。 下面是我的字符串发送例程:

    起步阶段:

    void StartSerialTX(char *str) {
    
      while (TXChar != -1) {
        // wait for previous tx to finish
        Delay(10);
      }
    
      strcpy(TXData, str);
    
      TXChar = 0;
    
      DL_UART_Main_transmitData(UART_0_INST, TXData[TXChar++]);
    }

    以及中断:

    void UART_0_INST_IRQHandler(void) {
      switch (DL_UART_Main_getPendingInterrupt(UART_0_INST)) {
    
      case DL_UART_MAIN_IIDX_RX:
        RXdata = DL_UART_Main_receiveData(UART_0_INST);
        // DL_UART_Main_transmitData(UART_0_INST, RXdata);
        break;
    
      case DL_UART_MAIN_IIDX_TX:
        if (TXData[TXChar] != '\0') {
          DL_UART_Main_transmitData(UART_0_INST, TXData[TXChar++]);
        } else {
          TXChar = -1;
        }
    
        break;
    
      default:
        break;
      }
    }

    其中 TXChar 是字符串的索引(-1和0也是符号值)、TXData 是数据数组。

    这适用于 MSPM0G3507、但您要为任何 MSP 执行类似的操作、请查看器件的示例。

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

    理论上可以使用软件(逐字节)全速运行 UART、但这并不容易。 我想您需要的是 DMA、它使用硬件来快速为 TXBUF 和 RXBUF 提供服务。 DMA 可以在一个块中传输高达64KB (DMASZ 寄存器)的数据、但如果只使用64KB SRAM、则无法实现这一点。

    Tx 端很简单:将字节放入存储器、设置 DMAEN=1、然后在 ISR 中识别完成。

    由于 Rx 希望在固定大小的块中运行、DMA 侧可能需要更多的工作。 如果 Rx 块的大小各不相同(或者如果您允许字节丢失)、您需要实现超时来处理短块。 使用 DMA 和 Rx 逐字节执行 Tx 是没有原因的。

    您可以从下面的 TI 示例 msp430f665x_dma_02.c 中了解一些机制:

    https://dev.ti.com/tirex/explore/node?node=A__AOA7HJs5vP6JteXGeExmkQ__msp430ware__IOGqZri__LATEST

    此示例使用计时器来测量字节(每秒4个)、这不是常规的方法、但您可以看到涉及到哪些寄存器。