关于STM32 DMAMUX模块具体的应用示例代码

发布时间:2024-08-05  

个人也发现,虽然STM32片内的DMAMUX不是什么新模块,似乎还是很多人并不太熟悉。这里借机聊聊这方面的内容,重点演示相关功能的实现,以供参考。

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


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

1eed29d4-ea3e-11ee-a297-92fbcf53809c.png

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

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

1efdff48-ea3e-11ee-a297-92fbcf53809c.png

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

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

1fd1a596-ea3e-11ee-a297-92fbcf53809c.png

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

1fe54196-ea3e-11ee-a297-92fbcf53809c.png

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

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

1ff3eb1a-ea3e-11ee-a297-92fbcf53809c.png

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

20085cd0-ea3e-11ee-a297-92fbcf53809c.png

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

201efe0e-ea3e-11ee-a297-92fbcf53809c.png

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

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

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

202ea3d6-ea3e-11ee-a297-92fbcf53809c.png

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

20446586-ea3e-11ee-a297-92fbcf53809c.png

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

206292c2-ea3e-11ee-a297-92fbcf53809c.png

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

20741f38-ea3e-11ee-a297-92fbcf53809c.png

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

208559d8-ea3e-11ee-a297-92fbcf53809c.png

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

209be202-ea3e-11ee-a297-92fbcf53809c.png

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

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>