DMA基本原理:
直接存储器访问 (DMA) :用于在外设与存储器之间以及存储器与存储器之间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。
DMA数据传输的四个要素:
① 传输源 :DMA数据传输的来源
② 传输目标:DMA数据传输的目的
③ 传输数量:DMA传输数据的数量
④ 触发信号:启动一次DMA数据传输的动作
DMA数据传输方式:
1.普通模式
传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。
2.循环模式
可用于处理环形缓冲区和连续数据流(例如ADC扫描模式)。当激活循环模式后,每轮传输结束时,要传输的数据数量将自动用设置的初始值进行加载, 并继续响应DMA请求。
DMA传输的优点:DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
UART空闲中断:在串口无数据接收的情况下,不会产生,当清除IDLE标志位后,必须有接收到第一个数据后,才开始触发,一但接收的数据断流,没有接收到数据,即产生IDLE中断。
当DMA和UART空闲中断结合着一起,能发挥“举世无双”的作用,具体下面来说一下实现的具体步骤。
UART空闲中断加DMA传输流程图
图1.流程图
配置DMA与UART:
1.打开串口中断
2.添加DMA通道
3.开启串口空闲中断 (初始化)
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE),这个函数是使能空闲中断,在这里的意思是使能uart2的串口空闲中断。
HAL_UART_Receive_DMA(&huart2,Rx_Buff,200);这个函数是使能DMA接收,之前设置DMA模式为正常模式,这里在接受完一次后会自动关闭DMA接收,需要我们再重新调用此函数,才能循环使用。
4.在UART中断中,获取空闲中断标志,判断是否产生中断,清空空闲标志(不清空进入死循环),停止DMA接收,计算DMA实际接收长度。
__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE);在这为,获取uart2中的空闲中断的标志。
__HAL_UART_CLEAR_IDLEFLAG(&huart2);此函数清空空闲标志,方便下次产生中断标志。
HAL_UART_DMAStop(&huart2);--关闭DMA接收,确保数据的准确性,防止外界数据干扰。
__HAL_DMA_GET_COUNTER(&hdma_usart2_rx);--此函数获取dma_uart2_rx的接收通道中的空闲大小,如果需要求的实际大小,需要将开始设置DMA接收大小减去该函数得到的空闲大小。