金牌会员 
   
	- 积分
 - 1261
 
        - 金钱
 - 1261 
 
       - 注册时间
 - 2022-4-20
 
      - 在线时间
 - 407 小时
 
 
 
 | 
 
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复用表,,这里面就详细的指明了复用的对象,比如 ... 
 
 
 
 
 
 
 |