Timer stm32f103内部中断无法达到所需频率(350ns)(最低达到4us)

Timer stm32f103内部中断无法达到所需频率(350ns)(最低达到4us),timer,interrupt,stm32,pwm,bluepill,Timer,Interrupt,Stm32,Pwm,Bluepill,我试图通过使用TIMER1生成的中断将GPIO引脚旋转到高电平和低电平来生成PWM信号,为什么这样做完全是另一回事,所以我需要每隔350ns生成一个中断,我计算了72MHz的预分频器和ARR,发现我需要一个1的预分频器和一个25的ARR,所以我根据这些值设置参数,现在我有25个时钟周期在下一个中断触发之前做我想做的事情,所以在每个中断时,指定的引脚必须改变状态(从高到低或从低到高),我正在使用示波器查看输出信号,但我被8us的输出卡住了(这意味着每4us就有一个中断),我如何解决这个问题?我在哪

我试图通过使用TIMER1生成的中断将GPIO引脚旋转到高电平和低电平来生成PWM信号,为什么这样做完全是另一回事,所以我需要每隔350ns生成一个中断,我计算了72MHz的预分频器和ARR,发现我需要一个1的预分频器和一个25的ARR,所以我根据这些值设置参数,现在我有25个时钟周期在下一个中断触发之前做我想做的事情,所以在每个中断时,指定的引脚必须改变状态(从高到低或从低到高),我正在使用示波器查看输出信号,但我被8us的输出卡住了(这意味着每4us就有一个中断),我如何解决这个问题?我在哪里失败了?我可能做错了什么? 以下是我在中断功能中所做的操作:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if ((GPIOC->ODR & GPIO_PIN_13) != 0x00u)
    {
        GPIOC-> ODR = 0x0000;
    }
    else
    {
        GPIOC-> ODR = 0x2000;
    }
  }
以下是输出信号的照片:

中断内的代码是否可能超过25个时钟周期?如果是这样,我如何做到不超过?谢谢

中断内的代码是否可能超过25个时钟 周期如果是这样,我如何做到不超过?谢谢

如果使用HAL停止计数时钟:)

所以首先我们有了原始的处理程序:中断条目需要大约12个时钟+闪存等待状态

void TIMx_IRQHandler(void)
{
  HAL_TIM_IRQHandler(&TimHandle);
}
然后,当管道被刷新时,我们调用halhandler+min3 clocks+waitstates

然后我们有HAL功能-很多时钟周期:

void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
{
  /* Capture compare 1 event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC1) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC1) !=RESET)
    {
      {
        __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC1);
        htim->Channel = HAL_TIM_ACTIVE_CHANNEL_1;

        /* Input capture event */
        if((htim->Instance->CCMR1 & TIM_CCMR1_CC1S) != 0x00U)
        {
          HAL_TIM_IC_CaptureCallback(htim);
        }
        /* Output compare event */
        else
        {
          HAL_TIM_OC_DelayElapsedCallback(htim);
          HAL_TIM_PWM_PulseFinishedCallback(htim);
        }
        htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
      }
    }
  }
  /* Capture compare 2 event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC2) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC2) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC2);
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_2;
      /* Input capture event */
      if((htim->Instance->CCMR1 & TIM_CCMR1_CC2S) != 0x00U)
      {
        HAL_TIM_IC_CaptureCallback(htim);
      }
      /* Output compare event */
      else
      {
        HAL_TIM_OC_DelayElapsedCallback(htim);
        HAL_TIM_PWM_PulseFinishedCallback(htim);
      }
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
    }
  }
  /* Capture compare 3 event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC3) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC3) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC3);
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_3;
      /* Input capture event */
      if((htim->Instance->CCMR2 & TIM_CCMR2_CC3S) != 0x00U)
      {
        HAL_TIM_IC_CaptureCallback(htim);
      }
      /* Output compare event */
      else
      {
        HAL_TIM_OC_DelayElapsedCallback(htim);
        HAL_TIM_PWM_PulseFinishedCallback(htim);
      }
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
    }
  }
  /* Capture compare 4 event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_CC4) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_CC4) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4);
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4;
      /* Input capture event */
      if((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00U)
      {
        HAL_TIM_IC_CaptureCallback(htim);
      }
      /* Output compare event */
      else
      {
        HAL_TIM_OC_DelayElapsedCallback(htim);
        HAL_TIM_PWM_PulseFinishedCallback(htim);
      }
      htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
    }
  }
  /* TIM Update event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);
      HAL_TIM_PeriodElapsedCallback(htim);
    }
  }
  /* TIM Break input event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_BREAK) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_BREAK) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_BREAK);
      HAL_TIMEx_BreakCallback(htim);
    }
  }
  /* TIM Trigger detection event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_TRIGGER) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_TRIGGER) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_IT_TRIGGER);
      HAL_TIM_TriggerCallback(htim);
    }
  }
  /* TIM commutation event */
  if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_COM) != RESET)
  {
    if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_COM) !=RESET)
    {
      __HAL_TIM_CLEAR_IT(htim, TIM_FLAG_COM);
      HAL_TIMEx_CommutationCallback(htim);
    }
  }
}
并最终调用您的函数,该函数的执行将需要8到15个时钟


因此,如果你总共有25个时钟,你真是一个幸运的人。

谢谢你的回答,我现在明白了,在我必须处理时钟周期的精确任务中,使用HAL根本没有效率,你认为这样做的逻辑方式是什么?我希望你有一个想法,因为没有HALI的裸寄存器我不确定STMF103,但STM32L4xx的定时器1可以直接生成PWM信号,而不需要环路中的软件,你对此进行了调查吗?@PaulR你是对的,它可以,不幸的是,我的想法有点不同,因此,我需要切换引脚尽可能快地利用它。