文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。
历程代码:https://gitee.com/cai_xl/MyWayToLearnSTM32H7
因为在HAL库中DMAMUX这个外设已经被封装在DMA组件中,用户程序一般不会直接使用DMAMUX,所以这篇文章并不会讲解得特别详细。
DMAMUX在参考手册第16章。
DMAMUX是DMA request MUltipleXer的简写,意为DMA请求多路选择器。在DMA体系中的主要作用是将外设发出的DMA请求传递给对应的DMA通道或DMA数据流。
16.1节的信息比较少,所以略过。
在16.2节,手册简要介绍了DMAMUX的配置。

参考手册16.2节
这一节的内容比较繁琐,就目前而言,大部分内容都不需要关心。在这里只要关注最后一个黑点点的前两条就好:每个DMAMUX通道可以输入最多107个外设发送的请求,并产生一个输出,即多路信号选择。
16.3.1小节,DMAMUX外设实例。

参考手册16.3.1小节部分内容
可以知道,STM32H743单片机有两个DMAMUX,其中DMAMUX1用于D2电源域下的DMA1和DMA2,DMAMUX2用于D3电源域下的BDMA。
16.3.2和16.3.3小节是对16.3.1小节的扩充,列出了两个DMAMUX的所有请求源(表格略过)。DMAMUX1共16个通道,0-7号通道用于DMA1,8-15号通道用于DMA2;DMAMUX2有8个通道,全部用于BDMA。
16.4.1小节,一上来就是一张DMAMUX结构图:

在DMAMUX外部,共有3组DMA相关的输入信号:外设请求输入信号(dmamux_req_inx)、触发输入信号(dmamux_trgx)和同步输入信号(Synchronization input)。
外设请求输入信号由外设产生,不过也有一部分外设无法产生DMAMUX请求,比如EXIT、GPIO,像这样的外设,可以通过触发输入,由DMAMUX内部代替外设产生DMAMUX请求。同步输入用于控制DMAMUX何时向DMA控制器发出DMA请求。
图中可以看到DMAMUX由两个子块构成:请求发生器(Request generator)和请求多路选择器(Request multiplexer)。请求发生器用于响应触发输入信号,产生对应的DMAMUX请求信号dmamux_req_genx,这组信号与dmamux_req_inx合并为dmamux_reqx,通过并行方式传输到每个DMAMUX通道,并由每个通道选择其中的一个信号进行响应,通过右边的数据总线,向DMA控制器(DMA1、DMA2、BDMA)发出DMA请求。
这样一来DMA请求 就不再像STM32F1那样是固定的,每个外设只能向特定的DMA通道发出请求,而是可以任意选择外设与DMA数据流的。
16.4.2小节,DMAMUX的各种信号,看看就好,不需要太多关注。

DMAMUX的各种信号
此后大部分都是关于DMAMUX通道配置的内容,我们只关注16.4.4小节中的一部分:同步模式和事件生成。
同步模式简单地说就是收到一次同步输入(上升沿、下降沿或跳变沿),就将使能多路选择器中选择的信号,即允许这个信号向DMA控制器发出请求,在同步结束的时候,产生一个事件(evt),并断开多路选择器与DMA控制器的连接。同步的结束并不是指一次DMA传输完成,每个DMAMUX通道都有递减一个计数器,用于请求计数,当计数器的值欠载(减到0还想减),就标志着一次同步结束。这个值从CCR寄存器的NBREQ域自动装载,并加上1。
以下就是同步模式的时序图:

DMAMUX同步时序
至于事件生成,则发生在每一次递减计数器欠载时,并会自动重装定时器值。
关于16.5节的DMAMUX中断,并没有找到足够的资料,所以只能从名称上推断DMAMUX的中断。

DMAMUX的中断
这两个中断各有一个“overrrun”,那么估计就是“上一个还没处理完,下一个又来了”这样的中断。