STM32F4 - 我可以在中断例程中使用延迟吗?
STM32F4 - can I use delays in interrupt routines?
我正在为一个项目使用 STM32F4 发现板,想知道我是否正确地解决了这个问题。当我按下一个按钮时,一个外部中断被触发,运行这是一个例程;在不使用延迟的情况下,这部分工作正常。当例程移动伺服然后 returns 将其移动到其原始位置时,添加延迟以允许伺服在返回原始位置之前赶上新的 PWM 输出。当我 运行 具有延迟的新中断例程时,电路板锁定。在调试中,代码似乎在延迟循环中停止。
延迟是一个简单的系统程序。把它放在我的中断中是不好的做法(因此是我崩溃的原因),我应该使用不同的方法吗?例如在外部中断例程中设置一个一次性定时器,returns 伺服器在设定时间后?
谢谢!
正如您所发现的,中断例程旨在执行对外部事件的快速处理,并将额外的工作推迟到其他设施。这就是为什么在您的情况下,延迟循环会导致电路板锁定:当代码在中断处理程序中休眠时,没有其他工作正在执行。这是所有中断处理程序的典型特征。
如果您需要执行单独的任务(再次移动伺服),请按照您的描述进行安排:
- 如果保证伺服器在指定的时间内到达预期位置,则设置定时器在该时间后触发
- 如果伺服机构可以通知你,也许通过另一个中断,当它到达指定位置时,用它来处理它回到原始位置的运动。
假设你有一个可以产生中断的备用定时器,你可以让中断处理程序设置一个定时器中断处理程序来启动下一步。我使用指向由中断处理程序设置并稍后调用的函数的指针,以通过一系列逻辑步骤推进中断驱动的过程。在某些情况下,我会有一组指向函数的分层指针,其中每个指向函数的指针都用于调用逻辑函数的结束操作处理程序。例如,设置高级函数(如等待就绪函数)的结束操作函数指针,然后调用高级函数。该高级函数依次为低级函数设置结束动作函数指针,并调用低级函数启动它。低级函数然后设置中断结束动作函数指针,并启动某种类型的中断驱动序列,通过一系列中断函数推进低级中断函数指针以跟随一个序列,然后调用高级结束动作函数指针时序列完成 return 回到高级序列中的一个步骤。
为了保持准确的计时并避免一段时间内的漂移,您需要将所有“延迟”都基于计时器的原始读数。对于每一步,您将固定计数添加到一个变量,该变量是用定时器的原始读数初始化的,以确定下一个延迟点。对于不是计时器的精确倍数的频率,您可以使用除法产生商和余数,累加余数以根据每个间隔步骤的需要对商进行舍入。
我正在为一个项目使用 STM32F4 发现板,想知道我是否正确地解决了这个问题。当我按下一个按钮时,一个外部中断被触发,运行这是一个例程;在不使用延迟的情况下,这部分工作正常。当例程移动伺服然后 returns 将其移动到其原始位置时,添加延迟以允许伺服在返回原始位置之前赶上新的 PWM 输出。当我 运行 具有延迟的新中断例程时,电路板锁定。在调试中,代码似乎在延迟循环中停止。
延迟是一个简单的系统程序。把它放在我的中断中是不好的做法(因此是我崩溃的原因),我应该使用不同的方法吗?例如在外部中断例程中设置一个一次性定时器,returns 伺服器在设定时间后?
谢谢!
正如您所发现的,中断例程旨在执行对外部事件的快速处理,并将额外的工作推迟到其他设施。这就是为什么在您的情况下,延迟循环会导致电路板锁定:当代码在中断处理程序中休眠时,没有其他工作正在执行。这是所有中断处理程序的典型特征。
如果您需要执行单独的任务(再次移动伺服),请按照您的描述进行安排:
- 如果保证伺服器在指定的时间内到达预期位置,则设置定时器在该时间后触发
- 如果伺服机构可以通知你,也许通过另一个中断,当它到达指定位置时,用它来处理它回到原始位置的运动。
假设你有一个可以产生中断的备用定时器,你可以让中断处理程序设置一个定时器中断处理程序来启动下一步。我使用指向由中断处理程序设置并稍后调用的函数的指针,以通过一系列逻辑步骤推进中断驱动的过程。在某些情况下,我会有一组指向函数的分层指针,其中每个指向函数的指针都用于调用逻辑函数的结束操作处理程序。例如,设置高级函数(如等待就绪函数)的结束操作函数指针,然后调用高级函数。该高级函数依次为低级函数设置结束动作函数指针,并调用低级函数启动它。低级函数然后设置中断结束动作函数指针,并启动某种类型的中断驱动序列,通过一系列中断函数推进低级中断函数指针以跟随一个序列,然后调用高级结束动作函数指针时序列完成 return 回到高级序列中的一个步骤。
为了保持准确的计时并避免一段时间内的漂移,您需要将所有“延迟”都基于计时器的原始读数。对于每一步,您将固定计数添加到一个变量,该变量是用定时器的原始读数初始化的,以确定下一个延迟点。对于不是计时器的精确倍数的频率,您可以使用除法产生商和余数,累加余数以根据每个间隔步骤的需要对商进行舍入。