嵌入式学习(40)-基于STM32F407Hal库的串口DMA空闲中断接收+DMA发送
一、概述
为了实现数据的高效传输,使用DMA的方式进行数据的发送,整体的思路是通过查询标志位的方式。
二、应用
/*****DMA 发送******/ /* Tx DMA配置 */__HAL_LINKDMA(&USART3_handler, hdmatx, g_dma_usart_tx_handle); g_dma_usart_tx_handle.Instance = DMA1_Stream3; /* 数据流选择 */g_dma_usart_tx_handle.Init.Channel = DMA_CHANNEL_4; /* DMA通道选择 */g_dma_usart_tx_handle.Init.Direction = DMA_MEMORY_TO_PERIPH; /* 存储器到外设 */g_dma_usart_tx_handle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设非增量模式 */g_dma_usart_tx_handle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器增量模式 */g_dma_usart_tx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; /* 外设数据长度:8位 */g_dma_usart_tx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; /* 存储器数据长度:8位 */g_dma_usart_tx_handle.Init.Mode = DMA_NORMAL; /* 外设流控模式 */g_dma_usart_tx_handle.Init.Priority = DMA_PRIORITY_MEDIUM; /* 中等优先级 */g_dma_usart_tx_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; /* 关闭FIFO模式 */g_dma_usart_tx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; /* FIFO阈值配置 */g_dma_usart_tx_handle.Init.MemBurst = DMA_MBURST_SINGLE; /* 存储器突发单次传输 */g_dma_usart_tx_handle.Init.PeriphBurst = DMA_PBURST_SINGLE; /* 外设突发单次传输 */HAL_DMA_DeInit(&g_dma_usart_tx_handle);HAL_DMA_Init(&g_dma_usart_tx_handle);
空闲中断接收与发送:
/*发送部分----开始*/if (__HAL_DMA_GET_FLAG(&g_dma_usart_tx_handle, DMA_FLAG_TCIF3_7)) /* 等待DMA2_Stream7传输完成 */{__HAL_DMA_CLEAR_FLAG(&g_dma_usart_tx_handle, DMA_FLAG_TCIF3_7); /* 清除DMA2_Stream7传输完成标志 */HAL_UART_AbortTransmit(&USART3_handler); /* 传输完成以后关闭串口DMA */HAL_UART_Transmit_DMA(&USART3_handler, g_rcvDataBuf, PACKET_DATA_LEN); } /*发送部分----结束*/
三、测试结果
四、参代码链接
STM32F407基于HAl库实现串口空闲中断的接收,与DMA接收发送数据资源-CSDN下载