你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

DMAMUX 使用内部外设Request Event(不使用TIM12和LPTIM)

[复制链接]
talk is cheap 提问时间:2025-12-8 16:08 / 未解决

问题描述:如何使用内部外设(TIM2)产生DMAMUX请求事件,作为其他外设的同步触发请求,硬件平台:STM32H750XBH7。 问题背景:首先描述业务逻辑:仪器需要定时10KHz频率通过DMA双缓冲向SPI总线(SPI菊花链控制多路DAC,已测试正常)上发送数据,同时触发一路串口发送ASCII数据(100Hz或者10Hz),仪器的主要性能指标在于jiteer(尽量避免定时触发的不稳定性,由于仪器是一个连续时间过程,jitter-定时触发的快慢变化会随着时间的累计误差逐渐增大),当前使用25M外部晶振(测试内部RC晶振-0.08%抖动会引起很大的累计偏差)+TIM12触发SPI和串口(均使用DMA双缓冲,数据不经过CPU),当前使用示波器解码(5M的SPI总线,示波器100Msa/s)观察,估算1s计时累计的时间抖动约在0.5ms附近。 image.png 期望结果:由于当前定时触发+SPI双缓冲链路过长,jitter属于不确定性因素,受限于硬件传输线路/温漂等因素,当前期望对其偏差进行补偿,通过调节定时器ARR自动重装载的数值来进一步减小误差(通过测量的频率来反馈修改定时器ARR数值),但不论是TIM12/LPTIM1/2/3均是16位,能够操作的空间很小,只能使用TIM2-32bit.

当前网上例程安富莱/ST论坛/CubeMX例程均使用TIM12/EXTI/LPTIM同步触发,从未见过使用(绝不可能无法使用,否则DMAMUX的功能太过局限),我自己使用CubeMX配置这一部分无法同步触发(CubeMX例程全是使用LPTIM同步触发),希望给予指导或者参考例程 image.png

image.png

image.png

image.png
image.png
image.png
image.png
收藏 评论8 发布时间:2025-12-8 16:08

举报

8个回答
talk is cheap 回答时间:2025-12-10 16:10:43

talk is cheap 发表于 2025-12-9 16:48
还是不知道为什么TIM_UP事件为什么不能正常触发HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT事件,后端验证部分 ...

[md]事实上 我阅读了外部ST论坛,我查阅到之前有开发者提出类似的问题,国外FAE也有相关研究,很有可能已经有相关的demo,希望进一步获取的支持 谢谢

https://community.st.com/t5/stm32-mcus-products/how-to-use-dmamux-generated-events-to-trigger-another-dma/m-p/652741

https://community.st.com/t5/stm32-mcus-embedded-software/dmamux-chaining-of-request-generators/m-p/766449

https://community.st.com/t5/stm32-mcus-products/confusion-on-dmamux-registers-in-rm0468/m-p/694258

talk is cheap 回答时间:2025-12-8 18:39:56

根据现在CubeMX的生成代码,感觉这个问题是一个DMAMUX级联的问题:首先使用DMA_REQUEST_TIM1_CH1请求生成HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT(DMA1_Stream0),然后HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT同步触发hdma_spi2_tx的发送DMA(DMA1_Stream2),问题的关键在于不知道如何建立DMA_REQUEST_TIM1_CH1和HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT的联系

xmshao 回答时间:2025-12-9 11:14:37

talk is cheap 发表于 2025-12-8 18:39
根据现在CubeMX的生成代码,感觉这个问题是一个DMAMUX级联的问题:首先使用DMA_REQUEST_TIM1_CH1请求生 ...

[md]TIM1的定时器事件本身是没法直接作为其它DMA请求的同步触发信号的,

【当然LPTIM可以,这也正是我们看到的例程多选择LPTIM或EXTI来产生DMA请求或作为

其它DMA Stream的同步信号】

DMAMUX_EVT通常由其它DMA完成事件产生,这样便于DMA间的级联。

比方TIM1-CH1事件触发DMA1-S1的传输,该传输完成事件可以连接到DMAMUX,

去作为其它DMA stream的同步触发信号。

talk is cheap 回答时间:2025-12-9 12:40:01

xmshao 发表于 2025-12-9 11:14
TIM1的定时器事件本身是没法直接作为其它DMA请求的同步触发信号的,</p>
<p>【当然LPTIM可以,这也正是我们 ...

[md]感谢回复 正如上图所示 我认为dmamux1_evt0(0-3)这类事件作为DMAMUX1和DMAMUX2触发输入和同步输入(大约占据一半的硬连线资源),正是通过级联的方式管理外部dmamux1_req_gen0到ADC3共计115个来自外设的DMA请求, (实际现有上缺少的恰好是使用常见的外设请求I2C/高级定时器TIM2这样的通用外设,而不是触发/同步输入的偏后ID:LPTIM1/EXTI),我检索了所有STM32Cube_FW_H7_V1.12.1例程,均为LPTIM和EXTI。当前我测试DMAMUX级联的过程中我使用的是TIM2-CH1生成dmamux1_evt0,其难点感觉感觉还是在于还没摸清楚DMAMUX是如何触发对应DMA通道(DMAMUX1_OVR_IRQHandler不知道怎么触发陷入debug中断来验证来自外设的DMA请求是否有效),待更新

talk is cheap 回答时间:2025-12-9 16:48:25

talk is cheap 发表于 2025-12-9 12:40
感谢回复 正如上图所示 我认为dmamux1_evt0(0-3)这类事件作为DMAMUX1和DMAMUX2触发输入和同步输入 ...

[md]还是不知道为什么TIM_UP事件为什么不能正常触发HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT事件,后端验证部分正常工作(只是将原本使用LPTIM2-测试过正常输出同步触发的部分修改为HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT),且观测寄存器也是正常符合事件生成时序图

image.png

xmshao 回答时间:2025-12-10 09:28:28

talk is cheap 发表于 2025-12-9 16:48
还是不知道为什么TIM_UP事件为什么不能正常触发HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT事件,后端验证部分 ...

[md]前面说了TIM-UP事件肯定不能直接产生DMA_EVTx事件,倒是TIM-UP触发的DMA传输事件可以产生DMA_EVTx事件,然后它可以产生新的DMA请求或做其它DMA通道的同步触发事件。

talk is cheap 回答时间:7 天前

xmshao 发表于 2025-12-10 09:28</p>
<p>[md]前面说了TIM-UP事件肯定不能直接产生DMA_EVTx事件,倒是TIM-UP触发的DMA传输事件可以产生DMA_EVT ...

[md]谢谢指点 成功了 后续会发布在gitee上

xmshao 回答时间:6 天前

talk is cheap 发表于 2025-12-18 21:39
谢谢指点 成功了 后续会发布在gitee上

不客气。

我刚好昨天也分享一篇基于DMAMUX实现DMA级联的文章,你可以阅读参考。

利用DMAMUX实现DMA级联传输示例

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版