![RT-Thread设备驱动开发指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/260/46670260/b_46670260.jpg)
上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配置代码。
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/47_01.jpg?sign=1739283622-SJyibViol1VcjQ6Fttvt0dbxny6RPTvY-0-ba9943a42a89a183b722c21b33f0b452)
DMA基础配置完成之后,可以开始实现DMA的初始化、DMA中断处理以及DMA发送相关的代码。
1.DMA初始化
增加串口DMA模式需对串口DMA进行初始化。stm32_control接口会调用stm32_dma_config初始化DMA,主要是完成串口DMA句柄的初始化及对应中断的配置,DMA初始化的部分代码如下所示。
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/48_01.jpg?sign=1739283622-C9PykcMjj5QS4Tk2ThHzcpxjyE6G8tp0-0-c54cad1765f4e7b6171588aaf1d2e938)
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/49_01.jpg?sign=1739283622-QVpG9hKXUo2cDwuaXVrwQokRkWHm1SDt-0-b9b204e9be8f808d44262c9d23f74481)
2.DMA中断处理
为UART设备增加DMA模式需要进行DMA中断处理,DMA中断处理包含DMA中断接收处理与发送处理。STM32串口DMA中断接收与发送的代码如下所示,该代码实现了DMA相应中断以及回调函数。进入与退出中断时,需要调用中断进入和中断退出函数。
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/50_01.jpg?sign=1739283622-E4PwBsYNaZeVxCgrh9ZGe6qZXvzAte2x-0-d58ffd0afcc6216ddb5397bb1526c398)
STM32的DMA中断回调函数如下所示:
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/50_02.jpg?sign=1739283622-NDzOAPhKUIl3L9xkRC8zqhZAdUZL1Vhh-0-36916f15f600acb75f8c29cc2b81d464)
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/51_01.jpg?sign=1739283622-zGNzE0NUvKYLenrChasjkXMOJgTmZxVH-0-a369234684ed41935110b4fb810ab925)
3.DMA发送
最后完成DMA发送,DMA发送是基于transmit方法实现的,以下是在STM32中的实现,即在transmit操作方法中增加对DMA标志的判断,从而进行DMA发送。
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/51_02.jpg?sign=1739283622-v5vGxkaUpLJXYFRYZ8kjrLFGgv6YWhAf-0-308830d6ff63baac011b44acc6563452)