STM32
直播中

岳臻俊

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

stm32f042f4p6定时器外部脉冲计数,调了三天了不能计数啊怎么解决?

void MX_tiM2_Init(void)
{
   TIM_SlaveConfigTypeDef sSlaveConfig;
   TIM_MasterConfigTypeDef sMasterConfig;
TIM_ClockConfigTypeDef sClockSourceConfig;
   htim2.Instance = TIM2;
   htim2.Init.Prescaler = 0;
   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
   htim2.Init.Period = 0xFFFF;
   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   if (HAL_TIM_Base_Init( htim2) != HAL_OK)
   {
     Error_Handler();
   }
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ETRMODE2;
   sClockSourceConfig.ClockPolarity = TIM_ETRPOLARITY_NONINVERTED;//TIM_ETRPOLARITY_NONINVERTED
sClockSourceConfig.ClockPrescaler = TIM_ETRPRESCALER_DIV1;
sClockSourceConfig.ClockFilter = 0x0;
   if (HAL_TIM_ConfigClockSource( htim2,  sClockSourceConfig) != HAL_OK)
   {
     Error_Handler();
   }





这是我定时器的配置方式,单片机STM32f042f4p6,用的cubemx的HAl库,口线接的是PA0,TIM2的ETR口,
虽然用hal库我配置的相关寄存器都去看了一遍了,最终配进去的寄存器值跟标准库相同计数应用的方式是一样的,我不知道我这个问题出在哪里,还是我模式选错了。
我TIM_CLOCKSOURCE_ETRMODE2,TIM_CLOCKSOURCE_ETRMODE1,TIM_SLAVEMODE_TRIGGER模式都试过了,不行

时钟启动和输入io口配置是在上面的HAL_TIM_Base_Init( htim2)完成的,这个应该没问题

回帖(1)

张红

2024-5-10 17:30:20
看起来您正在尝试使用STM32F042F4P6的定时器2(TIM2)进行外部脉冲计数,但是遇到了一些问题。以下是一些建议和解决方案,希望能帮助您解决问题:

1. 确保您的硬件连接正确。检查外部脉冲输入引脚是否正确连接到定时器的输入捕获引脚。

2. 在初始化定时器之前,确保您已经配置了GPIO引脚作为定时器输入。使用HAL_GPIO_Init()函数设置GPIO引脚的模式、输出类型、速度等。

3. 在初始化定时器时,确保您已经设置了定时器的工作模式。根据您的需求,您可能需要使用输入捕获模式或编码器模式。

4. 在初始化定时器时,确保您已经配置了定时器的时钟源。使用HAL_TIM_ConfigClockSource()函数配置时钟源。

5. 在初始化定时器时,确保您已经配置了定时器的输入捕获通道。使用HAL_TIM_ConfigChannel()函数配置输入捕获通道。

6. 在初始化定时器时,确保您已经启用了定时器的输入捕获中断。使用HAL_TIM_IC_Start_IT()函数启动输入捕获中断。

7. 在中断服务例程(ISR)中,处理输入捕获中断。在HAL_TIM_IRQHandler()函数中,处理输入捕获中断。

8. 在主函数中,使用HAL_TIM_Base_Start()函数启动定时器。

以下是一个简化的示例代码,展示了如何初始化定时器2进行外部脉冲计数:

```c
void MX_TIM2_Init(void)
{
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 0;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 0xFFFF;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  HAL_TIM_Base_Init(&htim2);

  // Configure GPIO pin as input for TIM2
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  // Configure TIM2 as input capture
  TIM_HandleTypeDef *htim2 = &htim2;
  TIM_IC_InitTypeDef sICConfig = {0};
  sICConfig.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  sICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
  sICConfig.ICPrescaler = TIM_ICPSC_DIV1;
  sICConfig.ICFilter = 0;
  HAL_TIM_IC_ConfigChannel(htim2, &sICConfig, TIM_CHANNEL_1);

  // Enable TIM2 input capture interrupt
  HAL_TIM_IC_Start_IT(htim2, TIM_CHANNEL_1);
}

void TIM2_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&htim2);
}
```

请根据您的具体需求调整上述示例代码。希望这些建议能帮助您解决问题。
举报

更多回帖

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