我有一些基于中断的 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 处理字符?
您必须为 USART1_RX DMA 设置 SYSCFG_CFGR1.USART1_RX_DMA_RMP 才能触发 DMA1_Channel5,请参阅 RM 中该引脚的说明,以及 DMA 章节中 DMA 请求映射图片和表格下的脚注。
JW