2133565_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2133565_zh-CN

2133565_zh-CN

使用 TMR 触发信号 DMA 写入 CMPLD1

我正在尝试使用 i.MX RT1050 的 TM R 外围设备通过 DMA 触发对 GPIO1-> DR 的写入。这可能吗?

我对参考手册的阅读是,当 CMPLD1(或 CMPLD2)" 需要更新 "(参见高效密码学标准(SEC) 53.10)时,TMR 应该能够生成 DMA 请求。我不太确定 " 需要更新 " 是什么意思,但根据高效密码学标准(SEC) 53.11.13,这似乎应该意味着将 CMPLD1 的内容转移到 COMP1 的任何时候。

当数据从 CMPLD1 寄存器传输到 COMP1 寄存器时,设置该位可启用 CMPLD1 的 DMA 写入请求。

我让TMR3_CSTRL0[CL1]=0x2(与 COMP2" 中的值比较成功后加载")。

启用 DMA 请求的条件是

QTMR_EnableDma(DAC_TIMER, DAC_DMA_CHAN, kQTMR_ComparatorPreload1DmaEnable);

此外,DMA MUX 配置为

DMAMUX_SetSource(DMA0_DMAMUX_BASEADDR, DMA0_CH0_DMA_CHANNEL, kDmaRequestMuxQTIMER3CaptTimer0Cmpld1Timer0Cmpld2Timer1);


我将 TMR3_CH0 配置为生成 1 MHz 信号,占空比为 25% ,与 TMR3_CH1(占空比为 50% )同步。

不幸的是,GPIO 写入似乎与 TMR 通道不同步,正如您在下面的示波器捕获中看到的那样。我将 DMA 源配置为缓冲值 [0、1、2、3],将目标配置为GPIO1->DR。这些十进制值可以在两个引脚上表示(由示波器的 CH3 和 CH4 捕获)。

aberger_0-1752530901503.png

因此,DMA 传输正在进行,但它们并未按预期由 TMR3_CH0 触发信号。

对于可能出现的问题有什么想法吗?

i.MX RT105xRe: Trigger DMA write with TMR CMPLD1

感谢您的贡献!

Re: Trigger DMA write with TMR CMPLD1

不知何故,该项目没有附在上一篇文章中。在这里再试一次。

Re: Trigger DMA write with TMR CMPLD1

如果对其他人有用,我可以让它工作。关键是使用 eDMA 信道链接功能。

由于 TMR 只能触发信号对自身的写入(即 cmpLDN-> CompN 传输 " 事件 " 上的 cmpLDN 写入),因此第一个 DMA 通道配置为执行此操作。第二个通道已链接,因此,在 CMPLD1 写入完成后,将触发信号 GPIO-> DR 写入。

随附项目和 README。

摘要屏幕截图如下所示:,显示了由 TMR3_CH0 上的 COMP 事件触发信号的 GPIO1 引脚 16 和 17 的并行更新。COMP2 事件与 GPIO 线路更新之间的延迟时间约为 250 ns。

GPIO_DMA_1MHz.png

不幸的是,使用链接信道,我触发 GPIO 写入的最快速度似乎约为 3 MHz。例如,如果将 DAC_CLK_FREQ_HZ 设置为 10 MHz,GPIO 写入将不再与 TMR 周期同步。GPIO 线路更新的最快速度似乎约为 250 ns,即运行 DMA 和 GPIO 外围设备的 150 MHz IPG_CLKC 的 38 个周期。38 个周期是否与执行两个链接的 DMA 通道一致,其中一个通道写入 16 位 CMPLD 寄存器,第二个通道写入 32 位 GPIO DR 寄存器?这似乎需要很多额外的周期。

更新:iMX 参考手册中没有关于 eDMA 性能的章节。但是与K66参考手册相比,每个eDMA请求似乎需要大约17个周期(表24-5)。这与我的演示中处理两个链接通道请求的 38 个周期是一致的。

再与K66比较一下:看来iMX的TMR和eflexPWM外围设备不如Kinetis系列设备的FlexTimer外围设备那么灵活。FTM 外设可能会触发信号一般的 DMA 写入。iMX 的 TMR 和 eFlexPWM 外设只能触发信号对自己的寄存器(分别为 CMPLD 和 VALx)的写入。

Re: Trigger DMA write with TMR CMPLD1

我不是想触发输入捕获。我正在尝试在 TMR COMP 匹配发生时触发 GPIO 写入。不幸的是,COMP 比赛没有 DMA 触发信号。最接近 COMP 匹配的事件是相关 CMPLD 寄存器的读取。每当数据传出 cmpLDN 寄存器时,TMR 模块都会提供 DMA 触发信号 "。"

定义 DMA 传输配置时,我需要定义源地址和目标地址。因此,我可以自由设置 DMA 写入的目标地址:

((uint32_t)(&GPIO1->DR))

具体来说,我想从波形缓冲器读取数据并将其写入一组 GPIO 引脚,传输时序由 TMR COMP 事件精确设定。

以下是我安装 DMA 传输的方法

/* Relevant Defines and Declarations */
#define DMA0_DMA_BASEADDR DMA0
#define DMA0_DMAMUX_BASEADDR DMAMUX
#define DMA0_CH0_DMA_REQUEST kDmaRequestMuxQTIMER3CaptTimer0Cmpld1Timer0Cmpld2Timer1
uint32_t waveform_buffer[WAV_BUF_LEN] __attribute__((aligned(4)));

/* Channel CH0 initialization */
/* Set the source kDmaRequestMuxQTIMER3CaptTimer0Cmpld1Timer0Cmpld2Timer1 request in the DMAMUX */
DMAMUX_SetSource(DMA0_DMAMUX_BASEADDR, DMA0_CH0_DMA_CHANNEL, DMA0_CH0_DMA_REQUEST);
/* Enable the channel 0 in the DMAMUX */
DMAMUX_EnableChannel(DMA0_DMAMUX_BASEADDR, DMA0_CH0_DMA_CHANNEL);
/* Create the eDMA DMA0_CH0_Handle handle */
EDMA_CreateHandle(&DMA0_CH0_Handle, DMA0_DMA_BASEADDR, DMA0_CH0_DMA_CHANNEL);
/* DMA0 transfer CH0_TRANSFER0 configuration */
EDMA_PrepareTransferConfig(&DMA0_CH0_TRANSFER0_config, (void *) &waveform_buffer, 1 << kEDMA_TransferSize4Bytes, 4, (void *) ((uint32_t)(&GPIO1->DR)), 1 << kEDMA_TransferSize4Bytes, 0, 4U, 16U); 
/* DMA0 transfer CH0_TRANSFER0 submit */
status = EDMA_SubmitTransfer(&DMA0_CH0_Handle, &DMA0_CH0_TRANSFER0_config);

但也许这行不通?我开始认为 tmrx_dman [cmpldYDE] 位的存在只能触发信号对 CMPL D 寄存器的写入。这比我希望的更不灵活。


Re: Trigger DMA write with TMR CMPLD1

您好,

其实我没明白你的意思。请说明您想做什么。

  • GPIO 写入 与 TMR 通道不同步

是的,TMR 信道需要通过并取决于其条件。

Sam_Gao_1-1752736935805.png


  • 下面举例说明如何将 QTMR 通道配置为 captrue DMA。

https://github.com/nxp-mcuxpresso/mcuxsdk-examples/blob/release/25.03.00/_boards/evkbimxrt1050/drive...


 

Tags (1)
No ratings
Version history
Last update:
‎11-21-2025 02:47 AM
Updated by: