繁体   English   中英

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

[英]STM32F4 - can I use delays in interrupt routines?

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

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

谢谢!

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM