如何使用DMAMUX生成的事件来触发另一个DMA请求?

问题描述 投票:0回答:1

我想使用 DMA 向 UART 发送数据。每 3 次传输我想生成另一个 DMA 请求(不使用内核)以将数据从定时器 CNT 寄存器传输到内存。 DMAMUX 的文档通常无法理解。它们有未连接到任何东西的线路和信号。

这张图表明这是可能的。

DMAMUX 请求生成器生成可由另一个 DMAMUX 通道使用并路由到实际 DMA 的请求

代码(最小示例):

  DMA1_Channel2 -> CNDTR = 10;
  DMA1_Channel2 -> CPAR = (uint32_t)&TIM15 -> CNT;
  DMA1_Channel2 -> CMAR = (uint32_t)data16;

  DMA1_Channel1 -> CNDTR = 6;
  DMA1_Channel1 -> CMAR = (uint32_t)data;
  DMA1_Channel1 -> CPAR = (uint32_t)&LPUART1 -> TDR;

  DMAMUX1_Channel0 -> CCR = DMA_REQUEST_LPUART1_TX | DMAMUX_CxCR_EGE | (2 << DMAMUX_CxCR_NBREQ_Pos);

  DMAMUX1_Channel1 -> CCR = DMA_REQUEST_GENERATOR0;

  DMAMUX1_RequestGenerator0 -> RGCR = DMAMUX_RGxCR_GPOL_Msk  | (0 << DMAMUX_RGxCR_GNBREQ_Pos);
  DMAMUX1_RequestGenerator0 -> RGCR |= DMAMUX_RGxCR_GE;

  DMA1_Channel1 -> CCR |= DMA_CCR_EN;
  DMA1_Channel2 -> CCR |= DMA_CCR_EN;
  LPUART1 -> CR3 |= USART_CR3_DMAT;

但不幸的是,它将数据传输到 LPUART,但不生成可供 DMAMUX 通道 1 使用的事件。

可行吗?我做错了什么?

第 396 页链接至RM

c stm32 dma dmamux
1个回答
0
投票

最终我找到了解决方案。

必须将

MAMUX1_RequestGenerator0 -> RGCR
SIG_ID 字段设置为正确的 “资源的同步输入”(RefMan 中的表 58)

所以这条线会变成

  DMAMUX1_RequestGenerator0 -> RGCR = DMAMUX_RGxCR_GPOL_Msk  | (0 << DMAMUX_RGxCR_GNBREQ_Pos) | (16 << DMAMUX_RGxCR_SIG_ID_Pos);

(16,因为它是

dmamux_evt0
信号)

© www.soinside.com 2019 - 2024. All rights reserved.