|
问题描述:如何使用内部外设(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附近。
当前网上例程安富莱/ST论坛/CubeMX例程均使用TIM12/EXTI/LPTIM同步触发,从未见过使用(绝不可能无法使用,否则DMAMUX的功能太过局限),我自己使用CubeMX配置这一部分无法同步触发(CubeMX例程全是使用LPTIM同步触发),希望给予指导或者参考例程
|
STM32H7A3 怎样配置MDMA的硬件触发MDMA_REQUEST_DMA1_Stream0_TC将数据再次转运
请教STM32F103的DMA空闲接收问题
使用stm32cubeide开发h743,准备采用spi flash的方式下载外部norflash
STM32H723FDCANT通信
stlinkv2给h7烧录程序一直报这个错,有解决方法吗?
选型,实现USB转2路CAN功能,目前看到STM32F407和STM32H750都有2路CAN,都能实现功能吗?
LPTIM5的事件Lptim5_ait作为14号Trigger input输入到DMAMUX2 Request generator触发BDMA未生成中断问题
STM32H743 HSE 48MHz晶振无法实现
STM32H743 配置USBOTG 使用U盘几周后 stm32无法识别usb
STM32H7A3RGT6 ADC 8位采样速度只能达到3.5MSPS达不到数据手册上的7MSPS ?
微信公众号
手机版
[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
根据现在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的联系
[md]TIM1的定时器事件本身是没法直接作为其它DMA请求的同步触发信号的,
【当然LPTIM可以,这也正是我们看到的例程多选择LPTIM或EXTI来产生DMA请求或作为
其它DMA Stream的同步信号】
DMAMUX_EVT通常由其它DMA完成事件产生,这样便于DMA间的级联。
比方TIM1-CH1事件触发DMA1-S1的传输,该传输完成事件可以连接到DMAMUX,
去作为其它DMA stream的同步触发信号。
[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请求是否有效),待更新
[md]还是不知道为什么TIM_UP事件为什么不能正常触发HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT事件,后端验证部分正常工作(只是将原本使用LPTIM2-测试过正常输出同步触发的部分修改为HAL_DMAMUX1_SYNC_DMAMUX1_CH0_EVT),且观测寄存器也是正常符合事件生成时序图
[md]前面说了TIM-UP事件肯定不能直接产生DMA_EVTx事件,倒是TIM-UP触发的DMA传输事件可以产生DMA_EVTx事件,然后它可以产生新的DMA请求或做其它DMA通道的同步触发事件。
[md]谢谢指点 成功了 后续会发布在gitee上
不客气。
我刚好昨天也分享一篇基于DMAMUX实现DMA级联的文章,你可以阅读参考。
利用DMAMUX实现DMA级联传输示例
[md]https://gitee.com/qindongzhi/dma_-uart.git 前段时间太忙了 工程如下 需要者自提