金牌会员
 
- 积分
- 1042
- 金钱
- 1042
- 注册时间
- 2022-4-20
- 在线时间
- 373 小时
|
5金钱
我的DMA配置如下
void MYDMA_TX(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler); //将DMA与USART1联系起来(发送DMA)
//Tx DMA配置
UART1TxDMA_Handler.Instance=DMA2_Stream7; //数据流选择
UART1TxDMA_Handler.Init.Request=DMA_REQUEST_USART1_TX; //USART1发送DMA
UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设
UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
UART1TxDMA_Handler.Init.Mode=DMA_NORMAL; //外设流控模式
UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&UART1TxDMA_Handler);
HAL_DMA_Init(&UART1TxDMA_Handler);
}
void MYDMA_RX(void)
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
__HAL_LINKDMA(&UART1_Handler,hdmarx,UART1RXDMA_Handler); //将DMA与USART1联系起来(发送DMA)
//Tx DMA配置
UART1RXDMA_Handler.Instance=DMA2_Stream5; //数据流选择
UART1RXDMA_Handler.Init.Request=DMA_REQUEST_USART1_RX; //USART1接收DMA
UART1RXDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY; //外设到存储器
UART1RXDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式
UART1RXDMA_Handler.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式
UART1RXDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
UART1RXDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
UART1RXDMA_Handler.Init.Mode=DMA_NORMAL; //外设流控模式
UART1RXDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
UART1RXDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;
UART1RXDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
UART1RXDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE; //存储器突发单次传输
UART1RXDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE; //外设突发单次传输
HAL_DMA_DeInit(&UART1RXDMA_Handler);
HAL_DMA_Init(&UART1RXDMA_Handler);
}
在我HAL_UART_Receive_DMA(&UART1_Handler,USART_RX_BUF,50);之后,每次DMA收到的数都不会把数组USART_RX_BUF里的内容替换掉,请问是我的数据流没选对吗
另外,有没有大佬能给我解释一下这张图什么意思,我实在没理解到位,看不出从这里该怎样选择DMA1或者DMA2的数据流

|
最佳答案
查看完整内容[请看2#楼]
H7的串口DMA配置基本和F系列差不多,只要注意串口接收DMA要配置成循环模式,其他的配置没太大区别,H7需要注意的地方其实是cache,
主要是Dcache ,如果没有同步数据,CPU读取的数据就是cache里的,造成和DMA搬运的数据不一致,
楼主图片没有上传成功,盲猜是DMA控制器框图,这是和F系列不同的地方,可以看出DMA数据流是可以配置的,
至于你要将DMAX的数据流n配置成什么,就要看DMA复用表,,这里面就详细的指明了复用的对象,比如 ...
|