ST意法半导体
直播中

王静

7年用户 1549经验值
私信 关注
[问答]

TIM2作为主设备和TIM3作为从设备在Blue Pill板上不工作的原因?如何解决?

大家好。
我正在做一个项目,它有 6 个 PWM 通道,同时会有 3 个通道处于活动状态,
由于所有 PWM 通道必须具有相同的频率,所有 PWM 通道必须同时启动和停止,我试图将 tiM2 定义为 MASTER,将 TIM3 定义为 Slave。
我正在测试一些选项,但我无法继续前进......为了同步(尽可能多)我在两个 TIM 中设置了 Master、Slave 和 CNT 寄存器,所以之后我在中定义了一个断点为了检查 **** 是否相同或几乎相同,但来自 TIM2 和 TIM3 的 CNT 不相同,如我预期的那样运行不紧..
我正在阅读 RM008 14.3.20 Timer synchronization 并编写了以下几行以将 TIM2 设置为 Master 并将 TIM3 设置为 Slave(如上所述,它不起作用)
TIM2->CR2 = TIM_TRGO_ENABLE;
TIM3->SMCR = TIM_TS_ITR1 | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1;
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
TIM2->CNT=0;
TIM3->CNT=0;
TIM2 和 TIM3 是使用 CUBEMX 定义的,两个定时器在这一点(设置时间)具有相同的配置,但是稍后当程序运行时,当 TIM2 发生溢出中断时,我停止定时器 TIM2 和 TIM3,定义 Master 和 Slave 和将 **** 设置为 0(每次发生溢出时我都会设置 Master 和 slave,我知道这不行,但是因为我只是在测试时钟是否一起工作,所以我想这不是一个大问题,
稍后我会将其移出循环,但我这样做只是为了查看在将(手动)CNT 寄存器设置为 0 后调试器被触发时时钟是如何设置的,STM32CUBE 调试器显示 TIM2/3 **** 值不是等于...这是一个包含 4 个测试的小列表(在调试模式下使用 RESSUME 按钮)。
                      1° 2° 3° 4°
TIM2_CNT 19752 19636 24790 15430
TIM3_CNT 5351 20811 17058 7503
差异 14401 -1175 7732 7927

**** 的值显示 TIM2 和 TIM3 在同步模式下不工作....测试 N°2 显示 TIM2 CNT = 19636 和 TIM3 CNT = 20811,当 TIM2 CNT 在 TIM3 CNT 之前设置为零时....我知道,定时器设置不正确,
这是 CUBMX 完成的 TIM2 和 TIM3 配置:
静态无效 MX_TIM2_Init(无效)
{
/* 用户代码开始 TIM2_Init 0 */
/* 用户代码结束 TIM2_Init 0 */
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* 用户代码开始 TIM2_Init 1 */
/* 用户代码结束 TIM2_Init 1 */
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 65535;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
如果(HAL_TIM_Base_Init(&htim2)!= HAL_OK)
{
  错误处理程序();
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
如果 (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
  错误处理程序();
}
如果(HAL_TIM_PWM_Init(&htim2)!= HAL_OK)
{
  错误处理程序();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
如果(HAL_TIMEx_MasterConfigSynchronization(&htim2,&sMasterConfig)!= HAL_OK)
{
  错误处理程序();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
如果 (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
  错误处理程序();
}
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
如果 (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
  错误处理程序();
}
如果 (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
  错误处理程序();
}
/* 用户代码开始 TIM2_Init 2 */
/* 用户代码结束 TIM2_Init 2 */
HAL_TIM_MspPostInit(&htim2);
}
/**
* @brief TIM3初始化函数
* @param 无
* @retval 无
*/
静态无效 MX_TIM3_Init(无效)
{
/* 用户代码开始 TIM3_Init 0 */
/* 用户代码结束 TIM3_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
/* 用户代码开始 TIM3_Init 1 */
/* 用户代码结束 TIM3_Init 1 */
htim3.Instance = TIM3;
htim3.Init.Prescaler = 0;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 65535;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
如果(HAL_TIM_PWM_Init(&htim3)!= HAL_OK)
{
  错误处理程序();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
如果 (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
  错误处理程序();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 0;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
如果 (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
{
  错误处理程序();
}
sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
如果 (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
{
  错误处理程序();
}
如果 (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
{
  错误处理程序();
}
/* 用户代码开始 TIM3_Init 2 */
/* 用户代码结束 TIM3_Init 2 */
HAL_TIM_MspPostInit(&htim3);
}
简而言之,我需要控制 6 个 PWM 通道,使用来自 TIM2 的溢出中断,当 INT 启动时,主程序将一些值从数组加载到 CCR,这里是两个 PWM 端口的示例:
if (R_negativo==0) // estamos entre el INDICE 0 y 1499, es semiciclo +
        {
                TIM2->CCR1=lookUptable1[LookUpTableIndiceUsar_R]; //Fase R Semiclo +
                TIM3->CCR1=0;//Fase R Semiclo -
        }
        别的
        {
                TIM2->CCR1=0;//Fase R Semiclo +
                TIM3->CCR1=lookUptable1[LookUpTableIndiceUsar_R]; //Fase R Semiclo -
  }
因此,由于所有 CCR(有 6 个,但 3 个同时处于活动状态)必须同时加载,这就是我需要让 TIM2 和 TIM3 作为主/从工作的原因。






回帖(1)

李亚祎

2022-12-15 14:48:11
这意味着:我需要将 TIMX 设置为 Master(直到现在才使用)并将 TIM2/TIM3 设置为 Slave?
对,就是这样。
> 对吗?
我相信是这样。如果它不起作用,请发布您的完整计时器设置代码,我会看一下。
仔细混合寄存器访问和 HAL 功能。对于定时器,我通常更喜欢直接寄存器访问。但我相信你写的应该有用。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分