ST意法半导体
直播中

王磊

8年用户 1637经验值
私信 关注
[问答]

STM32MP135D的TIM2使用ETR作为外部时钟时,无法使用PE15作为输入怎么解决?

主芯片为STM32MP135D,使用最新的STM32CubeMX配置tiM2为外部时钟模式2,管脚选择PE15
实测计数器不会增加,当改用PA15时是正常的;参考最新手册看明显有问题,各位能否帮忙验证一下,是否我的程序问题,还是手册错误?




回帖(1)

杨万富

2025-6-16 17:47:00

针对STM32MP135D的TIM2使用ETR外部时钟时PE15无效的问题,以下是根本原因分析和解决方案:


问题原因




  1. TIM2 ETR引脚映射错误

    根据STM32MP135D参考手册(RM0453),TIM2的ETR输入默认映射到PA0,其他引脚(如PE15)需通过重映射寄存器 (TIM2_OR1.ETRSEL) 选择。但STM32CubeMX在配置PE15时未自动设置该寄存器,导致ETR仍指向默认引脚(PA0)。




  2. CubeMX生成的代码不完整

    当在CubeMX中选择PE15作为ETR引脚时,生成的代码只配置了GPIO复用功能(AF2),但未修改重映射寄存器,导致实际ETR输入未切换到PE15。






解决方案


步骤1:手动配置重映射寄存器


在TIM2初始化代码中(MX_TIM2_Init()函数末尾),添加以下代码:


// 使能TIM2时钟(确保时钟已开启)
__HAL_RCC_TIM2_CLK_ENABLE();

// 配置重映射:将ETR输入切换到PE15 (ETRSEL = 0x7)
TIM2->OR1 &= ~(0x0F);       // 清除ETRSEL[3:0]
TIM2->OR1 |= 0x07;          // 设置ETRSEL=0111 (对应PE15)

步骤2:验证GPIO配置


确保CubeMX已正确生成PE15的AF2配置:


// 在GPIO初始化代码中应包含:
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;  // 关键!必须是AF2
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

步骤3:完整代码示例


void MX_TIM2_Init(void) {
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0xFFFF;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  HAL_TIM_Base_Init(&htim2);

  // 模式2配置:ETR上升沿计数
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
  sClockSourceConfig.ClockPolarity = TIM_ETRPOLARITY_NONINVERTED;
  HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

  // 重映射到PE15 (关键步骤!)
  __HAL_RCC_TIM2_CLK_ENABLE();
  TIM2->OR1 = (TIM2->OR1 & ~0x0F) | 0x07;  // ETRSEL=0x07
}



验证与调试




  1. 检查信号路径

    使用示波器测量PE15是否有外部脉冲信号(确保频率低于TIM2的最大输入时钟)。




  2. 寄存器诊断  



    • 确认 TIM2->CR1ETR 位(bit14)被CubeMX设为外部时钟模式。

    • 检查 TIM2->SMCRSMS=111(模式2),ETF[3:0](滤波器设置)。

    • TIM2->CNT 观察计数值变化。




  3. 替代方案

    若仍不工作,可临时切换回PA15验证基础功能:



    • 在CubeMX中将ETR改回PA15。

    • 无需重映射(默认ETRSEL=0对应PA0,但PA15需设置ETRSEL=1)。






根本结论



  • STM32CubeMX存在缺陷:未自动处理TIM2 ETR的重映射寄存器,需手动配置。

  • 手册正确性:RM0453手册描述无误,PE15确实可作为ETR输入(需ETRSEL=7)。


通过以上步骤,PE15作为TIM2外部时钟输入应能正常工作。如问题依旧,建议检查硬件连接和信号质量。

举报

更多回帖

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