[STM32L4] L432KC 编码器不计数?

[复制链接]
618|8
SocialButterfly 发表于 2025-11-18 17:04 | 显示全部楼层 |阅读模式
我正用 Nucleo L432KC 开发板的硬件定时器搭配旋转编码器。具体来说我想用 TIM1 定时器,对应引脚为 PA8(D9)和 PA9(D1)。起初我希望使用 PlatformIO 平台和 gianni-carbone/STM32encoder 库,但没能成功运行,于是转而使用 STM32CubeIDE。可即便换了 STM32CubeIDE,问题依然没有解决。
我已经用示波器验证过,编码器能输出 3.3V 的脉冲信号。以下是我在 CubeIDE 中 main.c 文件里的代码…… 有人能帮忙看看吗?TIM1 的 CNT 寄存器始终保持在 0,完全不计数。

while (1)
  {
          HAL_Delay(100);
          sprintf(message, "Encoder Ticks = %d\n\r", ((TIM1->CNT)>>2));
          HAL_UART_Transmit(&huart2, message, sizeof(message), 100);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }


static void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_Encoder_InitTypeDef sConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 65535;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 0;
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 0;
  if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */

  /* USER CODE END TIM1_Init 2 */

}
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LD3_Pin */
  GPIO_InitStruct.Pin = LD3_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct);

}




duo点 发表于 2025-11-19 16:27 | 显示全部楼层
HAL_TIM_Encoder_Init() 仅初始化定时器,但未调用 HAL_TIM_Encoder_Start() 或 HAL_TIM_Encoder_Start_IT() 启动编码器模式。
elephant00 发表于 2025-11-19 16:27 | 显示全部楼层
GPIO有没有配置为复用功能?
flycamelaaa 发表于 2025-11-19 16:28 | 显示全部楼层
编码器模式配置可能不完整
jcky001 发表于 2025-11-19 19:28 | 显示全部楼层
修改 main.c 代码,在 main() 中启动编码器接口
powerantone 发表于 2025-11-19 21:29 | 显示全部楼层
修改编码器模式为 TI1+TI2 双通道,并添加滤波
probedog 发表于 2025-11-19 22:30 | 显示全部楼层
必须调用 HAL_TIM_Encoder_Start() 启动编码器接口。
solty 发表于 2025-11-19 21:30 | 显示全部楼层
GPIO 需配置为复用功能
七毛钱 发表于 2025-11-19 22:30 | 显示全部楼层
推荐使用 TIM_ENCODERMODE_TI12 双通道模式提高可靠性。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

79

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0