【STM32H7 开发笔记】| 02 - 通过定时器级联方式同步启动多个定时器并输出 PWM 波形

前言

  • (STM32H723xE/G) 所有定时器包括两个高级控制定时器、十二个通用定时器、两个基本定时器、五个低功耗定时器、两个看门狗定时器和一个SysTick定时器 。所有计时器计数器都可以在Debug模式下冻结。本次实验主频配置的是500MHz

一、分类

1.高级定时器(TIM1,TIM8)

高级控制定时器(TIM1,TIM8)可以看作是在6通道上复用的三相PWM发生器。它们具有互补的PWM输出,可编程插入死区时间。它们也可以被认为是完全通用的计时器。它们的4个独立通道可用于:

  • 输入捕获
  • 输出比较
  • PWM产生(边缘或中心对齐模式)
  • 单脉冲模式输出

如果配置为标准的16位计时器,它们具有与通用TIMx计时器相同的功能。如果配置为16位PWM发生器,它们具有完全调制能力(0-100%)。高级控制计时器可以与TIMx计时器一起工作,通过定时器链接功能进行同步或事件链接。TIM1和TIM8支持独立的DMA请求生成。

2.通用定时器(TIMx)

通用定时器(TIMx)在STM32H723xE/G器件中嵌入了10个可同步的通用定时器。

  • TIM2,TIM3,TIM4,TIM5,TIM23,TIM24
    该器件包括4个全功能的通用定时器:TIM2,TIM3,TIM4,TIM5,TIM23 和 TIM24。TIM2,TIM5,TIM23 和 TIM24基于一个32位自动加载上/下计数器和一个16位预分级器,而TIM3和TIM4基于一个16位自动加载上/下计数器和一个16位预分级器。所有定时器都具有4个独立的输入捕获/输出比较通道,PWM或单脉冲模式输出。这在最大的包上提供了24个输入捕获/输出比较/PWM。TIM2,TIM3,TIM4,TIM5,TIM23 和 TIM24 通用定时器可以一起工作,或与其他通用定时器和高级控制定时器 TIM1 和 TIM8 通过定时器链接功能进行同步或事件链接。这些通用定时器中的任何一个都可以用来产生PWM输出。TIM2、TIM3、TIM4、TIM5、TIM23 和 TIM24都有独立的DMA请求生成功能。它们能够处理正交(增量)编码器信号和1到4个霍尔效应传感器的数字输出。
  • TIM12,TIM13,TIM14,TIM15,TIM16,TIM17
    这些计时器是基于一个16位自动重载上计数器和一个16位预缩放器。TIM13,TIM14,TIM16 和 TIM17有一个独立的通道,而 TIM12 和 TIM15 有两个独立的通道用于输入捕获/输出比较,PWM或单脉冲模式输出。它们可以与TIM2,TIM3,TIM4,TIM5,TIM23 和 TIM24 全功能通用定时器同步,或用作简单的时基。

3.基本定时器(TIM6,TIM7)

基本定时器 TIM6 和 TIM7 这些定时器主要用于DAC触发和波形生成。它们也可以用作通用的16位时基。TIM6 和 TIM7 支持独立的 DMA 请求生成。

二、定时器比较

在这里插入图片描述
在这里插入图片描述

三、级联关系

  • 此处只介绍个别定时器级联关系

在这里插入图片描述

四、定时器主从模式(STM32CubeMX)配置

1、主定时器配置(TIM1

在这里插入图片描述

2、从模式配置(TIM2 其他的从定时器配置一致

在这里插入图片描述

五、代码

1、用户代码

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  
  // 需要注意 STM32CubeMX 生成代码后会将 TIM1 的初始化放在后面,在同步启动的情况下,需要将主定时器放在前面
  MX_TIM1_Init();
  MX_TIM2_Init();
  MX_TIM5_Init();
  MX_TIM23_Init();
  MX_TIM24_Init();
  /* USER CODE BEGIN 2 */
  
  // 此 HAL 库函数接口每次只会初始化其中一个定时器的一个通道,并开启 PWM,但判断不了是否是由 TIM1来控制同步开启的
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim23, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start(&htim24, TIM_CHANNEL_1);

  // 开启 TIM1
  __HAL_TIM_MOE_ENABLE(&htim1);
  __HAL_TIM_ENABLE(&htim1);
  /* USER CODE END 2 */

  /* Infinite loop */

2、修改 HAL 库函数代码

  • 屏蔽启动功能
HAL_StatusTypeDef HAL_TIM_PWM_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
{
  uint32_t tmpsmcr;

  /* Check the parameters */
  assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));

  /* Check the TIM channel state */
  if (TIM_CHANNEL_STATE_GET(htim, Channel) != HAL_TIM_CHANNEL_STATE_READY)
  {
    return HAL_ERROR;
  }

  /* Set the TIM channel state */
  TIM_CHANNEL_STATE_SET(htim, Channel, HAL_TIM_CHANNEL_STATE_BUSY);

  /* Enable the Capture compare channel */
  TIM_CCxChannelCmd(htim->Instance, Channel, TIM_CCx_ENABLE);

  //if (IS_TIM_BREAK_INSTANCE(htim->Instance) != RESET)
  //{
  //  /* Enable the main output */
  //  __HAL_TIM_MOE_ENABLE(htim);
  //}

  ///* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */
  //if (IS_TIM_SLAVE_INSTANCE(htim->Instance))
  //{
  //  tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
  //  if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr))
  //  {
  //    __HAL_TIM_ENABLE(htim);
  //  }
  //}
  //else
  //{
  //  __HAL_TIM_ENABLE(htim);
  //}

  /* Return function status */
  return HAL_OK;
}

3、用示波器查看波形

  • 从波形可以看出同步启动时的延迟不超过3ns

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值