0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

茶话MCU 来源:茶话MCU 2024-03-25 09:15 次阅读

有人通过公众号微信留言,询问是否有关于STM32 DMAMUX模块具体的应用示例代码。同时,个人也发现,虽然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有时会给我们的应用带来一些意想不到的方便,可以善加利用。

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




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 发生器
    +关注

    关注

    4

    文章

    1362

    浏览量

    61618
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354685
  • 外部中断
    +关注

    关注

    1

    文章

    131

    浏览量

    15801
  • DMA控制器
    +关注

    关注

    1

    文章

    43

    浏览量

    12263
  • stm32cubemx
    +关注

    关注

    5

    文章

    280

    浏览量

    14746

原文标题:STM32 DMAMUX应用示例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DMAMUX模块的大致原理及基本框架

    用过不带DMAMUXSTM32芯片的DMA模块的人可能会问,之前没这个模块,不是照样用吗?外设申请DMA请求,DMA控制器做出应答响应后即可实现DMA传输。为什么后面推出的
    的头像 发表于 06-18 09:49 1.2w次阅读
    <b class='flag-5'>DMAMUX</b><b class='flag-5'>模块</b>的大致原理及基本框架

    STM32L4R5的DMAMUX异常原因?

    __HAL_RCC_DMA1_CLK_ENABLE(); __HAL_RCC_DMAMUX1_CLK_ENABLE(); /*##-3- Configure the DMA
    发表于 04-19 06:36

    请问STM32L4R5ZI的DMA/DMAMUX是怎么管理请求?

    原来的STM32系列,比如F1,是没有DMAMUX这个东西的,DMA1的1通道2通道具体对应什么样的请求,有一个专门的对应表。但是现在的DMAMUX加进来以后,对于89个外设请求,并没
    发表于 04-28 06:19

    LabVIEW关于USRPRIO的示例代码

    LabVIEW关于USRPRIO的示例代码 USRPRIO 通常以两种方式使用: 1 基于 FPGA 的编程 对于希望修改USRP上的底层FPGA代码以添加自定义DSP
    发表于 11-16 20:22

    STM32 M4 时钟配置示例代码和工程文件免费下载

    本文档的主要内容详细介绍的是STM32 M4 时钟配置示例代码和工程文件免费下载。
    发表于 01-03 16:22 7次下载
    <b class='flag-5'>STM32</b> M4 时钟配置<b class='flag-5'>示例</b>源<b class='flag-5'>代码</b>和工程文件免费下载

    关于STM32浮点运算单元FPU的应用示例

    有人利用STM32芯片做些DSP处理,在启用FPU单元进行调试、验证过程中可能会遇到些小问题、小困惑,这里通过STM32F4芯片一个具体的应用示例简单分享下,希望顺便能给同仁提供些帮助
    的头像 发表于 01-02 18:09 8365次阅读
    <b class='flag-5'>关于</b><b class='flag-5'>STM32</b>浮点运算单元FPU的应用<b class='flag-5'>示例</b>

    STM32多个ADC模块同时采样转换的应用示例

    STM32多个ADC模块同时采样转换的应用示例(深圳市普德新星电源技术有限公司怎么样)-本文重点介绍利用含有3个ADC模块STM32F4、
    发表于 08-04 18:47 67次下载
    <b class='flag-5'>STM32</b>多个ADC<b class='flag-5'>模块</b>同时采样转换的应用<b class='flag-5'>示例</b>

    简单介绍有关STM32DMAMUX模块

    目前STM32家族中的很多系列,比如STM32G0/STM32G4/STM32L4+/STM32H7等都内置了
    的头像 发表于 08-14 15:10 4830次阅读
    简单介绍有关<b class='flag-5'>STM32</b>的<b class='flag-5'>DMAMUX</b><b class='flag-5'>模块</b>

    STM32单片机雨滴模块

    STM32单片机雨滴模块功能实现一、设备说明单片机:STM32f103zet6雨滴模块片描述二、部分关键代码1.初始化ADC采集
    发表于 11-18 20:36 48次下载
    <b class='flag-5'>STM32</b>单片机雨滴<b class='flag-5'>模块</b>

    STM32DAC讲解及代码示例

    DAC转换STM32的DAC模块主要特点有:① 2个DAC转换器:每个转换器对应1个输出通道② 8位或者12位单调输出③ 12位模式下数据左对齐或者右对齐④ 同步更新功能⑤ 噪声波形生成⑥ 三角波形
    发表于 12-27 18:26 16次下载
    <b class='flag-5'>STM32</b>DAC讲解及<b class='flag-5'>代码</b><b class='flag-5'>示例</b>

    STM32F1复习笔记一

    去年疫情在家学的,现在忘完了。。就准备把一些非常常见的模块功能的使用方法给记录这里,一来写一遍代码有个印象,二来也方便查阅。主要是整理正点原子的开发指南我用得到的地方STM32复习笔记一STM
    发表于 01-17 09:36 1次下载
    <b class='flag-5'>STM32</b>F1复习笔记一

    华为游戏服务示例代码教程案例

    概述 游戏服务kit安卓示例代码集成了华为游戏服务的众多API,提供了示例代码程序供您参考和使用,下面是对示例
    发表于 04-11 11:09 4次下载

    UM1549 STM32示例代码生成工具

    UM1549 STM32示例代码生成工具
    发表于 11-22 19:12 0次下载
    UM1549 <b class='flag-5'>STM32</b><b class='flag-5'>示例</b><b class='flag-5'>代码</b>生成工具

    UM1550 STM32示例代码生成工具用户手册

    UM1550 STM32示例代码生成工具用户手册
    发表于 11-22 19:12 0次下载
    UM1550 <b class='flag-5'>STM32</b><b class='flag-5'>示例</b><b class='flag-5'>代码</b>生成工具用户手册

    自己编写函数示例代码很难吗?分享几个示例

    Q A 问: Arduino Uno的函数示例 我决定自己编写函数示例代码,因为这应该是Arduino中的基本示例。网络上确实有关于使用函数
    的头像 发表于 11-16 16:05 486次阅读
    自己编写函数<b class='flag-5'>示例</b><b class='flag-5'>代码</b>很难吗?分享几个<b class='flag-5'>示例</b>!