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.

[参考译文] AM2634:配置 EDMA 以在 FreeRTOS 环境中传输 ADC 寄存器

Guru**** 2585275 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1207670/am2634-configure-edma-to-transfer-adc-reuslts-in-freertos-environment

器件型号:AM2634
"Thread:SysConfig"中讨论的其他器件

您好!  

目前我正在研究 EDMA 的配置、以便 通过 FreeRTOS 自动传输 ADCINT 触发的 ADC 结果。

我所做的工作如下:

1) 1)导入了  r5fs0-0_FreeRTOS 项目、然后在 task_main 中、创建了几个周期性任务、即1ms、10ms、100ms、 它运行良好、

2)在 TASK_MAIN 配置的 EPWM0中 定期触发 ADC0 SOC ,而在 ADC_APP_ISR triggerd 中,转换的结果通过调用 API ADC_readResult ()来读取,运行良好。

该问题出现在以下情况后:

3) 3)我尝试添加 EDMA 通道以传输结果、我使用的配置几乎与示例 ADC_SoC_Continuous_DMA 相同、但是它不起作用。 目标缓冲区从不更新。

我检查了寄存器 TPCC0、它会查看已正确写入的 edmaParam 值。

我尝试创建 edmaParam1、 edmaParam2并调用 API 来链接这两个参数、但仍然无法正常工作。

更糟糕的是、如果我使用以下代码来保留 DMA 的中断函数、软件将进入中止、这无法确定调试期间软件被阻止的位置。 如果没有该中断 寄存器、软件可以运行、ePWM 和 ADC 可以工作、但 DMA 不工作。

/*寄存器中断*/
intrObj.tccNum = tccAlloc0;
intrObj.cbFxn =&App_dmach0ISR;
intrObj.AppData =(void *)&gEdmaTransferDoneSem;

状态= EDMA_registerIntr (gEdmaHandle[0]、&intrObj);
DebugP_ASSERT (STATUS = SYSTEMP_SUCCESS);

 

我的问题是:

1) 1)是否有一个在运行 FreeRTOS 的情况下使用 EDMA 实现类似函数以传输 ADC 结果的示例?

2) 2)如何解决这个问题、我应该在哪里检查我是否错过了某些内容或所有内容是否配置正确?

3) 3)是否可能由于导致问题的多个中断(ADC_ISR、DMA_ISR、RTI0)之间的冲突?  我应该配置中断的优先级、以及如何通过 SysConfig 进行设置?

非常感谢您的回复。

Lync

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

    您好、Lync

    Unknown 说:
    1)是否有一个实现类似函数的示例、以便在运行 FreeRTOS 的情况下使用 EDMA 传输 ADC 结果?

    否、我们没有针对控制 SS 的免费 RTOS 示例。 我将在免费 RTOS 中查看它并回复给您。

    您的 DMA 读取的触发条件是什么? 是 ADC EOC 吗?

    Unknown 说:
    EOC_APP_ISR triggerd [/报价]

    你是否为同一 ADC EOC 配置了两个中断?

    Unknown 说:
    2)如何解决这个问题,我应该在哪里检查我是否漏掉了某些东西或者所有东西是否配置正确?

    您可以将 ADC DMA 示例作为参考、并使其在免费 RTOS 上运行。 然后在它上面执行其他任务配置。

    我还将在结束时从免费 RTOS 方面进行检查

    Unknown 说:
    3)是否可能是由于多个中断(ADC_ISR、DMA_ISR、RTI0)之间的冲突导致了问题?  我是否应该配置中断的优先级以及如何通过 SysConfig 进行设置?

    是的、对于 RTI 计时器中断优先级、可以通过 syscfg 设置它。

    对于其他中断、您可以使用 hwiPrms.priority 参数  

    谢谢、此致

    Sri Vidya

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

    您好, Sri Vidya,ć

    非常感谢您的回复。

    测试过程中仅启用了一个 ADC 中断 ADC0 INT1。

    DMA 的触发是  SYSCFG 中的 ADC0_INT1 (""" DMA_TRIG_Xbar<-DMA_Xbar '"")。

    我期待收到您关于 FreeRTOS 的反馈。

    此致、

    Lync

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

    您好、Lync

    我已经针对无任务切换的 RTOS 示例执行了 ADC DMA 连续示例的基本移植。

    我这样做是为了检查空闲 RTOS 和 DMA 是否存在任何问题。 并且如预期的那样、代码运行正常。 下面我们举例说明:

    我已将 ADC1 AIN0通道接地以测试行为、结果符合预期。

    另外还将3.3V 连接到 ADC1 AIN0通道。

    谢谢、此致

    Sri Vidya

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

    您可以通过检查 ADC DMA 的以下配置来调试该问题:

    首先检查您单独配置的 ADC DMA 示例是否正常工作、不使用计时器中断(使计时器中断和其他外设中断具有最低的触发优先级- 15)

    1.检查以查看 PWM -->是否在 syscfg 中触发 ADC SOC

    2.需要在 SYSCFG 中配置 ADC EOC 转换中断

    3、这些中断被连接到 DMA  

    交叉检查 DMA 交叉开关、DMA 触发器和 INT 交叉开关配置。

    4.检查 DMA 初始化代码:

    5.检查 ADC EPWM 触发代码

    希望这对您有所帮助。

    此致

    Sri Vidya

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

    尊敬的  Sri Vidya:

    感谢您的大力支持。 我会根据您的建议和示例回到您的身边。

    此致、

    Lync

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

    您好、Lync

    当然、小事一桩。  

    此致

    Sri Vidya

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

    尊敬的 Sri Vidya:

    我做了类似的修改,它确实如预期的那样工作!

    现在我有一个新问题:

    1)如果我想在 ADC0的 EOC 之后定期触发 DMA 传输和传输完成中断、我应该怎么做?   在 ADC_SoC_Continuous_dma 示例中、DMA 传输似乎只执行一次。  

    我在 ISR 中删除了禁用函数、现在 ADC 可以周期性地采样。 我通过在 App_adcISR 中切换 GPIO (B&)进行了确认。 但是、当我尝试在 App_dmach0ISR 中切换 GPIO 时、它没有唤醒。

    在我添加了以下代码以链接 DMA 参数后、仍然无法正常工作:

    EDMA_setPaRAM (baseAddr、param0、&edmaParam1);
    EDMA_setPaRAM (baseAddr、param1、&edmaParam2);
    EDMA_linkChannel (baseAddr、param0、param1);
    EDMA_linkChannel (baseAddr、param1、param1);

    2)在 App_dmach0ISR 中,我是否应该进行清除处理,以便 使用 ADC_clearInterruptStatus()在 App_adcISR 中为下一个触发事件提供该 ISR ,我应该使用哪个 API 来实现它?

    感谢您的大力支持!

    此致、

    Lync

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

    您好、Lync

    明白了。 我最终得以重现此问题

    我们将回来讨论这个问题。

    您能告诉我您在清除哪个 ADC 中断吗?

    清除处理以使该 ISR 可用于  App_adcISR 中使用 ADC_clearInterruptStatus()执行的下一个触发事件[/报价]

    software-dl.ti.com/.../EXAMPLES_DRIVERS_ADC_SOC_CONTINUOUS_DMA.html

    此致

    Sri Vidya

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

    尊敬的 Sri Vidya:

    我使用了 ADC_clearInterruptStatus (gAddc0baseAddr、ADC_INT_number1)来清除用于触发 App_adcISR ()回调函数的 ADC0_int1。

    task_switch_am263x-lp_r5fss0-0_freertos_ti-arm-clang.rar 您还可以检查 先前附加的工程中的 adc_soc_continuous_dma.c 文件。

    非常感谢您的支持。

    此致、

    Lync

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

    您好、Lync

    好的,明白了。 研究它

    谢谢、此致

    Sri Vidya

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

    您好、Lync

    要通过 DMA 执行循环操作、必须将参数集链接到自身。 SDK 中的以下位置已存在通过链接的 EDMA 示例:

    https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/EXAMPLES_DRIVERS_EDMA_LINK_TRANSFER.html

    您可以将其用作参考来修改您的示例。

    更多信息、请参阅 TRM 中的11.2.3.3.7链接传输部分。

    在 SDK 中的链路传输 EDMA 示例中、您可以查看用于链接的 API:

      EDMA_setPaRAM (baseAddrparam0、&edmaParam1);
      EDMA_setPaRAM (baseAddrparam1、&edmaParam2);

      EDMA_linkChannel (baseAddrparam0、param1);
     
    此致
    Sri Vidya