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.

[参考译文] RTOS:tm4c uDMA 外设接口有问题:UART TX/Rx FIFO

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/609621/rtos-trouble-with-tm4c-udma-peripheral-interface-uart-tx-rx-fifo

主题中讨论的其他器件:TM4C1294NCPDT

工具/软件:TI-RTOS

大家好、  

 我正在使用 tm4c1294ncppdt 板。我想将 UART 与 uDMA 配合使用。数据表显示: 具有由 uDMA 处理的 FIFO 的外设来发送或接收数据。因此我想使用 UART Rx FIFO 来触发 传输请求。 我的问题是 tm4c 没有可用 的 UART FIFO 地址。 FIFO 传输和接收数据的目的是读取和操作 UARTDR 寄存器。  那么,我如何在函数:uDMAChannelTransferSet()中填充 SCR 地址;我只需用 UARTDR 寄存器的地址填充它。我的程序如下所示:

BIOS_getCpuFreq (&sysfreq);

/* UART7 AS RS485_3 */
SysCtlPeripheralEnable (SYSCTL_Periph_UART7);
GPIOPinConfigure (GPIO_PC4_U7RX);
GPIOPinConfigure (GPIO_PC5_U7TX);
GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_4 | GPIO_PIN_5);
UARTConfigSetExpClk (UART7_BASE、sysfreq.lo、波特、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
UARTEnable (UART7_BASE);
UARTIntEnable (UART7_BASE、UART_INT_DMARX);
UARTFIFOLevelSet (UART7_BASE、UART_FIFO_TX1_8、UART_FIFO_RX4_8);
IntEnable (INT_UART7);
UARTDMAEnable (UART7_BASE、UART_DMA_RX);
UARTIntClear (UART7_BASE、UART_INT_DMARX);

SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
uDMAEnable();
uDMAControlBaseSet (&MyDMAControlTable[0]);
uDMAChannelAssign (UDMA_CH20_UART7RX);
uDMAChannelAttributeEnable (UDMA_CH20_UART7RX、UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY);
uDMAChannelControlSet (UDMA_CH20_UART7RX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8 | UDMA_ARB_8 | UDMA_NEW_USEBURST);
uDMAChannelTransferSet (UDMA_CH20_UART7RX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(UART7_BASE + UART_O_DR)、receivebuffer_runtime、UDMA_size_8);  
uDMAChannelEnable (UDMA_CH20_UART7RX);  
uDMAChannelRequest (UDMA_CH20_UART7RX);  

如何使用 UART FIFO 访问 udam SCR 地址?  

如何正确使用带有 UART FIFO 的 UAM? 外设 FIFO 是在突发模式下触发 UDMA 的有效方法、因此我需要提高 UART UDMA 效率的方法。

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

    以下几点:

    -寄存器 UART7_BASE + UART_O_DR 正是您认为"不存在"的样子:一个存储器地址。 就像可用作 DMA 参数的任何其他位置一样。

    -在 DMA 配置上,不应将源增加8。 保持源代码不变、因为您将始终从同一位置执行 DMA 传输。 当然、您需要增加目标、以便每个新传入字节占用缓冲区上的下一个位置。

    此外、我要说、在您的行 UARTIntEnable (UART7_BASE、UART_INT_DMARX)上、参数 UART_INT_DMARX 无效-但这不是 true、它是在 UART.h 上定义的有效参数 因此、TI 研究员、您不应该记录并修复 TivaWare 用户指南的条目30.2.2.30吗?

    最后、我认为您还应该将 UART_INT_RT 添加到中断列表中(但老实说、我不确定、因为我们决定我们的 UART 驱动程序不使用 DMA、因此我们执行此类测试已经有一段时间了)。

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

    布鲁诺的海报提出了几个好的和有效的观点-但我觉得更大的一个仍然"沉默!"

    µDMA 您的目标、"T Ü V S Ü D 敬业 UART"是"最困难"的计划挑战之一。 然而-它会出现-这是您选择的"起点"。   这不是亲吻!    几乎肯定会"过度挑战!" (如您的帖子所述)

    Bruno 在"µDMA 源和目标寻址"方面遇到了困惑、如果您"开始"使用"最简单的外设"、那么您注意到这种情况的可能性会更高。

    您会注意到、"您学到的越多-您理解的越多"-但"kiss"代表(迄今为止)最佳的"实现这一目标的方法!"    登山者(很少)选择 Mt. Kilimanjaro 是"第一次攀登"。    建议"登山者/用户"(此处)寻找一个更简单的"山/外设"、这确实有助于学习和理解...    

    复杂性不是你的朋友-至少不在这里-现在也不是!   吻!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1_MOBILE 和 Bruno、
    非常感谢!
    由于您的提醒、无论是技术方面还是其他方面、我都成功地处理了 UART Rx_TIMEOUT 中断和 UDMA 触发 UART TX。
    在未来、我可能会使用更多 TI 设计的芯片、并且可能会有更多问题。站立在用户中、 我们可能对您在数据表中的描述有误。我们可能会使用许多不同的 MCU 形成不同的制造要素。每个制造要素都有其名称和偏好。当我们首次使用芯片外设时、我们可能会错误地使用它们。 行动胜于言语。
    我将关闭帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您的"肌肉记忆"可能希望在"习惯"变得太深之前用适当的"UDMA"代替(重复)"udam"!   (µDMA  真的)

    海报 Nancy 写道:(真实副本)

    如何处理带有 UART FIFO 的 udam SCR 地址?  

    如何正确使用带有 UART FIFO 的 UAM?