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.

[参考译文] AM13E23019:在启用 DMA 之前观察到 UART DMA 问题 TXIFG

Guru**** 2943350 points

Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1651628/am13e23019-uart-dma-issue-txifg-observed-before-enabling-dma

部件号: AM13E23019
Thread 中讨论的其他器件: UNIFLASH

你(们)好  

我观察到 DMA 配置存在的问题。  
目标

使用 DMA 从 txbuffer 发送数据、并使用 DMA 将数据接收到 rxbuffer 中。 我不使用 Tx 和 Rx FIFO 阈值。  

UART5 的配置(指定重要和非默认值)

  • 波特率:5M
  • RX 超时中断计数 :15  
  • DMA RX 触发器:UART RX 中断
  • DMA TX 触发器:UART TX 中断
  • TX 引脚:A22 | Rx 引脚:A10 | UC5

TX DMA: APP_DMACH_UC5_TX


RX DMA:APP_DMACH_UC5_RX  

 

 
#define MML_TX_BUFFER_SIZE (90)
#define MML_RX_BUFFER_SIZE (128)

uint8_t txbuffer[MML_TX_BUFFER_SIZE] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15, 16, 17,
                                                18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
                                                36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
                                                54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
                                                72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89};
uint8_t rxbuffer[MML_RX_BUFFER_SIZE];

int main()
{
    Diag_InitCounters(); // Clear the counters used for debugging 
    
    Device_Init();

    /* Resetting the DMA Channels */
    DL_DMA_resetChannel(APP_DMACH_UC5_TX_DMA_INST, APP_DMACH_UC5_TX_CHANNEL_ID);
    DL_DMA_resetChannel(APP_DMACH_UC5_RX_DMA_INST, APP_DMACH_UC5_RX_CHANNEL_ID);

    DL_UART_reset(APP_UART_0_INST);
    SYSCFG_DL_init();
    
    /* Clear TX and RX Fifo */
    UC5_UART->IFLS |=  0x88;

    /* Clearing all pending interrupts for UART */
    DL_UART_clearInterruptStatus(APP_UART_0_INST, 0xFFFFFFFF);

    /* TX DMA Configuration */
    DL_DMA_setSrcAddr(APP_DMACH_UC5_TX_DMA_INST, APP_DMACH_UC5_TX_CHANNEL_ID, (uint32_t)txbuffer);
    DL_DMA_setDestAddr(APP_DMACH_UC5_TX_DMA_INST, APP_DMACH_UC5_TX_CHANNEL_ID, (uint32_t)&UC5_UART->TXDATA);
    DL_DMA_setTransferSize(APP_DMACH_UC5_TX_DMA_INST, APP_DMACH_UC5_TX_CHANNEL_ID, MML_TX_BUFFER_SIZE);
    DL_DMA_enableChannel(APP_DMACH_UC5_TX_DMA_INST, APP_DMACH_UC5_TX_CHANNEL_ID);

    /* RX DMA Configuration */
    DL_DMA_setSrcAddr(APP_DMACH_UC5_RX_DMA_INST, APP_DMACH_UC5_RX_CHANNEL_ID, (uint32_t)&UC5_UART->RXDATA);
    DL_DMA_setDestAddr(APP_DMACH_UC5_RX_DMA_INST, APP_DMACH_UC5_RX_CHANNEL_ID, (uint32_t)rxbuffer);
    DL_DMA_setTransferSize(APP_DMACH_UC5_RX_DMA_INST, APP_DMACH_UC5_RX_CHANNEL_ID, MML_RX_BUFFER_SIZE);
    DL_DMA_enableChannel(APP_DMACH_UC5_RX_DMA_INST, APP_DMACH_UC5_RX_CHANNEL_ID);

    /* For Logic Analyser Time Marking */
    BSP_AM13E230_E2::Debug10Pin_Low();
    DEVICE_DELAY_MS(100);
    BSP_AM13E230_E2::Debug10Pin_High();
    DEVICE_DELAY_MS(100);
    BSP_AM13E230_E2::Debug10Pin_Low();

    soft_timer1.Start(); /* 1ms loop */
    soft_timer2.Start(); /* 10ms loop */
    soft_timer3.Start(); /* 100ms loop */
    soft_timer4.Start(); /* 1000ms loop */
    
    // DL_UART_disable(APP_UART_0_INST);
    // DL_UART_enableDMATransmitEvent(APP_UART_0_INST);
    // DL_UART_enable(APP_UART_0_INST);

    LOG("Entering While Loop \r\n");
    while (1)
    {
        g_diagCounters.mainLoopCnt++;
        
        /* Run all timers periodically */
        us32 currentTime = Millis::GetMs();
        soft_timer1.PeriodicRun(currentTime);
        soft_timer2.PeriodicRun(currentTime);
        soft_timer3.PeriodicRun(currentTime);
        soft_timer4.PeriodicRun(currentTime);
    }
    return 0;
}



我通过在一秒循环中调用此函数来触发 UART DMA  

DL_UART_transmitData(APP_UART_0_INST, txbuffer[0]);



我首次使用 UART Tx DMA 进行测试、发现以下问题  

  •  在初始化过程中启用 DMA 后、DMA 就会开始发送数据。 它应该会等待、直到我手动发送一个字节开始触发以进一步发送缓冲区。 在使能通道完成之前、我在检查调试模式时检查了中断标志并设置了 TXIFG 标志。  
  • 不知道它是否相关、但如何 3 Launchpad 调试器部分(MCU 正常)在调试 UART DMA 时已损坏 (1- E1 Launchpad、2- E2 Launchpad)  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dheeraj:

    在 UC-UART 的 IFLS.TXIFLSEL 字段中、您配置了哪种 TX FIFO 级别设置? 这是将触发 TX DMA 的条件。 我认为 TX FIFO 级别的默认选择为“未满“。 一旦存在 TX FIFO 空条件、UC_TX 触发确实会被标记、这是启动时的情况。 启用 DMA 后、触发器会传播到 DMA、传输开始。 这实际上是预期行为。 我建议等待为 UX_TX DMA 启用 DMA 通道、直到您为第一次 UART 发送做好准备。  

    不知道它是否相关、但如何 3 Launchpad 调试器部分(MCU 正常)在调试 UART DMA (1- E1 Launchpad、2- E2 Launchpad) 时出错
     

    您能详细说明一下上述情况吗? “你说什么? 请注意、有时在执行许多重新编译/重新加载/重新启动序列后、可能必须完全重新连接调试器。  

    此致、

    Delaney

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

    另请注意、启用 DMA 后、您不必对 TX FIFO 进行软件写入。 如果同时让 DMA 和 CPU 写入 TX 缓冲区、您可能会看到一些损坏或乱序的数据。 我建议首先使所有内容都按预期运行(仅限写入) DL_UART_transmitData 、然后迁移到 DMA 方法并查看行为是否匹配。 不希望同时使用 DMA 和非 DMA 代码。  

    此致、

    Delaney

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

    我正在调试 UART 代码、LP 停止进入调试模式、但 MCU 正常、因为 LED 仍在闪烁。 我收到以下错误

    当我尝试使用 uniflash 时  
     



    此时尝试使用调试器  

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

    我必须像在实际应用中一样、在配置本身期间使其保持启用状态、我使用多个 DMA 来实现自定义协议。 以下是一些详细信息。 我先只讨论发送部分。 我实施了以下 DMA。
    1.主 DMA(软件触发器)在单次触发模式下启动 24us 计时器。 这用于自定义协议实现)

    2.开始通信(由主器件 DMA 触发、单次模式、 修复 ADD 至 FIX ADD、  将 TX 缓冲区的第一个字节写入 TXDATA、以便下一个 DMA 可以发送数据)

    3. UC5 发送(由 UC5_TX 触发、阻止添加至固定添加、将数据从 txBuffer[1]写入 TXDATA。 现在可以进一步进行通信)

    设置可以正常工作、但在 UC5 传输启用后、第一帧就会发送出去。 我不想发生这种情况。 我想在填满 txbuffer 后通过软件触发主 DMA 时将其启动。  

    我本可以向您发送一些逻辑分析仪时序事件、但我的电路板正在变得很糟糕、因此我现在只限制了可进行实验的电路板数量。  

    在 UC-UART 的 IFLS.TXIFLSEL 字段中、您配置了哪种 TX FIFO 级别设置?  
    默认值、即无阈值

    我建议等待为 UX_TX DMA 启用 DMA 通道、直到您为第一次 UART 发送做好准备。  
    在 SDK 中、没有 DMA UART TX 和 RX 的示例。  
    DMA 启用和触发器有 2 个不同的方面、我只能通过触发器控制 DMA。 当我启用 DMA 通道时、它不应该触发(我理解为什么它会像您在上一篇文章中所解释的那样被触发)。 正如您提到的,我不应该手动发送它,我这样做是为了 UC5 发送 DMA 将获得触发器并开始通信。  
    你能告诉我的应用程序的替代 approcach 吗?  
    我的意思是用 DMA 传输、什么是触发器、如何启动 DMA?

    在编写此内容时、我认为我应该使用启动通信 DMA 操作来启用 UC5 传输 DMA、而不是在配置期间执行该操作。 请确认、如果可能、请在一些线程中添加 UART DMA 示例、直到推出新 SDK

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

    尊敬的 Dheeraj:

    您是否可以按照此常见问题解答中的以下步骤操作:

     【常见问题解答】AM13E23019:无法连接 AM13x 设备。 连接目标错误–615 

    这将帮助您解决调试器连接错误。

    此致、
    Shaunak

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

    嗨、Shaunak
    对我来说、它没有显示任何脚本

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

    尊敬的 Dheeraj:

     您使用的是哪个版本的 CCS? AM13E230x LP 是否在按住 BSL 按钮的情况下连接到您的笔记本电脑?

    此致、
    Shaunak

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

    您好、Shaunak、之前通过 USB 连接、但未使用 AM13.ccxml 文件连接到目标。  

    连接后、它开始显示脚本、通过执行步骤修复电路板、谢谢