前言
- (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 其他的从定时器配置一致)
文章来源:https://www.toymoban.com/news/detail-630889.html
五、代码
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
文章来源地址https://www.toymoban.com/news/detail-630889.html
到了这里,关于【STM32H7 开发笔记】| 02 - 通过定时器级联方式同步启动多个定时器并输出 PWM 波形的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!