STM32F4 - 我可以在中断程序中使用延迟吗?

4
我正在使用STM32F4 discovery板进行项目开发,想知道我是否正确地解决了问题。当我按下按钮时,会触发外部中断并运行一个例程;在不使用延迟的情况下,这部分代码工作得很好。由于该例程移动舵机并将其返回到原始位置,因此需要添加延迟以使舵机跟上新的PWM输出并返回到原始位置。但是,当我在带有延迟的新中断例程中运行代码时,板子会死机。在调试中,代码似乎在延迟循环处停顿。
该延迟是一个简单的SysTick例程。在我的中断程序中放置它(因此导致崩溃)是否是不良实践?我应该使用其他方法吗?例如,在外部中断例程中设置一次性定时器,在设定时间后返回舵机?
谢谢!

1
在中断处理程序内部放置延迟是一种绝对糟糕的做法。如果你真的必须这样做,那么请确保它是可重入的,并尽快重新启用中断。 - Weather Vane
2个回答

7
如您所了解的,中断函数旨在快速处理外部事件,并将其他工作推迟到其他设施。这就是为什么在您的情况下,延迟循环会导致板子锁定:当代码在中断处理程序内部休眠时,没有执行其他工作。这是所有中断处理程序的典型特征。
如果您需要执行其他任务(如再次移动舵机),请按照您描述的方式安排:
- 如果可以保证在指定时间内舵机已达到预定位置,请设置定时器在该时间后触发。 - 如果舵机机制可以通过另一个中断通知您何时达到指定位置,则使用该机制来处理其移动回原始位置。

你证实了我的怀疑,谢谢!我会开始启用一堆计时器! - Joe of Loath

2
假设你有一个可以生成中断的备用计时器,你可以设置一个定时器中断处理程序来启动下一步操作。我使用指向函数的指针来设置并在后续中断处理程序中调用这些函数,以便通过一系列逻辑步骤推进中断驱动的过程。在某些情况下,我会有一组层级指向函数的指针,其中每个函数指针都用于调用逻辑函数的结束操作处理程序。例如,高级函数(如等待就绪函数)的结束操作函数指针被设置,并调用该高级函数。该高级函数反过来为低级函数设置一个结束操作函数指针,并调用低级函数以启动它。然后,低级函数设置中断结束操作函数指针,并启动某种类型的中断驱动序列,通过一系列中断函数将低级中断函数指针推进到一个序列中,然后在序列完成时调用高级结束操作函数指针,以返回到高级序列的一步。
为了保持准确的时间和避免随着时间的流逝而漂移,您需要基于计时器的原始读数来确定所有“延迟”。对于每个步骤,您需要将一个固定计数添加到一个变量中,该变量是使用计时器的原始读数初始化的,以确定下一个延迟点。对于不是计时器的精确倍数的频率,您可以使用除法来产生商和余数,并累加余数以根据需要将商四舍五入到每个间隔步骤。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接