ST意法半导体
直播中

陈燕

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

使用示波器时每个定时器中断显示为4毫秒是怎么回事

我有一个 STM32f030k6t6,我希望设置一个定时器(在本例中为 tiM16),每次定时器中断时,GPIO 引脚都会切换。我附上时钟配置。
这是我的 tim16 配置
  • htim16.Instance = TIM16;
  •   htim16.Init.Prescaler = 10;
  •   htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
  •   htim16.Init.Period = 44236;
  •   htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  •   htim16.Init.RepetitionCounter = 0;
  •   htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  •   if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
  •   {
  •     Error_Handler();
  •   }
这是定时器的开始
  • if(HAL_TIM_Base_Start_IT(&htim16)!=HAL_OK)//
  •         {
  •                  Error_Handler();
  •         }
最后是定时器中断和 GPIO 切换
  • void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  • {
  •          if (htim->Instance == TIM16)
  •          {
  •                  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_3);
  •          }
  • }
现在有趣的是,因为我已经将定时器设置为每 10 毫秒中断一次,但是当我使用示波器时,每个定时器中断显示为 4 毫秒。
那是为什么呢?



回帖(1)

李天氍

2022-12-15 11:29:34
首先示波器没有校准,所以错误的结果并不意外......
其次是


  • htim16.Init.Prescaler = 10;

所以这很重要,因为我忘记了 Prescaler 在计算中加了 1。
例如,当我想要 10 毫秒或更多时,这没问题(10 和 10+1 几乎相同)
当我想要 1 毫秒时,这让我在测量中犯了很大的错误,正如我预期的那样是 1 毫秒,但我忘记了在公式中我们使用 1+1=2!这给了我两倍的结果......
举报

更多回帖

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