• 157查看
  • 0回复

[芯片硬件] STM32 DMAMUX应用示例

[复制链接]


该用户从未签到

发表于 27-4-2024 09:29:35 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


有人通过公众号微信留言,询问是否有关于STM32 DMAMUX模块具体的应用示例代码。同时,个人也发现,虽然STM32片内的DMAMUX不是什么新模块,似乎还是很多人并不太熟悉。这里借机聊聊这方面的内容,重点演示相关功能的实现,以供参考。

其实,DMAMUX作为一个外设模块,操作它并不需要添加太多用户代码,尤其是当我们基于STM32CubeMx进行配置时。它的主要功能就是为各种DMA请求做DMA传输通道的灵活调度与安排,并配合DMA使用,我们可以把它看成DMA控制器的前端拓展。

DMAMUX模块大体上由DMA请求转发通道和DMA请求发生器组成,其中每个DMA请求转发通道还配有同步控制单元。DMA请求发生器可以基于某些事件产生DMA请求申请DMA传输。至于同步控制单元,可以简单理解为每个DMA请求最终是否被转发出去的一个控制开关,就像蓄势待发的田径选手有时还得等信号枪响一样。

STM32 DMAMUX应用示例w2.jpg

上图是DMAMUX与DMA功能关联示意图,供理解参考。关于STM32 DMAMUX的基本功能及特性,可以阅读本公众号的另外一篇分享笔记《STM32芯片中的DMAMUX是干啥用的?》,这里就不对其功能原理及特性赘述了。

下面使用STM32G0系列Nucleo板重点演示其主要功能的实现。实验会用到PC13的外部中断功能,LPTIM1的输出功能、USART2外设和USART1外设基于DMA方式的通信功能。

STM32 DMAMUX应用示例w3.jpg

我们先看看DMAMUX的路由转发功能。

DMAMUX对DMA请求做路由转发是其基本功能,应该也是设计它的初衷。我们平常使用该功能时是没啥明显感觉的,就像我们通过HUB让USB设备跟PC通信一样,尤其是在基于STM32CubeMx进行配置时。如果说,你之前用过其它不带DMAMUX的STM32系列的DMA功能,再来使用带DMAMUX的DMA功能时,使用STM32CubeMx工具做DMA配置,会发现DMA可选通道突然变多且可随意选择。不妨看看下图基于STM32F4【不带DMAMUX】和STM32G0系列【内置DMAMUX】对UART2接收进行DMA配置时的情形,差别一目了然。

STM32 DMAMUX应用示例w4.jpg

说到这里,顺便介绍下目前内置DMAMUX模块的STM32系列。我从ST官方应用笔记AN5224截图过来,下面这些系列都内置了DMAMUX。后面我以STM32G0芯片演示相关功能的实现。

STM32 DMAMUX应用示例w5.jpg

我们接下来来看看DMAMUX的第2个功能---DMA请求生成功能。它能基于某些特定事件产生DMA请求,请求的个数可以从1~32之间。这里的特定事件主要是指各种外部中断事件和少数几个路由通道的DMA事件以及LPTIM的输出事件。

这里使用STM32G071的PC13外部中断功能。每次按键事件经DMAMUX的DMA generator申请10个DMA请求,让DMA将内存字符数据传输到UART2的数据发送寄存器,最终在串口终端显示字符串“Key In!”。下面是有关PC13外部中断和DMAMUX generator的配置。【注:下面代码都是基于HAL库的】

STM32 DMAMUX应用示例w6.jpg

使用UART2将字符串输出到串口终端,UART2的基本配置如下:

STM32 DMAMUX应用示例w7.jpg

创建工程,添加下面用户代码【基于HAL库】后即可验证结果:

STM32 DMAMUX应用示例w8.jpg

现在继续看看DMAMUX的同步功能。针对该功能,这里再做两个小演示。

第一个演示,用DMA传输完成产生触发事件去触发另一个DMA传输操作。具体来说,我开启UART2的DMA方式收、发功能,从串口终端发送数据给UART2,UART2通过DMA方式收到数据后,基于DMAMUX产生DMA事件,触发UART2将刚才收到的数据回显到串口终端。从串口终端发送数据到再回显于串口终端一气呵成,无须CPU参与。

UART2的基本参数配置跟前面一样,不重复贴图了。下面是有关UART2 DMA接收的配置:

STM32 DMAMUX应用示例w9.jpg

在上面UART2 DMA接收配置中,使能了DMA 事件功能。该事件将作为UART2 DMA发送的同步事件。下图是有关UART2 DMA发送的配置,启用了同步触发功能。

STM32 DMAMUX应用示例w10.jpg

基于上面配置创建工程,添加必要代码即可验证结果。结果就是UART2每收到10个数据后立即通过DMA方式回显在串口终端。见下面截图:

STM32 DMAMUX应用示例w11.jpg

最后再演示一个DMAMUX同步功能的实现案例。使用LPTIM的输出产生周期性的触发事件,作为UART1 DMA发送的同步事件。每次LPTIM产生触发事件,UART1就通过DMA发送一串字符出去。这里使用UART1自发自收来验证。显然,UART1每发送一串字符出去也同时收到同一串字符。下面是LPTIM1的参数配置,没啥过多解释的.

STM32 DMAMUX应用示例w12.jpg

下面是有关UART1 DMA方式收发功能的配置,重点关注其DMA发送的配置。开启UART1 DMA发送的同步触发,LPTIM输出的上沿作为其同步事件。至于UART1 DMA接收功能保持常规配置即可,不做同步也不产生DMA输出事件。

STM32 DMAMUX应用示例w13.jpg

基于上面配置,添加几行用户代码即可验证结果。参看下面截图:

STM32 DMAMUX应用示例w14.jpg

基于上面配置,如果我们不启动LPTIM1的话,可以发现UART1永远不会发送数据,自然它也接收不到任何数据。

关于STM32 DMAMUX的应用演示就介绍到这里。不难看出,使用DMAMUX相关功能及特性时,所需应用代码不多也不复杂,关键在原理及配置。DMAMUX有时会给我们的应用带来一些意想不到的方便,可以善加利用。

好,就此打住,下次再聊~!


快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 27-12-2024 10:53 , Processed in 0.250352 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.