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.

[参考译文] RTOS/TM4C1294NCPDT:定时器和 UDMA

Guru**** 2046040 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/647001/rtos-tm4c1294ncpdt-timer-and-udma

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

工具/软件:TI-RTOS

你好

我尝试使用计时器比较来测量是否为 pulsewitdh。 为此、我在上升沿和下降沿使用中断并读取时间寄存器来计算高电平时间。

现在我尝试使用 uDMA 来实现它、但它不起作用。 请帮助我查找此配置中的错误。 我在"Stellaris Ware"封装中找到了一个示例、并将其调整为计时器3。

此致

勒内  

//
//启用 UDMA 外设
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);

//
//启用 uDMA 控制器错误中断。 将发生该中断
//如果在传输过程中出现总线错误。
//
ROM_IntEnable (UDMA_INT_ERR);

//
//启用 UDMA 控制器。
//
ROM_uDMAEnable();

//
//指向控制表以用于通道控制结构体。
//
ROM_uDMAControlBaseSet (ucControlTable);

uDMAChannelSelectSecondary (UDMA_DEF_USBEP2TX_SEC_TMR3B);
//
//将 UDMA Timer3B 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_TMR3B、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR_UDMA_ATTR_REQMASK);

//
//为计时器0A 设置 DMA 通道。 将其设置为传输单个数据
//一次32位字。 源是非递增的、
//目标正在递增。
//
ROM_uDMAChannelControlSet (UDMA_SEC_CHANGE_TMR3B | UDMA_PRI_SELECT、
UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_ARB_1);

//
//为计时器0A DMA 通道设置传输。 使用基本模式、
//这意味着每个计时器请求将发生一次传输(超时)。
//每次超时传输的数量由仲裁决定
//大小(请参阅上面的函数)。 源将是自由运行的值
// Timer1,目标是内存缓冲区。 因此、的值
//每次周期性运行时,自由运行的 Timer1都将存储在缓冲区中
// Timer0超时。
//
ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_TMR3B | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、(void *)(TIMER3_base + TIMER_O_TBR)、
G_ulTimerBuf、MAX_TIMER_Events);

uDMAChannelEnable (UDMA_SEC_CHANGE_TMR3B); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有人知道如何为此目的配置 UDMA?
    通过我将计时器配置为激活 UDMA 的方式

    TimerDMAEventSet (TIMER3_base、TIMER_DMA_CAPMATCH_B);

    此致
    勒内
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Rene:
    您能参考下的 TivaWare DMA 示例 \examples\boards\ek-tm4c1294xl\udma_demo?

    您希望使用次通道而不是主通道的原因是什么?
    您在 DMA 设置之前的开始启用 DMA。 应在完成所有 DMA 配置后启用 DMA。 请参阅 TivaWare 示例。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Charles

    在 driverlib 文档中(SW-TM4C-DRL-UG.2.1.3.156.pdf)被编写:
    "要使用 uDMA 控制器,必须首先通过调用 uDMAEnable()来启用它。"
    在 Demo-Project 中,您提到了“uDMAEnable()”,它也在 config 之前调用!
    我认为你的意思是“uDMAChannelEnable()”,这是在最后一行中完成的。

    我不能使用定时器1/2、因为我的信号输入只在定时器3 (引脚 D5 T3CCP1)上、并且没有主通道用于这个。

    我参考 TivaWare 示例、但我没有找到任何有助于解决此问题的方法。

    在文档中、我发现只有我应该使用的文件
    "uDMAChannelAssign (UDMA_CH3_TIMER3B);"
    而不是
    "uDMAChannelSelectSecondary (UDMA_DEF_USBEP2TX_SEC_TMR3B);"

    但是、要更改它、我的问题就没有得到解决。

    该配置的地址位于 SRAM 中、位于
    0x2002d400 uDMAControlTable
    这也应该是正确的。

    还有其他建议吗?

    此致
    勒内
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想您应该尝试 uDMAChannelAssign (UDMA_CH3_TIMER3B)。 读取看起来像 uDMAChannelSelectSecondary ()的源代码意味着将被弃用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,查尔斯

    如前面的答案中所述。 我已经尝试过、但未解决问题。

    此致
    勒内
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Rene:
    在 CCS 的寄存器浏览器窗口中、您可以转至 UDMA 模块并查看 UDMA_WAITSTAT 寄存器。 通道3是否正在等待请求? 也许 TMR 没有生成到 UDMA 的请求。 您为什么不尝试根据超时事件作为实验来生成 DMA 请求? 该事件应定期生成、并且更容易观察是否正确设置了请求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好,查尔斯

    我明白了。 请求未设置、因为我将其注册到了错误的请求。

    这就是失败:
    TimerDMAEventSet (TIMER3_base、TIMER_DMA_CAPMATCH_B);

    这就是解决方案:
    TimerDMAEventSet (TIMER3_base、TIMER_DMA_CAPEVENT_B);

    感谢您的建议。

    此致
    勒内