利用DMA双缓冲或半完成中断实现串口不定长数据的接收
在《 HAL版本DMA循环模式串口数据收发 》中介绍了利用DMA循环模式进行串口数据的收发,STM32F4xx的DMA还提供了双缓冲的功能,采用双缓冲模式,可以在一个DMA完成接收后,对其缓冲区内数据进行处理的过程中,将此时接收到的数据放入第二个DMA缓冲区。双缓冲模式尤其对高速数据接收有着明显的优势,本文以上述循环接收方案为基础,提供实现双缓冲接收数据的实现方式。 首先,从寄存器的角度讲,要实现双缓冲,需要将CR寄存器的DBM位置1,将该位置1后,硬件会强制使用循环模式,当一个缓冲满后,会自动交换缓冲区的地址。但我们采用HAL库版本的程序时,不太需要关注这些,但是值得注意的是,HAL库的stm32f4xx_hal_uart.c中并没有提供实现双缓冲的接口,因此需要我们对HAL库的程序进行一些改写: HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) { /*省略库中起始部分的程序*/ /* Set the DMA abort callback */ huart->hdmarx->XferAbortCallback = NULL; /* Enable the DMA stream */ //HAL_DMA_Start_IT(huart-