4

我正在为一个项目使用 STM32F4 发现板,我想知道我是否正确地解决了这个问题。当我按下一个按钮时,会触发一个运行例程的外部中断;不使用延迟,这部分工作正常。当例程移动伺服器然后将其返回到其原始位置时,会添加一个延迟以允许伺服器在返回到原始位置之前赶上新的 PWM 输出。当我延迟运行新的中断程序时,电路板锁定了。在调试中,代码似乎在延迟循环处停止。

延迟是一个简单的 systick 例程。把它放在我的中断中是不好的做法(因此是我崩溃的原因),我应该使用不同的方法吗?例如,在设置时间后返回伺服的外部中断程序中设置一个单次计时器?

谢谢!

4

2 回答 2

6

正如您所发现的,中断例程旨在快速处理外部事件,并将额外的工作推迟到其他设施。这就是为什么在您的情况下,延迟循环会导致电路板锁定:当代码在中断处理程序内休眠时,没有其他工作正在执行。这是所有中断处理程序的典型特征。

如果您需要执行单独的任务(再次移动伺服),请按照您的描述安排它:

  • 如果保证伺服在指定的时间内到达预期位置,则设置一个计时器以在该时间后触发
  • 如果伺服机构可以通过另一个中断通知您,当它到达指定位置时,使用它来处理其返回原始位置的运动。
于 2015-02-24T12:30:00.383 回答
1

假设您有一个可以生成中断的备用计时器,您可以让中断处理程序设置一个计时器中断处理程序来开始下一步。我使用指向函数的指针,这些函数由中断处理程序设置并随后调用,以通过一系列逻辑步骤推进中断驱动的过程。在某些情况下,我将有一组指向函数的分层指针,其中每个指向函数的指针都用于调用逻辑函数的结束操作处理程序。例如,为高级函数(如等待就绪函数)设置结束动作函数指针,并调用高级函数。该高级函数依次为低级函数设置结束动作函数指针,并调用低级函数来启动它。低级函数然后设置中断结束动作函数指针,

为了保持准确的计时并避免在一段时间内漂移,您需要将所有“延迟”都基于计时器的原始读数。对于每一步,您将一个固定计数添加到使用计时器的原始读数初始化的变量中,以确定下一个延迟点。对于不是计时器的精确倍数的频率,您可以使用除法来产生商和余数,并根据每个间隔步骤的需要将余数累加以四舍五入。

于 2015-02-24T16:16:28.810 回答