硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1022|回复: 12
收起左侧

[TIMER] TIM12同步触发spi+dma问题

[复制链接]

20

主题

38

回帖

98

积分

初级会员

积分
98
发表于 2024-11-20 09:54:40 | 显示全部楼层 |阅读模式
因为我连接adc的引脚cnv 并不是 TIM12  因此我需要两个定时器做一个同步,我的操作是是开启一个主定时器然后再开启两个从定时器,当前现象是可以观察两个从定时器波形一致,但并没有产生spi+dma的数据搬运
代码如下:
主定时器

/*====================== Master configuration : TIM4 =======================*/
        TimMasterHandle.Init.Period            = usPeriod;
        TimMasterHandle.Init.Prescaler         = 0;
        TimMasterHandle.Init.ClockDivision     = 0;
        TimMasterHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
        TimMasterHandle.Init.RepetitionCounter = 0;
        if (HAL_TIM_PWM_Init(&TimMasterHandle) != HAL_OK)
        {
                /* Initialization Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* Configure the PWM_channel_1  */
        sOCConfig.OCMode       = TIM_OCMODE_PWM1;
        sOCConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
        sOCConfig.Pulse        = pulse;
        sOCConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
        sOCConfig.OCFastMode   = TIM_OCFAST_DISABLE;
        sOCConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
        sOCConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
        if (HAL_TIM_PWM_ConfigChannel(&TimMasterHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* Configure TIM1 as master & use the update event as Trigger Output (TRGO) */
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
        sMasterConfig.MasterSlaveMode     = TIM_MASTERSLAVEMODE_DISABLE;
        if (HAL_TIMEx_MasterConfigSynchronization(&TimMasterHandle, &sMasterConfig) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /*================== End of Master configuration : TIM4 ====================*/
从定时器  这个定时器接adc芯片的cnv
      /*====================== Slave1 configuration : TIM1 =======================*/
        /* Initialize TIM4 peripheral in PWM mode*/
        TimSlave1Handle.Init.Period            = usPeriod;
        TimSlave1Handle.Init.Prescaler         = 0;
        TimSlave1Handle.Init.ClockDivision     = 0;
        TimSlave1Handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
        TimSlave1Handle.Init.RepetitionCounter = 0;
       
        if (HAL_TIM_PWM_Init(&TimSlave1Handle) != HAL_OK)
        {
                /* Initialization Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* Configure the PWM_channel_4  */
        sOCConfig.OCMode     = TIM_OCMODE_PWM1;
        sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
        sOCConfig.Pulse      = pulse;
        if (HAL_TIM_PWM_ConfigChannel(&TimSlave1Handle, &sOCConfig, TIM_CHANNEL_4) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* Configure TIM3 in Gated slave mode & use the Internal Trigger 0 (ITR3) as trigger source */
        sSlaveConfig.SlaveMode        = TIM_SLAVEMODE_TRIGGER;
        sSlaveConfig.InputTrigger     = TIM_TS_ITR3;
        sSlaveConfig.TriggerPolarity  = TIM_TRIGGERPOLARITY_NONINVERTED;
        sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
        sSlaveConfig.TriggerFilter    = 0;
        if (HAL_TIM_SlaveConfigSynchronization(&TimSlave1Handle, &sSlaveConfig) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }

/*====================== Slave2 configuration : TIM12 =======================*/
        /* Initialize TIM4 peripheral in PWM mode*/
        TimSlave2Handle.Init.Period            = usPeriod;
        TimSlave2Handle.Init.Prescaler         = 0;
        TimSlave2Handle.Init.ClockDivision     = 0;
        TimSlave2Handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
        TimSlave2Handle.Init.RepetitionCounter = 0;
        if (HAL_TIM_PWM_Init(&TimSlave2Handle) != HAL_OK)
        {
                /* Initialization Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* Configure the PWM_channel_1  */
        sOCConfig.OCMode     = TIM_OCMODE_PWM1;
        sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
        sOCConfig.Pulse = pulse;
        if (HAL_TIM_PWM_ConfigChannel(&TimSlave2Handle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
        sSlaveConfig.SlaveMode     = TIM_SLAVEMODE_TRIGGER;
        sSlaveConfig.InputTrigger  = TIM_TS_ITR0;
        if (HAL_TIM_SlaveConfigSynchronization(&TimSlave2Handle, &sSlaveConfig) != HAL_OK)
        {
                /* Initialization Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* 同时tim12的下降沿触发 spi+dma 采样 */
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
//    sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
        if (HAL_TIMEx_MasterConfigSynchronization(&TimSlave2Handle, &sMasterConfig) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
       
        /*================== End of Slave2 configuration : TIM12 ====================*/

      /* 开启PWM */
        if (HAL_TIM_PWM_Start(&TimMasterHandle, TIM_CHANNEL_1) != HAL_OK)
        {
                /* Initialization Error */
                Error_Handler(__FILE__, __LINE__);
        }
       
        /* Start Slave1 PWM generation */
        if (HAL_TIM_PWM_Start(&TimSlave1Handle, TIM_CHANNEL_4) != HAL_OK)
        {
                /* PWM generation Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* Start Slave2 PWM generation */
        if (HAL_TIM_PWM_Start(&TimSlave2Handle, TIM_CHANNEL_1) != HAL_OK)
        {
                /* PWM generation Error */
                Error_Handler(__FILE__, __LINE__);




然后spi+dma的配置如图所示:
Snipaste_2024-11-20_09-51-33.png
然后我还有个问题是   TIM12触发配置   如果我想要的是下降沿采集我应该如何配置
Snipaste_2024-11-20_09-53-03.png



求助求助  因为是第一次弄SPI+DMA+ADC

回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-20 14:51:43 | 显示全部楼层
别沉呀 这问题困扰我四五天了 没有解决
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-20 16:22:47 | 显示全部楼层
没太看懂楼主的逻辑,这个TIM12是主从模式都使用,确认下支持不,我没这么实测过

      /* Configure the PWM_channel_1  */
        sOCConfig.OCMode     = TIM_OCMODE_PWM1;
        sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
        sOCConfig.Pulse = pulse;
        if (HAL_TIM_PWM_ConfigChannel(&TimSlave2Handle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
        sSlaveConfig.SlaveMode     = TIM_SLAVEMODE_TRIGGER;
        sSlaveConfig.InputTrigger  = TIM_TS_ITR0;
        if (HAL_TIM_SlaveConfigSynchronization(&TimSlave2Handle, &sSlaveConfig) != HAL_OK)
        {
                /* Initialization Error */
                Error_Handler(__FILE__, __LINE__);
        }
        /* 同时tim12的下降沿触发 spi+dma 采样 */
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
//    sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
        if (HAL_TIMEx_MasterConfigSynchronization(&TimSlave2Handle, &sMasterConfig) != HAL_OK)
        {
                /* Configuration Error */
                Error_Handler(__FILE__, __LINE__);
        }
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-20 18:25:25 | 显示全部楼层
eric2013 发表于 2024-11-20 16:22
没太看懂楼主的逻辑,这个TIM12是主从模式都使用,确认下支持不,我没这么实测过

      /* Configure th ...

主从模式是否能都使用 我是看了如下连接
https://shequ.stmicroelectronics.cn/thread-622883-1-1.html
我的想法是   因为adc芯片 使用的三线模式   并不需要SPI的发送功能  因此我将spi配置成 spi只接收模式,然后使用adc芯片 想通过tim12产生cnv信号给adc  并在下降沿产生触发信号给DMAMUX  DMAMUX接到触发信号后,进行一次的SPI+DMA的读取
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-20 18:27:44 | 显示全部楼层
marin0vv0 发表于 2024-11-20 18:25
主从模式是否能都使用 我是看了如下连接
https://shequ.stmicroelectronics.cn/thread-622883-1-1.html
...

但我现在换了一种方式  没有使用主从模式  我就通过延时 来使得两个定时器能达到一个伪同步的状态,但后面只DMAMUX触发spi+dma读取 读不到数据
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-21 09:52:23 | 显示全部楼层

AD7606 FMC DMA做过一个类似用法,我是这样的:


1234.png
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-21 10:15:11 | 显示全部楼层
eric2013 发表于 2024-11-21 09:52
AD7606 FMC DMA做过一个类似用法,我是这样的:

但是定时器触发能作为spi+dma的触发源?
我是参考了这个连接里面的大佬的思路去尝试的
[STM32H750] [经验分享]纯硬件实现SPI接口驱动外部ADC以800KSps速度连续采样
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-21 10:15:30 | 显示全部楼层
marin0vv0 发表于 2024-11-21 10:15
但是定时器触发能作为spi+dma的触发源?
我是参考了这个连接里面的大佬的思路去尝试的
[STM32H750] [经 ...

https://www.armbbs.cn/forum.php? ... 0226&fromuid=58
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-22 09:06:28 | 显示全部楼层
marin0vv0 发表于 2024-11-21 10:15
但是定时器触发能作为spi+dma的触发源?
我是参考了这个连接里面的大佬的思路去尝试的
[STM32H750] [经 ...

可以的,我这个是up事件触发的。同时这个定时的CH通道输出PWM
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-22 10:27:42 | 显示全部楼层
eric2013 发表于 2024-11-22 09:06
可以的,我这个是up事件触发的。同时这个定时的CH通道输出PWM

硬汉哥  我修改你的那个dac + spi+dma 的同步触发例程  我将其移植到我的环境中, 观察tim12的波形和sck波形,查看是否触发  你的例程是只发模式  我可以明显的从示波器中观察到  tim12可以触发spi+dma的发送
然后我按照我的需求  修改成只收模式  此时spi+dma的读取无法被同步触发   但是可以观察到sck上是有波形的,意味着spi+dma的循环模式时开启的,一直在读取,有间隔 但间隔只是受到该参数hspi.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_02CYCLE的影响 不受tim12触发源的影响
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-23 09:48:03 | 显示全部楼层
marin0vv0 发表于 2024-11-22 10:27
硬汉哥  我修改你的那个dac + spi+dma 的同步触发例程  我将其移植到我的环境中, 观察tim12的波形和sck ...

这个情况下,你直接修改为全双工,或者仅发送,其它地方不该,看看波形正常吗
回复

使用道具 举报

20

主题

38

回帖

98

积分

初级会员

积分
98
 楼主| 发表于 2024-11-23 16:08:19 | 显示全部楼层
eric2013 发表于 2024-11-23 09:48
这个情况下,你直接修改为全双工,或者仅发送,其它地方不该,看看波形正常吗

问题解决  全双工和只发送模式  使用定时器触发  是没有问题的可以很明显的从 sck和cnv波形中看出来   而只接收模式不行   项目现在已经改成全双工模式
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-11-24 09:53:16 | 显示全部楼层
marin0vv0 发表于 2024-11-23 16:08
问题解决  全双工和只发送模式  使用定时器触发  是没有问题的可以很明显的从 sck和cnv波形中看出来   而 ...

谢谢告知最终原因。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-28 20:05 , Processed in 1.137626 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表