
上QQ阅读APP看书,第一时间看更新
2.6 增加DMA模式
DMA(Direct Memory Access,直接存储器访问)是现代处理器的特色功能,用于提供外设和存储器或者存储器和存储器之间的高速数据传输。DMA模式的数据传输,在CPU初始化完成这个传输动作之后,由DMA控制器直接将数据从一个地址空间复制到另一个地址空间,而不用CPU参与传输过程,这大大提高了CPU的运行效率。如果硬件MCU UART支持DMA模式的数据收发,则可实现该功能。每个串口设备都有自己的DMA配置参数,比如使用的硬件DMA控制器、DMA通道等。
增加UART设备DMA模式,需要首先对每个UART的DMA进行配置,接着进行DMA初始化和中断处理,最后完成DMA发送。以下是DMA配置代码。

DMA基础配置完成之后,可以开始实现DMA的初始化、DMA中断处理以及DMA发送相关的代码。
1.DMA初始化
增加串口DMA模式需对串口DMA进行初始化。stm32_control接口会调用stm32_dma_config初始化DMA,主要是完成串口DMA句柄的初始化及对应中断的配置,DMA初始化的部分代码如下所示。


2.DMA中断处理
为UART设备增加DMA模式需要进行DMA中断处理,DMA中断处理包含DMA中断接收处理与发送处理。STM32串口DMA中断接收与发送的代码如下所示,该代码实现了DMA相应中断以及回调函数。进入与退出中断时,需要调用中断进入和中断退出函数。

STM32的DMA中断回调函数如下所示:


3.DMA发送
最后完成DMA发送,DMA发送是基于transmit方法实现的,以下是在STM32中的实现,即在transmit操作方法中增加对DMA标志的判断,从而进行DMA发送。
