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-TM4C123GXL:TM4C123GH6PM 一些 UART DMA 问题

Guru**** 2478765 points
Other Parts Discussed in Thread: ENERGIA

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691013/ek-tm4c123gxl-tm4c123gh6pm-some-uart-dma-problems

器件型号:EK-TM4C123GXL
主题中讨论的其他器件:Energia

大家好

我正在使用 Energia IDE (版本0101E0017)、我的 TIvaware 修订版本为2.0.1.11577。 我知道它们是相当旧的版本、但它们过去运行良好。 但是、最近我使用了 UART DMA、发现它在功能上不起作用。 希望大家能帮我解决以下问题:

我无法使用 UART7 DMA 将数据传输到另一个 tm4c123gxl launchpad、未接收到字节、但使用 UART0 DMA 时、可以将正确数量的数据传输到我的笔记本电脑。 这是我的代码。 第一部分是工作正常的 UART0 DMA、第二部分是不工作的 UART7 DMA、第三部分是上传到另一个 LaunchPad 的接收部分。

//在基本模式下使用 uart0 DMA,可以传输数据。

#include 
#include 
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/udma.h"
#include "inc/hw_uart.h"

#define TX_buffer_size 256
txBuffer[TX_buffer_size];

// uDMA control strat_zh_zh_clus_clus_zh_clus_cludt_zh_clus_clus_clus_clus_zh_clus_clus_clus_clus_clus_clust_zh_clus_clust_clus_clus_clus_clust_clus_clus_clus_clus_clus_zh_clus_clus_clus_clockt_clus_clus_clus_







对于(uint32_t ui32Idx = 0;ui32Idx < TX_buffer_size;ui32Idx++)
{
txBuffer[ui32Idx]= 65;//'A'
}

UARTConfiguration ();
UDMAConfiguration ();
}

void UARTConfiguration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART0);

GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);

GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

UARTConfigSetExpClk (UART0_BASE、 SysCtlClockGet ()、115200、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

UARTIntEnable (UART0_BASE、UART_INT_TX | UART_INT_RX);

UARTEnable (UART0_BASE);

UARTDMAEnable (UART0_BASE、UART_DMA_RX | UART_DMA_TX);
}

void UDMAConfiguration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
//CtlSysPeripheralSlepEnable (SYSCTL_Periph_UDMA);

uDMAEnable();
uDMAControlBaseSet (&controlTable[0]);

uDMAChannelAssign (UDMA_CH9_UART0TX);

uDMAChannelAttributeDisable (UDMA_CH9_UART0TX、UDMA_ATTR_ALTSELECT | UDMA_ATINC_HIGH_PRIOR_REFERITY | UDMA_REF_TR_UART9_UART0TX





;UART9_UART9_UART9_UART9_UART9_AM_UART9_UART9_UART9_UART9_AM_UART9_UART9_UART9_UART9_UART9_UART9_UART9_AM_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART_U

uDMAChannelEnable (UDMA_CH9_UART0TX);
}

void loop (){}




//在基本模式下使用 uart7 DMA,不传输任何数据。

#include 
#include 
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/udma.h"
#include "inc/hw_uart.h"

#define TX_buffer_size 256
txBuffer[TX_buffer_size];

// uDMA control strat_zh_zh_clus_clus_zh_clus_cludt_zh_clus_clus_clus_clus_zh_clus_clus_clus_clus_clus_clust_zh_clus_clust_clus_clus_clus_clust_clus_clus_clus_clus_clus_zh_clus_clus_clus_clockt_clus_clus_clus_







对于(uint32_t ui32Idx = 0;ui32Idx < TX_buffer_size;ui32Idx++)
{
txBuffer[ui32Idx]= 65;//'A'
}

UARTConfiguration ();
UDMAConfiguration ();
}

void UARTConfiguration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
SysCtlPeripheralEnable (SYSCTL_Periph_UART7);
//SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART7);

GPIOPinConfigure (GPIO_PE0_U7RX);
GPIOPinConfigure (GPIO_PE1_U7TX);

GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1);

UARTConfigSetExpClk (UART7_BASE、 SysCtlClockGet ()、115200、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

UARTFIFOLevelSet (UART7_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

UARTIntEnable (UART7_BASE、UART_INT_TX | UART_INT_RX);

UARTEnable (UART7_BASE);

UARTDMAEnable (UART7_BASE、UART_DMA_RX | UART_DMA_TX);
}

void UDMAConfiguration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
//CtlSysPeripheralSlepEnable (SYSCTL_Periph_UDMA);

uDMAEnable();
uDMAControlBaseSet (&controlTable[0]);

uDMAChannelAssign (UDMA_CH21_UART7TX);

uDMAChannelAttributeDisable (UDMA_CH21_UART7TX、UDMA_ATTR_ALTSELECT | UDMA_ATINC_HIGH_PRIOR_REFERITY | UDMA_TR_REQTX;uDMA_TRUART7_UART7_UART1_UART1_UART7_SDR_UART1_UART1_UART1_T1_SDR_UART1_SDR_UART7_TR_END_UART1_SDR_UART1_SDR_UART1_SDR_UART1_UART1_SDR_UART_PREM_TR_TR_TR_TR_UART1_SDR_UART_PREM_ENTR_UART1_UART1_UART1_UART1_UART1_UART7_TR_UART1_UART1_SD_TR_TR_TR_TR_TR_UART7_UART1_UART1_U







uDMAChannelEnable (UDMA_CH21_UART7TX);
}

void loop(){} 


//此部件供另一个 Launchpad 从 uart7接收数据,然后通过 uart0将数据发送到笔记本电脑 
void setup() { Serial.begin(115200); Serial7.begin(115200); Serial7.setBufferSize(8192,8192); } void loop() { if (Serial7.available ()>0) { char ch = Serial7.read(); serial.write (ch); }

2. 如问题1中所述,即使是正确的数据量也可以传输到笔记本电脑,但有时数据字节会变乱(如图所示)。

乱码数据模式始终为12个字节、字节不会改变其值或位置。 我在基本模式和乒乓模式下进行了一些测试、下面显示了乒乓模式代码。

//乒乓模式,用于 UART 数据发送 

#include #include #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/udma.h" #include "inc/hw_uart.h" #define pingping_buffer_size 128 字节 pingBuffer[pingpbpbpbpbpbpbpbpbpbag_size]; spragma 2mct_zh_clus_clus_zh_clus_clus_clust_zh_clus_clus_clus_clust_zh_clus_clus_clockt_clus_clusbound_zh_clus_clus_clus_clus_clus_clus_clus_clus_clockt_clus_clus_clus_clus_clus_clusbound_clus_clus_zh_ for (uint16_t i = 0;i < pingpong_buffer_size;i++) { pingBuffer[i]= 65;//'a' pongBuffer[i]= 66;//'B' } UARTConfiguration (); UDMAConfiguration (); } void UARTConfiguration () { SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralEnable (SYSCTL_Periph_UART0); //SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART0); GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART0_BASE、 SysCtlClockGet ()、115200、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8); UARTIntRegister (UART0_BASE、UART0IntHandler); UARTIntEnable (UART0_BASE、UART_INT_TX | UART_INT_RX); UARTEnable (UART0_BASE); UARTDMAEnable (UART0_BASE、UART_DMA_RX | UART_DMA_TX); } void UDMAConfiguration () { SysCtlPeripheralEnable (SYSCTL_PERIPH_UDMA); //SysCtlPeripheralSleep Enable (SYSCTL_PERIPH_UDMA); uDMAEnable(); uDMAControlBaseSet (&controlTable[0]); uDMAINC 通道分配(UDMA_CH9_UART0TX); uDMAChannelAttributeDisable (UDMA_CH9_UART0TX、UDMA_ATTR_ALL);uDMAChannelControlSet (UDMA_CH9_UART0TX | UARTPRI_SELECT、UART4_UART9_DMA_UART4_UART9_UART9_UART9_UART_DA_UART9_UART9_UART9_UART9_UART9_AM_UART9_UDA_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UDA_UART9_UDA_UART_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_U (void *)(UART0_BASE + UART_O_DR)、sizeof (pongBuffer)); uDMAChannelEnable (UDMA_CH9_UART0TX); } void UART0IntHandler () { uINT32_t DMAMode; UARTIntClear (UART0_BASE、UART_INT_TX | UART_INT_RX); DMAMode = uDMAChannelModeGet (UDMA_CH9_UART0TX | UDMA_PRI_SELECT); if (DMAMode = UDMA_MODE_STOP) { uDMAChannelTransferSet (UDMA_CH9_UART0TX | UDMA_PRI_SELECT、UDMA_MODE_Pingpong、pingBuffer、(void *)(UART0_BASE + UART_O_DR)、sizeof (pingBuffer); } DMAMode = uDMAChannelMode| UART9_UART9_Select (UART9_DMA) if (DMAMode = UDMA_MODE_STOP) { uDMAChannelTransferSet (UDMA_CH9_UART0TX | UDMA_ALT_SELECT、UDMA_MODE_乓、pongBuffer、(void *)(UART0_BASE + UART_O_DR)、sizeof (pongBuffer)); } void 环路(){}

在两种模式下、通过分别更改 pingpong_buffer_size 和 TX_buffer_size 的值、结果如下所示。

缓冲器大小 基本模式(txBuffer) 位置 乒乓模式(ping 缓冲器) 位置 乒乓模式(乓缓冲器) 位置
128 X (全部为0x65) X X (全部为0x65) X X (全部为0x66) X
256 o 0x88~0x93 X (全部为0x65) X o 0x87~0x92
512 o 0x88~0x93 X (全部为0x65) X X (全部为0x66) X
1024 X (全部为0x65) X X (全部为0x65) X X (全部为0x66) X

在基本模式下、我发现乱码数据似乎出现在同一位置、因此我将 txBuffer 大小减少到128字节、因为128小于136 (0x88)、乱码数据不应出现。 正如预期的那样,当 txBuffer 大小设置为1024时,这些数据不会显示,也不会显示。 太奇怪了!

在乒乓模式下也发生了类似的情况...

感谢您抽出宝贵的时间阅读本 文档、衷心希望大家能帮您解释这些奇怪的字节、如何发生、如何解决此问题以及 UART7 DMA 为何不起作用。

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

    您好!

    这里有两个问题、所以我们首先解决无字节传输问题、就好像我们使其正常工作一样、它可能有助于提供有关问题2发生情况的进一步线索。

    [引用 user="user5286691]1. 我无法使用 UART7 DMA 将数据传输到另一个 tm4c123gxl launchpad、未接收到字节、但使用 UART0 DMA 时、可以将正确数量的数据传输到我的笔记本电脑。 这是我的代码。 第一部分是工作正常的 UART0 DMA、第二部分是不工作的 UART7 DMA、第三部分是上传到另一个 Launchpad 的接收部分。[/QUERPLET]

    您是否能够在 LaunchPad 之间传输 UART0 DMA 数据? 这是我要尝试的第一件事。

    现在我们知道:

    UART0 ->笔记本电脑(正常)

    UART7 -> LaunchPad (失败)

    如果我们可以确认 UART0 -> LaunchPad 也正常、则我们知道 UART7设置存在问题。

    但是、如果您无法在具有已知有效 UART0配置的 LaunchPad 之间传输数据、则我们已解决了该问题、因此您可以接收 LaunchPad。

    另外一件要检查是否可以的事情是通过示波器或逻辑状态分析器检查 UART 线、以确定是否有字节甚至正在输出。

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

    大家好、Ralph Jacobi

    感谢您的快速回复。

    对于因接线错误导致的第一个问题、我要为您浪费时间而道歉。

    我将 PE0 (Rx)连接到 PE0、将 PE1 (TX)连接到 PE1、真是令人尴尬!

    第一个问题已经解决,但第二个问题仍然存在。

    像往常一样、我做了一些测试。 结果如下所示。

    基本模式

    uart7. uart0
    128 X X
    256 X o
    512 o o
    1024 X X

    乒乓模式(uart7 TX)

    uart7 Ping uart7 Pong uart0 ping uart0 pong
    128 X X O (前一条记录显示无异常、可能我没有注意到。) X
    256 o X X o
    512 X X X X
    1024 X X X X

    乱码字节的数量仍然为12字节。

    我对这一点还不了解、希望有人能提供一些信息。

    再次感谢您的帮助!

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

    我们所有人都不必担心接线错误:)

    关于12个垃圾字节问题、我没有基于您目前所展示的内容的即时建议。 在使用 LaunchPad 时、您能否为我提供 CCS 项目以将 UART 传输到 UART0、以便我可以在我的末尾对其进行测试? 我假设如果使用 UART 终端软件、我将能够在 PC 终端上看到垃圾字节、而无需使用 Energia 的第二块 LaunchPad、对吧?

    如果我可以在我的末尾重新创建它、那么我可以更轻松地快速调试并提供解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    这是否仍然是您的未决问题? 您是否能够共享 CCS 工程、以便我可以测试末尾的损坏字节行为?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../uart_5F00_dma.7zHi、

    因为我将 Energia 用于两个 Launchpad、所以可能目前无法为您提供任何 CCS 项目。

    我正在尝试在 CCS 上执行这些代码、但尚未成功(我以前没有使用 CCS 创建任何项目)。

    如果可以、我会首先提供 Energia 项目、尽管它可能无用。

    请告诉我是否可以提供任何其他信息。

    谢谢、我会尽快回复。

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

    我看到、我不确定 Energia 如何与 TivaWare 连接、我曾认为您使用 TivaWare 的其中一个、使用 Energia 的另一个。

    您可能希望在 Energia 论坛上询问是否有人遇到了您观察到的问题: forum.43oh.com/.../

    如果您在 TivaWare 中获得了一个 CCS 工程、但仍观察到相同的问题、请告知我。

    顺便说一下、创建 CCS 项目时、我们始终建议从现有 TivaWare 示例开始、因为该示例将具有正确的基本项目设置和指向 TivaWare 资源的初始链接、您可以针对应用进行扩展。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我在该论坛上看不到任何与 DMA 相关的讨论、这就是我在这里发布问题的原因。

    具有相同配置的 CCS 工程已在今天创建。

    无论在基本模式还是乒乓模式下、一切都正常。

    选择要编程的 CCS IDE 时、似乎不会发生此问题。

    感谢您的建议。