![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=1738891279-cLiIFsYvwyfT4EoawaljqzOXTvUHvgif-0-d1753dbce41bf18c0d879667e6685c3c)
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=1738891279-XDz9dZxJYQiRsUNXcHm3M6X01I634cBk-0-d4c95ceaba3453c2b2fa36b3343dd246)
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/49_01.jpg?sign=1738891279-uv5uS1OXlIpNfdhYzQheTWKlsmS0WRrK-0-abc4424e3d6835356cc0e722e61981cd)
2.DMA中断处理
为UART设备增加DMA模式需要进行DMA中断处理,DMA中断处理包含DMA中断接收处理与发送处理。STM32串口DMA中断接收与发送的代码如下所示,该代码实现了DMA相应中断以及回调函数。进入与退出中断时,需要调用中断进入和中断退出函数。
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/50_01.jpg?sign=1738891279-32SnitdOl4RUfHkchD7Z34X0N5aIftrb-0-e74f05b682d739a6822f03766c515ec2)
STM32的DMA中断回调函数如下所示:
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/50_02.jpg?sign=1738891279-7qjW8zaCNZModpQjXRCHZZKfBjWP8qtr-0-4798f004cfd05ea25179c6895b4892d7)
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/51_01.jpg?sign=1738891279-SeWtTJbuWpgciUp2camcaTFw4QQgySmG-0-477585f1ccf1034328820d159b03eff7)
3.DMA发送
最后完成DMA发送,DMA发送是基于transmit方法实现的,以下是在STM32中的实现,即在transmit操作方法中增加对DMA标志的判断,从而进行DMA发送。
![](https://epubservercos.yuewen.com/8B2CE7/25929799901480006/epubprivate/OEBPS/Images/51_02.jpg?sign=1738891279-i732tVzZzmddxihAo0mdgAxZLpTBriXi-0-145d52642ef0366c950b26b4f1f2bc4c)