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.

[参考译文] CCS/CC3200:每20ms 使用 UDMA 通过 UART 发送数据

Guru**** 2442090 points
Other Parts Discussed in Thread: CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/818147/ccs-cc3200-sending-data-over-uart-using-udma-at-every-20ms

器件型号:CC3200

工具/软件:Code Composer Studio

大家好、

我正在使用 cc3200 wifi - launchpad。我每20毫秒就会在通过 UART 发送数据时遇到问题。 使用 UDMA 发送数据。 我可以连续发送数据、但我需要将 DMA 传输速率降低到每20ms 一次。 总数据传输大小为368字节。 我尝试配置硬件计时器并从 ISR 触发 DMA 传输。 但启用 DMA TX 时,计时器中断不会发生。 我很难解决这个问题。 请尽快帮助我解决此问题。   

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

    您好!

    您的代码是基于 SDK 中的一个示例(例如 UART_DEMO 项目)、还是从头开始使用您自己的 UART + DMA 代码?

    此外、您如何实现20ms 延迟的高电平 UART 发送? 我假设您已将 UART 外设设置为使用 DMA、然后在计时器中断时配置 DMA 传输、以便向 UART TX 寄存器馈送要发送的数据。

    您的定时器中断中有什么代码来配置和启动 DMA 传输? 此外、您如何配置计时器? 计时器外设应独立于 DMA 控制器运行、因此在 DMA 传输过程中、您仍应能够接收计时器中断。


    此致、

    Michael

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

    您好、Michael、

    是的、我使用 SDK 中的 UART_DEMO 示例。 我实施了一个硬件计时器,如计时器示例项目中所示。 请找到以下代码

    //计时器处理程序

    空 TimerBaseIntHandler (空)

    //
    //清除计时器中断。
    //
    Timer_IF_InterruptClear (TIMERERA0_BASE);
    Timer_IF_Stop (TIMERERA0_BASE、TIMER_A);

    //重新初始化 DMA 传输以发送数据

    UDMASetupTransfer (UDMA_CH11_UARTA1_TX、UDMA_MODE_BASIC、
    CONTRAL_CMD_SIZE、UDMA_SIZE、UDMA_ARB_2、
    (void *) voice_pktt、UDMA_SRC_INC_8、
    (void *)(CONTROL_CMD_PREIPH + UART_O_DR)、UDMA_DST_INC_NONE);
    MAP_uDMAChannelEnable (UDMA_CH11_UARTA1_TX);

    // DMA 处理程序

    静态空 UARTIntHandler()

    unsigned long ulStatus;

    无符号超长整型;

    map_uDMAIntClear (map_uDMAIntStatus ());
    //
    //读取 UART 的中断状态。
    //
    ulStatus = MAP_UARTIntStatus (CONTRAL_CMD_PREIPH、1);
    //
    //清除任何挂起状态,即使由于没有 UART,应该没有任何挂起状态
    //中断已启用。
    //
    MAP_UARTIntClear (CONTRAL_CMD_PREIPH、ulStatus);

    //Tx

    ulMode = MAP_uDMAChannelModeGet (UDMA_CH11_UARTA1_TX);

    if (ulMode = UDMA_MODE_STOP)

       TIMER_IF_Start (TIMER_RA0_BASE、TIMER_A、20);//启动超时为20ms 的计时器

    MAIN ()

    Timer_IF_Init (PRCM_TIMERERA0、TIMERERA0_BASE、TIMER_CFG_PERIODICRAE、TIMER_A、0);
    TIMER_IF_IntSetup (TIMERERA0_BASE、TIMER_A、TimerBaseIntHandler);

    UDMAInit();
    MAP_UARTIntEnable (CONTRAL_CMD_PREIPH、UART_INT_DMATX);
    MAP_UARTConfigSetExpClk (CONTRAL_CMD_PREIPH、MAP_PRCMPeripheralClockGet (CONTRAL_CMD_CLK)、
                            UART_BAUD_RATE、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                            UART_CONFIG_PAR_NONE));
    MAP_uDMAChannelAssign (UDMA_CH11_UARTA1_TX);
    MAP_UARTIntRegister (CONTRAL_CMD_PREIPH、UARTIntHandler);
    UARTFIFOLevelSet (CONTROL_CMD_PREIPH、UART_FIFO_TX1_8、UART_FIFO_RX1_8);

    UDMASetupTransfer (UDMA_CH11_UARTA1_TX、UDMA_MODE_BASIC、
                      CONTRAL_CMD_SIZE、UDMA_SIZE、UDMA_ARB_2、
                      (void *) voice_pktt、UDMA_SRC_INC_8、
                      (void *)(CONTROL_CMD_PREIPH + UART_O_DR)、UDMA_DST_INC_NONE);
                      MAP_UARTDMAEnable (CONTRAL_CMD_PREIPH、UART_DMA_RX);

    MAP_UARTDMAEnable (CONTRAL_CMD_PREIPH、UART_DMA_TX);

    while (1)

    简单来说,在 DMA UART 中断处理程序内部,我正在启动计时器,而在计时器中断中,我 将再次启用 DMA 传输,因为超时后 DMA 应再次发送数据。

    但是数据只发送一次,而计时器中断根本不会触发。 超时后无法连续发送数据。

    请帮我解决这个问题。请提前感谢

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

    您好!

    UART 中断处理程序是否完全被触发? 当您进入 UART 中断处理程序时、您认为中断源是什么、代码是否会进入 ulMode=uDMA_mode_stop 的情况?

    此致、
    Michael

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

    您好!

    是中断处理程序只触发一次、并且在该计时器启动代码内也会执行。 但我没有获得计时器中断来再次为 DMA 设置数据传输。 此外、在调试时、我看到控制仅在中断处理程序内重复执行。  

    当中断处理程序被进入 时、它进入 ulMode=uDMA_mode_stop 情况。 但不会生成计时器中断。  

    此致、

    Akash  

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

    您好、Akash、

    我将硬件计时器集成到 UART_DMA 示例中、这与您上面的示例代码非常相似、并且它们都按预期工作。 请参阅随附的代码。

    /cfs-file/__key/communityserver-discussions-components-files/968/08641.main.c

    我在代码和代码之间唯一的主要区别  是我使用 MAP_UARTDMAEnable()来重新启动 DMA 通道,而不是使用 MAP_uDMAChannelEnable()。 尝试使用它、看看它是否修复了问题。 否则、您应该仔细查看我的代码、看看是否有任何其他可能导致您问题的变化。

    此致、

    Michael

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

    您好、Akash、

    我假设您已经解决了您的问题、因为我没有听到您的反馈。 如果没有、请随时发布对此主题的响应、或打开有关此问题的新主题。

    此致、
    Michael

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

    您好、Michel、

    很抱歉耽误你的答复。 谢谢您、我的问题得到了解决。 再次感谢。 我唯一的查询是在 Timer_IF_Start 函数调用中、超时值在20ms 内用作500。 但我想应该是20。 如果不是、为什么该值是500?    

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

    您好、Akash、

    我将计时器设置为在500ms 时中断、以便 UART 输出更具可读性、但似乎我忘记更改注释以反映这一点。 如果您需要20ms 的计时器周期、则传递20的值将会正确。  

    如果您要运行我的代码、由于计时器设置为使用500ms 的周期、因此它应该每500ms 打印一次 UART。  

    此致、

    Michael