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.

[参考译文] AM2434:DMA 定制驱动程序 — 描述符创建指南

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1559965/am2434-dma-custom-driver---descriptor-creation-guide

器件型号:AM2434


工具/软件:

您好:

我试图使我自己的 DMA 驱动程序尽可能通用、因为我发现 SDK 中的驱动程序对我来说太抽象了。
我遵循了 SDK 文档中找到的步骤。 现在我被困在应该做描述符的位置。 在使用之前、没有创建描述符的步骤或任何指导 UDMA_ringQueueRaw 将其推入振铃缓冲区。 我将使用版本为 10.01.00.32 的 SDK。  

我还找到了内部 API:(在 UART_DMA_UDMA.c 中)

静态 void UART_udmaHpdInit (Udma_Ch uintHandle chHandle、 uint8_t *pHpdMem、 const void *destBuf、uint32_t length  )


我不确定我是否应该将其设置为全局并立即在我的代码中使用它。
因此、我需要逐步指导如何初始化和启用 DMA 通道。
提前感谢您。
此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Hatem、

    请问您为什么要使用客户 DMA 驱动程序实现?

    在随附的 e2e 中、我已经提供了用于轮询 DMA 事务是否已完成。

    这是不是工作?

    此致、

    Anil.

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

    好的、这是我的整个案例。 我正在处理示例工程“uart_ech_DMA_LLD_am243x-evm_r5fss0-0_nortos_ti-arm-clang"。“。
    我希望 UART 与 DMA 一起工作、没有中断。 示例工程支持两种类型的中断 (UART INT) 和 DMA INT。

    首先、我尝试禁用 UART 中断、但该示例停止工作、我不知道为什么。
    然后、我得到了 DMA 中断、我不确定其回调的位置、但您已经告诉了我如何通过对寄存器行注释来停止。  您的回答非常有用、我现在正在尝试。

    此外、我所做的工作还需要干净的隔离式驱动器。 我正在使用低级 UART+DMA API、但我希望构建一个单独的 DMA 和一个单独的 UART 驱动程序、以使其尽可能通用。  我已经按照我在 SDK 文档中找到的以下路径中的步骤操作:
    mcu_plus_sdk_am243x_10_01_00_32_docs_only/docs/api_guide_am243x/drivers_uDMA_page

    我到达了初始化 DMA 的步骤、但正如我说过的、除了我提到的内部函数、我找不到关于创建描述符的任何线索。

    因此、总结一下:

    1.正如我之前所问的,我不想有任何中断。 但是、每当我尝试关闭 UART 中断时、整个东西都会停止工作(如果您有任何线索,为什么会发生这种情况)。

    2.如果我想制作通用的 DMA 驱动程序,有没有关于如何制作描述符的指南?

    3.如果我想添加一些代码,那么 DMA 回调函数在哪里? 我只发现它注册到本地 eventhandler、但我不知道回调函数本身在哪里。

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

    您好 Hatem、

    如果轮询模式下需要 UART、请运行以下示例。

    我不确定哪一个是您在轮询模式下运行 UART 的示例。

    如果您按照我上面的说明操作、您应该让 UART DMA 在轮询模式下工作。

    在 sysg 方面、您需要使用与 UART DMA 配置相同的命令、并且不会在 ysscfg 中更改任何内容。

    如果我想向 DMA 回调函数添加一些代码、该函数在哪里? 我只发现它注册到一个本地事件处理者,但我不知道回调函数本身在哪里。

     请查看下面的示例、了解如何为 DMA UART 注册回调。

    此致、

    Anil.

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

    文档中的轮询模式表示它是阻塞的、我不希望它处于阻塞模式。

    顺便说一句,我试图评论它记录事件的部分,但整个事情是不起作用的。
    我使用的是示例 UART_ECHO_DMA_LLD



    我评论的这一行使整个过程无法正常工作、调试无法进行、因为调试器会在设置中停止、没有明显的原因。

    我不确定是不是 非阻塞轮询模式  -这是完全手动轮询 — 甚至是支持这块板。

    因此、感谢您的帮助。 我希望有一个我不知道的解决方案。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    文档中的轮询模式意味着它是阻塞的、我不希望它处于阻塞模式。
    [/报价]

    您好 Hatem、

    请查看下面的示例、此轮询意味着我们没有启用 UART 中断、而不是阻塞模式。

    阻塞模式意味着不同。 块模式意味着我们为 UART 启用中断、UART 驱动程序将传输字节、并等待信标信号。 然后、任务将被阻止、直到信标信号出现。 一旦从 ISR 例程接收到信号、任务就会恢复。

    因此、阻塞模式和轮询模式是不同的。

    C:\ti\mcu_plus_sdk_am64x_11_00_00_15\examples\drivers\uart\uart_echo_low_delay_polling

    接下来、根据我对 DMA 轮询的建议、您做了哪些更改?

    在提出上述建议后、您是否编译了驱动程序和应用程序?

    具体问题是什么?

    如果您正确共享所有步骤、我可以尝试为您提供帮助、无论我分享的是哪种方法、这同样是纯轮询模式、这意味着我们不会启用 DMA 中断。

    ...

    此致、

    Anil.

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

    嗨、Anil。

    我在进行建议的更改后编译了驱动程序和应用程序、但代码由于某种原因停止工作。
    现在、我决定使用诸如 UART_LLD_dmaInit、UART_LLD_writeDma 等低级驱动程序 API

    禁用 DMA 中断的步骤如下:
    1.在文件中: “drivers\uart\V0\LLD\DMA\UDMA\UART_DMA_UDMA.c"</s>“ 、我评论了以下几行:

      // eventHandle = udmaChCfg->cqRxEvtHandle;
      //  UdmaEventPrms_init (&eventPrms);
      //  eventPrms.eventType     = UDMA_EVENT_TYPE_DMA_FINITY;
      //  eventPrms.eventMode     = UDMA_EVENT_MODE_SHARED;
      //  eventPrms.chHandle      = rxChHandle;
      //  eventPrms.controllerEventHandle = UDMA_eventGetGlobalHandle (drvHandle);
      //  eventPrms.eventCb      =&UART_udmaIsrrRx
      //  eventPrms.AppData      =(void *) hUart;
      // RetVal = UDMA_eventRegister (drvHandle、eventHandle、&eventPrms);
      //  DebugP_ASSERT (UDMA_Sok == RetVal);

    在这两个函数中:  
    UART_udmaInitTxCh、UART_udmaInitRxCh  

    2.我使用以下命令编译库:  gmake -s libs profile=debug

    3.我再次尝试,但代码是不工作的,而“不工作“我的意思是什么都不打印在终端上。 我猜是 DMA 事务需要使用 API 结束:  UDMA_ringDequeueRaw 和 UART_LLD_Transaction_deInit。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    之间的关系 “uart_echo_low_Latence_Polling"</s>“ 但它不使用 DMA。
    因此、目前我决定将回调函数留空。 因此、感谢您的帮助。

    我的问题是:如果我以前使用的是禁用 UDMA 中断的方法、那么如果我使用的是相同的方法、如何禁用 UART 中断 “UART_LLD_dmaInit"</s>“ API? 我发现我需要将回调函数传递给 Init 参数、如果我将它们留空、则会失败。


    我希望我的信息和问题足够清晰、对我 给您带来的任何挫折感到抱歉。