为什么定期中断会有时间上的差异?

问题描述

我正在为一种单线通信协议编写底层驱动程序。该线连接到内部时钟为8Mhz的STM32F0 micro的Tx引脚和Rx引脚。在定时器中断中设置Tx引脚状态,在外部GPIO中断中读取Rx引脚。

为了进行测试,我将Tx引脚切换为416µs(自动重载值为3333,没有预分频器),在GPIO中断中,我读取了两个连续中断之间的时序差异。从“高到低”转换中断到“低到高”转换中断的测量时间大约为500µs,从“低到高”转换中断到“高到低”转换中断的测量时间大约为300µs。为什么会有这样的差异?以及如何摆脱它?

我已经检查了示波器上的信号,它是脉冲宽度为416µs的完美方波。我还使用htim->Instance->CNT = 0;time = htim->Instance->CNT;来包装代码的不同部分,以找出差异的出处,但无济于事。

这是中断句柄,测量的时间保存在tim3_value变量中:

void TIM2_IRQHandler(void)
{
  if (__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE) != RESET)
  {
    if (__HAL_TIM_GET_IT_SOURCE(&htim2,TIM_IT_UPDATE) != RESET)
    {
        __HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_UPDATE);
        HAL_GPIO_TogglePin(TX_GPIO_Port,TX_Pin);
        htim2.Instance->ARR = 3333;
    }
  }
return;
}

void EXTI4_15_IRQHandler(void)
{
  if(__HAL_GPIO_EXTI_GET_IT(RX_Pin) != 0x00u)
  {
    __HAL_GPIO_EXTI_CLEAR_IT(RX_Pin);
    tim3_value = htim3.Instance->CNT;
    htim3.Instance->CNT = 0;
  }
return;
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)