HAL_UART_Receive_DMA怎么用
时间: 2023-08-30 07:09:38 浏览: 99
【STM32】HAL库-串口异步通信-DMA式收发数据-仿printf发送-接收的DMA循环
HAL_UART_Receive_DMA是一个函数,用于启动UART的DMA接收功能。在使用这个函数之前,需要先初始化UART和DMA。
下面是一个示例代码:
```c
/* 初始化UART和DMA */
void UART_DMA_Init(void)
{
/* 初始化UART */
UART_HandleTypeDef huart;
huart.Instance = USART1;
huart.Init.BaudRate = 115200;
huart.Init.WordLength = UART_WORDLENGTH_8B;
huart.Init.StopBits = UART_STOPBITS_1;
huart.Init.Parity = UART_PARITY_NONE;
huart.Init.Mode = UART_MODE_TX_RX;
huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart);
/* 初始化DMA */
DMA_HandleTypeDef hdma;
hdma.Instance = DMA1_Stream5;
hdma.Init.Channel = DMA_CHANNEL_4;
hdma.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma.Init.PeriphInc = DMA_PINC_DISABLE;
hdma.Init.MemInc = DMA_MINC_ENABLE;
hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma.Init.Mode = DMA_CIRCULAR;
hdma.Init.Priority = DMA_PRIORITY_HIGH;
hdma.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_Init(&hdma);
/* 将DMA与UART关联 */
__HAL_LINKDMA(&huart, hdmarx, hdma);
/* 启动DMA接收 */
HAL_UART_Receive_DMA(&huart, rx_buffer, RX_BUFFER_SIZE);
}
```
在上面的代码中,我们先初始化了UART和DMA,并且将DMA与UART关联。然后调用HAL_UART_Receive_DMA函数启动DMA接收功能。其中,第一个参数是UART句柄,第二个参数是接收缓冲区的地址,第三个参数是接收缓冲区的大小。这个函数会启动DMA接收,并且将接收到的数据存放在接收缓冲区中。接收完成后,会触发DMA接收完成中断。
阅读全文