使用 DMA 的 STM32 UART RX:DMA 未启动

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

我有一些基于中断的 UART 接收代码,想要将其转换为使用 DMA。 UART 正在接收字符,但 DMA 未处理它们。

处理器是STM32F030K6,使用UART1和DMA1_channel5。这是 DMA 设置代码:

__HAL_RCC_DMA1_CLK_ENABLE();

DMA_CHANNEL->CCR &= ~(1 << DMA_CCR_EN_Pos);

// Set up the DMA configuration
// MEM2MEM 0 - disabled
// PINC = disabled
// TC interrupt disabled
// TE interrupt disbled
DMA_CHANNEL->CCR =
         (1 << DMA_CCR_PL_Pos)          // Medium priority
        | (0 << DMA_CCR_MSIZE_Pos)      // 8 bits
        | (0 << DMA_CCR_PSIZE_Pos)      // 8 bits
        | (1 << DMA_CCR_MINC_Pos)       // Memory increment
        | (0 << DMA_CCR_DIR_Pos)        // Peripheral to memory
        | (1 << DMA_CCR_CIRC_Pos);      // Circular buffer

  // Start the DMA
  DMA_CHANNEL->CCR &= ~(1 << DMA_CCR_EN_Pos); 
  DMA_CHANNEL->CPAR = (uint32_t) (&USART1->RDR);
  DMA_CHANNEL->CMAR = (uint32_t) (ring);
  DMA_CHANNEL->CNDTR = RING_BUFFER_SIZE;
  DMA_CHANNEL->CCR |= (1 << DMA_CCR_EN_Pos);

  // Route UART receive to DMA
  USART1->CR3 |= USART_CR3_DMAR;

UART 接收字符 - RDR 包含该字符并且 RXNE 已设置 - 但 DMA 不接受接收到的字符 - CNDTR 不递减。

我需要添加或更改什么才能使 DMA 处理字符?

stm32 uart dma
1个回答
0
投票

您必须为 USART1_RX DMA 设置 SYSCFG_CFGR1.USART1_RX_DMA_RMP 才能触发 DMA1_Channel5,请参阅 RM 中该引脚的说明,以及 DMA 章节中 DMA 请求映射图片和表格下的脚注。

JW

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