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/TM4C123AE6PM:通用定时器至 UDMA

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/578418/ccs-tm4c123ae6pm-general-purpose-timer-to-udma

器件型号:TM4C123AE6PM

工具/软件:Code Composer Studio

您好!

我想使用配置为 GPIO_PC5_WT0CCP1的 PC5、在上升沿捕获 WTIMER 0B 的定时器值、并在每个上升沿自动将定时器上的值传输到 UDMA、而无需重新加载或复位软件中的任何内容或使用中断。 这是可能的吗? 目前、我有以下代码、但我不确定它是我想要的、或者我是否已针对我想要的操作正确配置了它。 它看起来像乒乓模式可能尽可能接近连续传输、但我只需要写入相同的值、而无需缓冲器。 下面列出的代码仅是与 GPIO、定时器和 UDMA 相关的代码。 任何帮助都将不胜感激!!

HWREG (GPIO_PORTC_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY_DD;
HWREG (GPIO_PORTC_BASE + GPIO_CR)= 0x01;
HWREG (GPIO_PORTC_BASE + GPIO_AFSEL)|= 1;

ROM_GPIOPinConfigure (GPIO_PC5_WT0CCP1);
ROM_GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_5);//qmet V5 _00

//清除提交和锁定寄存器以保证安全。
HWREG (GPIO_PORTC_BASE + GPIO_LO_LOCK)= GPIO_LOCK_KEY_DD;
HWREG (GPIO_PORTC_BASE + GPIO_CR)= 0x00;
HWREG (GPIO_PORTC_BASE + GPIO_LOCK)= 0;

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);  

ROM_TimerConfigure (WTIMEER0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_CAP_TIME_UP);
ROM_TimerControlEvent (WTIMER 0_BASE、TIMER_B、TIMER_EVENT_POS_EDGE);

//必须在配置之前启用 UDMA
ROM_uDMAEnable();

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

//设置 uDMA 控制设置,将数据从 WTIMEER0B 传输到位置
ROM_uDMAChannelAttributeDisable (UDMA_CH11_WTIMER 0B、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIORITY | UDMA_ATTR_REQMASK);
ROM_uDMAChannelControlSet (UDMA_CH11_WTIMER0B | UDMA_PRI_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1);
ROM_uDMAChannelControlSet (UDMA_CH11_WTIMER0B | UDMA_ALT_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1);
ROM_uDMAChannelTransferSet (UDMA_CH11_WTIMER 0B | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(WTIMER 0_BASE + TIMER_B)、&ULDutyTimer、sizeof (ulDutyTimer));
ROM_uDMAChannelTransferSet (UDMA_CH11_WTIMER 0B | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(WTIMER 0_BASE + TIMER_B)、&ULDutyTimer、sizeof (ulDutyTimer));
ROM_uDMAChannelAttributeEnable (UDMA_CH11_WTIMER 0B、UDMA_ATTR_USEBURST);

//启用 uDMA 通道
ROM_uDMAChannelEnable (UDMA_CH11_WTIMER0B);

ROM_TimerIntEnable (WTIMER 0_BASE、TIMER_CAPB_EVENT);
ROM_TimerEnable (WTIMER 0_BASE、TIMER_B);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当然、可以使用 UDMA 将边沿捕获值复制到 RAM、但如果您只想保留最新值、我不确定是否可以看到目的。 如果您在"输入边沿时间模式"中配置时间、自由运行时间的值将被捕获并保持在 GPTMTBR 寄存器中、直到下一个边沿。 如果您尝试将最后两个值保留在 RAM 中以便计算时间差、那么在交替模式下使用 UDMA 更有意义。 您需要注意的是、当自由运行计时器溢出时、您可以确定哪个是最新的捕捉。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    除了 Bob 的评论之外、我还看到您在乒乓模式下相互覆盖。 主控制设置和备用控制设置正在将数据传输到同一个 CPU 缓冲区。  

    ROM_uDMAChannelTransferSet (UDMA_CH11_WTIMER 0B | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(WTIMER 0_BASE + TIMER_B)、&ULDutyTimer、sizeof (ulDutyTimer));

    ROM_uDMAChannelTransferSet (UDMA_CH11_WTIMER 0B | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(WTIMER 0_BASE + TIMER_B)、&ULDutyTimer、sizeof (ulDutyTimer));