我想使用 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
最终我找到了解决方案。
必须将
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
信号)