Timer STM32F7上定时器的频率限制问题

Timer STM32F7上定时器的频率限制问题,timer,stm32,stm32f7,cubemx,Timer,Stm32,Stm32f7,Cubemx,我无法将STM32F7显示板上的计时器设置为500 Khz。出于某种原因,我的频率似乎最高在370kHz左右。”我把一个GPIO引脚和一个作用域切换到输入端,然后简单地改变定时器上的周期来监控正在发生的事情 我正在使用CubeMX生成项目文件并初始化计时器: static void MX_TIM1_Init(void) { TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterCon

我无法将STM32F7显示板上的计时器设置为500 Khz。出于某种原因,我的频率似乎最高在370kHz左右。”我把一个GPIO引脚和一个作用域切换到输入端,然后简单地改变定时器上的周期来监控正在发生的事情

我正在使用CubeMX生成项目文件并初始化计时器:

static void MX_TIM1_Init(void)
{
  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 0;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 108;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1;
  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_OC1REF;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }

}
然后,我在中断模式下启动计时器:

if(HAL_TIM_Base_Start_IT(&htim1) != HAL_OK)
        {
            Error_Handler();
        }
然后在周期结束后切换GPIO引脚:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

    if(htim->Instance == TIM1)
    {

        HAL_GPIO_TogglePin(GPIOG, GPIO_PIN_6);

    }
}
GPIO引脚设置为:

  GPIO_InitStruct.Pin = GPIO_PIN_6;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
但是,我在计时器上使用了
周期
,得到了以下结果:

539 = 100KHz
239 = 300KHz
215 = 330KHz
108 = 369Khz

我希望以215的周期获得500Khz,但事实并非如此。我的设置是否有问题?

计时器设置正确。中断代码太慢。

HAL库不适用于定时关键应用程序。HAL尝试(但失败)在“一刀切”的函数中处理每一个可能的用例,这意味着大量不必要的相关处理。使用一个简单的中断处理程序,而不是HAL提供的
TIM1\u IRQHandler()
,它只是清除中断状态并直接在GPIOG->ODR中反转位。这应该做到:

void TIM1_IRQHandler(void) {
    TIM1->SR = ~TIM_SR_UIF;
    GPIOG->ODR ^= (1 << 6);
}
void TIM1\u IRQHandler(void){
TIM1->SR=~TIM\u SR\u UIF;

GPIOG->ODR^=(1)我只是简单地使用GPIO引脚切换来确定频率。我的目标是使用定时器作为ADC的外部触发器。我的问题是,如果定时器设置正确,并且我没有切换GPIO,这是否意味着ADC仍将在正确的时间触发?或者有没有办法使用LL库来实现这一点?@MaskedAfrican一旦启动,计时器将以设定的速度运行。它将尽职尽责地以相等的间隔触发中断、DMA转换,无论您让它做什么。计时器不关心代码是否切换任何管脚,或者是否在下一个中断请求之前完成,或者是否有任何代码。如果代码太长,则哦,它会错过一些中断,但不会导致计时器停止并等待代码赶上。@MaskedAfrican对于ADC来说,同样的情况也会发生,计时器会很乐意在高达108MHz的任何频率下触发它,但您应该确保触发间隔大于ADC稳定时间、转换时间和第三次时间的总和现在我不记得了。如果ADC不能跟上,它会开始丢失触发器,而你得到的样本比预期的要少。现在仔细考虑一下:代码每秒翻转一个比特的代码有问题。ll.你说得对。因此,基本上,ll库是一种方式。我将查看实现并报告。我确实使用了你的
TIM1_IRQHandler
,它切换为500khz,所以我猜这个问题得到了回答