2015-02-24 48 views
1

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

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

谢谢!

+1

在中断处理程序中放入延迟是绝对可怕的做法。如果您真的必须重新进入,并尽快重新启用中断。 – 2015-02-24 12:26:33

回答

3

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

如果您需要执行一个单独的任务(再次移动伺服),安排它就像你描述:

  • 如果伺服保证指定数量的过程中已经达到了预期的位置如果伺服机制在达到指定的位置时可以通过另一个中断通知你,用它来处理它的移动回到原来的位置,那么在这段时间之后设置一个定时器以触发
+0

您已确认我的怀疑,谢谢!我将开始启用一堆定时器! – 2015-02-24 12:47:06

0

假设您有一个可以产生中断的空闲计时器,您可以让中断处理程序设置一个启动下一步的定时器中断处理程序。我使用指向函数的指针,这些函数由中断处理程序设置并稍后调用,以通过一系列逻辑步骤来推进中断驱动的进程。在某些情况下,我将有一组指向函数的层次指针,其中每个指向函数的指针用于调用逻辑函数的结束操作处理函数。例如,设置高级函数的结束动作函数指针(如等待就绪函数),并调用高级函数。该高级函数依次为低级函数设置结束动作函数指针,并调用低级函数来启动它。低级函数接着设置中断结束动作函数指针,并启动某种类型的中断驱动序列,通过一系列中断函数使中断函数指针前进以跟随序列,然后在序列时调用低级末端动作函数指针完成返回到高级序列中的一个步骤。

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

相关问题