硬汉嵌入式论坛

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

[TIMER] STM32H7定时器同步模式,使用TIM1控制TIM3和TIM4同步

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2018-8-22 10:38:45 | 显示全部楼层 |阅读模式
说明:
TIM1作为主控机,配置为PWM模式,通过更新事件作为TIM3和TIM4的触发源。

TIM3和TIM4作为从机,配置为PWM模式,输入触发源是ITR0,由于使用了门控功能,TIM4和TIM3的启动停止全部由TIM1来控制。

TIM1 频率 = TIM1 counter clock / (TIM1_Period + 1) = 781.250 KHz
占空比 = TIM1_CCR1 / (TIM1_ARR + 1) = 50%

TIM3频率 =  (TIM1 frequency)/ ((TIM3 period +1)* (TIM1_Repetition_Counter+1)) = 52.083 KHz
占空比 = TIM3_CCR1/(TIM3_ARR + 1) = 33.3%

TIM4频率 =  (TIM1 frequency)/ ((TIM4 period +1)* (Repetition_Counter+1)) = 78.125 KHz
占空比 = TIM4_CCR1/(TIM4_ARR + 1) = 50%




框图:
QQ截图20180822103802.png





代码:

  1. /* Private typedef -----------------------------------------------------------*/
  2. /* Private define ------------------------------------------------------------*/
  3. /* Private macro -------------------------------------------------------------*/
  4. /* Private variables ---------------------------------------------------------*/
  5. /* Timer1 handler declaration: Master */
  6. TIM_HandleTypeDef         TimMasterHandle;

  7. /* Timer3 handler declaration: Slave1 */
  8. TIM_HandleTypeDef         TimSlave1Handle;

  9. /* Timer4 handler declaration: Slave2 */
  10. TIM_HandleTypeDef         TimSlave2Handle;

  11. /* Output compare structure */
  12. TIM_OC_InitTypeDef        sOCConfig;

  13. /* Master configuration structure */
  14. TIM_MasterConfigTypeDef   sMasterConfig;

  15. /* Slave configuration structure */
  16. TIM_SlaveConfigTypeDef   sSlaveConfig;

  17. /* Private function prototypes -----------------------------------------------*/
  18. static void SystemClock_Config(void);
  19. static void Error_Handler(void);
  20. static void CPU_CACHE_Enable(void);
  21. /* Private functions ---------------------------------------------------------*/

  22. /**
  23.   * @brief  Main program.
  24.   * @param  None
  25.   * @retval None
  26.   */
  27. int main(void)
  28. {
  29.   /* Enable the CPU Cache */
  30.   CPU_CACHE_Enable();

  31.   /* STM32H7xx HAL library initialization:
  32.        - Systick timer is configured by default as source of time base, but user
  33.          can eventually implement his proper time base source (a general purpose
  34.          timer for example or other time source), keeping in mind that Time base
  35.          duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and
  36.          handled in milliseconds basis.
  37.        - Set NVIC Group Priority to 4
  38.        - Low Level Initialization
  39.      */
  40.   HAL_Init();

  41.   /* Configure the system clock to 400 MHz */
  42.   SystemClock_Config();

  43.   /* Configure LED3 */
  44.   BSP_LED_Init(LED3);

  45.   /* Timers Configuration */
  46.   /* ---------------------------------------------------------------------------
  47.     TIM1 and Timers(TIM3 and TIM4) synchronisation in parallel mode.
  48.      1/TIM1 is configured as Master Timer:
  49.          - PWM Mode is used
  50.          - The TIM1 Update event is used as Trigger Output

  51.      2/TIM3 and TIM4 are slaves for TIM1,
  52.          - PWM Mode is used
  53.          - The ITR0(TIM1) is used as input trigger for both slaves
  54.          - Gated mode is used, so starts and stops of slaves counters
  55.            are controlled by the Master trigger output signal(update event).

  56.     In this example TIM1 input clock (TIM1CLK) is set to APB2 clock DIV2 (PCLK2),
  57.     since APB2 prescaler is different from 1.
  58.       TIM1CLK = 2 * APB2 clock
  59.       => TIM1CLK = 2*PCLK2

  60.     The TIM1 counter clock is equal to 2*PCLK2 = 200 MHz.

  61.     The Master Timer TIM1 is running at:
  62.     TIM1 frequency = TIM1 counter clock / (TIM1_Period + 1) = 781.250 KHz
  63.     TIM1_Period = (TIM1 counter clock / TIM1 frequency) - 1 = 182
  64.     and the duty cycle is equal to: TIM1_CCR1/(TIM1_ARR + 1) = 50%

  65.     The TIM3 is running at:
  66.     (TIM1 frequency)/ ((TIM3 period +1)* (Repetition_Counter+1)) = 52.083 KHz and
  67.     a duty cycle equal to TIM3_CCR1/(TIM3_ARR + 1) = 33.3%

  68.     The TIM4 is running at:
  69.     (TIM1 frequency)/ ((TIM4 period +1)* (Repetition_Counter+1)) = 78.125 KHz and
  70.     a duty cycle equal to TIM4_CCR1/(TIM4_ARR + 1) = 50%

  71.     Note:
  72.      SystemCoreClock variable holds HCLK frequency and is defined in SystemClock_Config().
  73.      Each time the core clock (HCLK) changes, user had to update SystemCoreClock
  74.      variable value. Otherwise, any configuration based on this variable will be incorrect.
  75.      This variable is updated in three ways:
  76.       1) by calling CMSIS function SystemCoreClockUpdate()
  77.       2) by calling HAL API function HAL_RCC_GetSysClockFreq()
  78.       3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
  79.   --------------------------------------------------------------------------- */

  80.   /* Set Timers instance */
  81.   TimMasterHandle.Instance = TIM1;
  82.   TimSlave1Handle.Instance = TIM3;
  83.   TimSlave2Handle.Instance = TIM4;

  84.   /*====================== Master configuration : TIM1 =======================*/
  85.   /* Initialize TIM1 peripheral in PWM mode*/
  86.   TimMasterHandle.Init.Period            = 255;
  87.   TimMasterHandle.Init.Prescaler         = 0;
  88.   TimMasterHandle.Init.ClockDivision     = 0;
  89.   TimMasterHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  90.   TimMasterHandle.Init.RepetitionCounter = 4;
  91.   if (HAL_TIM_PWM_Init(&TimMasterHandle) != HAL_OK)
  92.   {
  93.     /* Initialization Error */
  94.     Error_Handler();
  95.   }

  96.   /* Configure the PWM_channel_1  */
  97.   sOCConfig.OCMode       = TIM_OCMODE_PWM1;
  98.   sOCConfig.OCPolarity   = TIM_OCPOLARITY_HIGH;
  99.   sOCConfig.Pulse        = 128;
  100.   sOCConfig.OCNPolarity  = TIM_OCNPOLARITY_HIGH;
  101.   sOCConfig.OCFastMode   = TIM_OCFAST_DISABLE;
  102.   sOCConfig.OCIdleState  = TIM_OCIDLESTATE_RESET;
  103.   sOCConfig.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  104.   if (HAL_TIM_PWM_ConfigChannel(&TimMasterHandle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK)
  105.   {
  106.     /* Configuration Error */
  107.     Error_Handler();
  108.   }

  109.   /* Configure TIM1 as master & use the update event as Trigger Output (TRGO) */
  110.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  111.   sMasterConfig.MasterSlaveMode     = TIM_MASTERSLAVEMODE_ENABLE;
  112.   if (HAL_TIMEx_MasterConfigSynchronization(&TimMasterHandle, &sMasterConfig) != HAL_OK)
  113.   {
  114.     /* Configuration Error */
  115.     Error_Handler();
  116.   }

  117.   /*================== End of Master configuration : TIM1 ====================*/


  118.   /*====================== Slave1 configuration : TIM3 =======================*/
  119.   /* Initialize TIM3 peripheral in PWM mode*/
  120.   TimSlave1Handle.Init.Period            = 2;
  121.   TimSlave1Handle.Init.Prescaler         = 0;
  122.   TimSlave1Handle.Init.ClockDivision     = 0;
  123.   TimSlave1Handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  124.   TimSlave1Handle.Init.RepetitionCounter = 0;
  125.   if (HAL_TIM_PWM_Init(&TimSlave1Handle) != HAL_OK)
  126.   {
  127.     /* Initialization Error */
  128.     Error_Handler();
  129.   }

  130.   /* Configure the PWM_channel_1  */
  131.   sOCConfig.OCMode     = TIM_OCMODE_PWM1;
  132.   sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  133.   sOCConfig.Pulse = 1;
  134.   if (HAL_TIM_PWM_ConfigChannel(&TimSlave1Handle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK)
  135.   {
  136.     /* Configuration Error */
  137.     Error_Handler();
  138.   }

  139.   /* Configure TIM3 in Gated slave mode &
  140.   use the Internal Trigger 0 (ITR0) as trigger source */
  141.   sSlaveConfig.SlaveMode        = TIM_SLAVEMODE_GATED;
  142.   sSlaveConfig.InputTrigger     = TIM_TS_ITR0;
  143.   sSlaveConfig.TriggerPolarity  = TIM_TRIGGERPOLARITY_NONINVERTED;
  144.   sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;
  145.   sSlaveConfig.TriggerFilter    = 0;
  146.   if (HAL_TIM_SlaveConfigSynchronization(&TimSlave1Handle, &sSlaveConfig) != HAL_OK)
  147.   {
  148.     /* Configuration Error */
  149.     Error_Handler();
  150.   }

  151.   /*================== End of Slave1 configuration : TIM3 ====================*/


  152.   /*====================== Slave2 configuration : TIM4 =======================*/
  153.   /* Initialize TIM4 peripheral in PWM mode*/
  154.   TimSlave2Handle.Init.Period            = 1;
  155.   TimSlave2Handle.Init.Prescaler         = 0;
  156.   TimSlave2Handle.Init.ClockDivision     = 0;
  157.   TimSlave2Handle.Init.CounterMode       = TIM_COUNTERMODE_UP;
  158.   TimSlave2Handle.Init.RepetitionCounter = 0;
  159.   if (HAL_TIM_PWM_Init(&TimSlave2Handle) != HAL_OK)
  160.   {
  161.     /* Initialization Error */
  162.     Error_Handler();
  163.   }

  164.   /* Configure the PWM_channel_1  */
  165.   sOCConfig.OCMode     = TIM_OCMODE_PWM1;
  166.   sOCConfig.OCPolarity = TIM_OCPOLARITY_HIGH;
  167.   sOCConfig.Pulse = 1;
  168.   if (HAL_TIM_PWM_ConfigChannel(&TimSlave2Handle, &sOCConfig, TIM_CHANNEL_1) != HAL_OK)
  169.   {
  170.     /* Configuration Error */
  171.     Error_Handler();
  172.   }

  173.   /* Configure TIM3 in Gated slave mode &
  174.   use the Internal Trigger 0 (ITR0) as trigger source */
  175.   sSlaveConfig.SlaveMode     = TIM_SLAVEMODE_GATED;
  176.   sSlaveConfig.InputTrigger  = TIM_TS_ITR0;
  177.   if (HAL_TIM_SlaveConfigSynchronization(&TimSlave2Handle, &sSlaveConfig) != HAL_OK)
  178.   {
  179.     /* Configuration Error */
  180.     Error_Handler();
  181.   }

  182.   /*================== End of Slave2 configuration : TIM4 ====================*/


  183.   /* Start Master PWM generation */
  184.   if (HAL_TIM_PWM_Start(&TimMasterHandle, TIM_CHANNEL_1) != HAL_OK)
  185.   {
  186.     /* PWM generation Error */
  187.     Error_Handler();
  188.   }

  189.   /* Start Slave1 PWM generation */
  190.   if (HAL_TIM_PWM_Start(&TimSlave1Handle, TIM_CHANNEL_1) != HAL_OK)
  191.   {
  192.     /* PWM generation Error */
  193.     Error_Handler();
  194.   }
  195.   /* Start Slave2 PWM generation */
  196.   if (HAL_TIM_PWM_Start(&TimSlave2Handle, TIM_CHANNEL_1) != HAL_OK)
  197.   {
  198.     /* PWM generation Error */
  199.     Error_Handler();
  200.   }

  201.   while (1)
  202.   {
  203.   }

  204. }
复制代码



回复

使用道具 举报

609

主题

3050

回帖

4897

积分

至尊会员

积分
4897
发表于 2018-9-18 17:03:42 | 显示全部楼层
对 h7 研究的很透啊,估计 很快就会有板子出来了吧 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2018-9-19 01:42:00 | 显示全部楼层
hpdell 发表于 2018-9-18 17:03
对 h7 研究的很透啊,估计 很快就会有板子出来了吧 ?

还在编制这个帖子里面的用户手册
http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-11-17 22:03:00 | 显示全部楼层
eric2013 发表于 2018-9-19 01:42
还在编制这个帖子里面的用户手册
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page ...

晚上好,硬汉哥,请教个问题,stm32H743的TIM12框图里面没有TRGO这个信号,但是手册里面有写这个信号可以用作adc同步的,想请问下这个信号是怎么产生的,没找到相对应的配置,疑惑
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
 楼主| 发表于 2022-11-18 00:49:07 | 显示全部楼层
yelu 发表于 2022-11-17 22:03
晚上好,硬汉哥,请教个问题,stm32H743的TIM12框图里面没有TRGO这个信号,但是手册里面有写这个信号可以 ...

有的,看新版框图
image.png


回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-11-19 14:22:28 | 显示全部楼层
eric2013 发表于 2022-11-18 00:49
有的,看新版框图

谢谢~                              
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 23:33 , Processed in 0.173291 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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