c-为什么周期性中断会有时间差



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

为了测试,我将Tx引脚切换到416µs(自动重新加载值为3333,没有预分频器(,在GPIO中断中,我读取2个连续中断之间的时间差。测量的时间大约为500µs;"高到低";转换中断到"0";"从低到高";转换中断和300µs;"从低到高";转换中断到"0";"高到低";转换中断。为什么会有这样的区别?如何摆脱它?

我检查了示波器上的信号,它是一个完美的方波,脉冲宽度为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;
}

STM32定时器已预装ARR。这意味着它将在更新事件中更改内部ARR寄存器的实际值。如果您想在特定时刻更改它,您需要通过将1写入EGR寄存器中的UG位来自行生成此事件。

我强烈建议仔细阅读STM32参考手册,因为神奇的HAL功能还不够

无论如何,我都不会在插话时这么做。STM32时间具有一种称为"时间"的机制;直接传输模式";。它使用DMA加载所选事件的定时器寄存器的值。您只需要为它准备数据,在更新事件时,ARR将自动从内存中加载。

没有足够的信息来检查您的问题。

一般来说,有一些原因可能会影响您的测量结果:

  • 中断延迟:对于STM32F0,大约为16个周期。此外,如果有其他中断,可能会增加延迟,我们很少。然而,似乎不是你的情况,因为你提到公差在某种程度上是恒定的
  • 输入和输出引脚的物理特性。这取决于GPIO的配置以及Tx引脚和Rx引脚之间的连接。在某些情况下,这会对测量结果产生很大影响。请试着用示波器测量

为了更好地测量,还建议使用定时器模块以获得稳定的结果。定时器还提供";输入捕获";特色这种方法更好,因为它可以消除中断延迟/优先级的影响。

相关内容

  • 没有找到相关文章

最新更新