上一次我们通过HAL库的串口中断回调函数,基本能够实现简单的不定长度读写收发的功能。这一次用DMA来实现,先了解一下DMA。
DMA 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
CUBEMX中的设置大概如下,其他默认值(记得要开启串口中断)
关于DMA串口读写收发功能的实现,有两种可用的方法。
第一种,
如果只是为了实现用DMA的功能,在cubemx中设置好之后,在main函数中添加
uint8_t aTxBuffer[] = "SENDING DATA USING USART1 with DMA\r\n";//(最好写到全局中)
HAL_UART_Transmit_DMA(&huart1,aTxBuffer,sizeof(aTxBuffer));//DMA发生数据
串口调试助手能够在复位之后直接收到送出的数据。
亦或者使用(一)中普通的串口中断回调函数的方法使用DMA,使用HAL_UART_Receive_DMA(&huart1,aRxBuffer,sizeof(aRxBuffer)) 放在main函数中进行DMA的接收(等待接收)。在回调函数中使用receive和trainsmit函数互相调用如(一)。但是该方法有个很重要的缺点,就是在DMA的应用中,无法做到跟串口中断回调那样子的效果,因为
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)和HAL_UART_Receive_DMA(UART_Han