2015-02-24 46 views
1

我爲一個項目使用了一個STM32F4發現板,並且想知道我是否正確地處理了這個問題。當我按下一個按鈕時,觸發一個外部中斷來執行一個例程;不用延遲,這部分工作正常。當例行程序移動一個伺服器然後將其返回到其原始位置時,加上一個延遲以使伺服器在返回到原始位置之前趕上新的PWM輸出。當我延遲運行新的中斷程序時,電路板鎖定。在調試中,代碼似乎在延遲循環中停頓。STM32F4 - 我可以在中斷例程中使用延遲嗎?

延遲是一個簡單的systick例程。這是不好的做法(因此我的崩潰的原因)把它放入我的中斷,我應該使用不同的方法?例如,在外部中斷程序中設置單次定時器,該程序在設定的時間後返回伺服?

謝謝!

+1

在中斷處理程序中放入延遲是絕對可怕的做法。如果您真的必須重新進入,並儘快重新啓用中斷。 – 2015-02-24 12:26:33

回答

3

正如您發現的那樣,中斷例程旨在執行外部事件的快速處理,並推遲到其他工具的額外工作。這就是爲什麼在這種情況下,延遲循環會導致電路板鎖定:當代碼在中斷處理程序中休眠時,沒有其他工作正在執行。這是所有中斷處理程序的典型特徵。

如果您需要執行一個單獨的任務(再次移動伺服),安排它就像你描述:

  • 如果伺服保證指定數量的過程中已經達到了預期的位置如果伺服機制在達到指定的位置時可以通過另一箇中斷通知你,用它來處理它的移動回到原來的位置,那麼在這段時間之後設置一個定時器以觸發
+0

您已確認我的懷疑,謝謝!我將開始啓用一堆定時器! – 2015-02-24 12:47:06

0

假設您有一個可以產生中斷的空閒計時器,您可以讓中斷處理程序設置一個啓動下一步的定時器中斷處理程序。我使用指向函數的指針,這些函數由中斷處理程序設置並稍後調用,以通過一系列邏輯步驟來推進中斷驅動的進程。在某些情況下,我將有一組指向函數的層次指針,其中每個指向函數的指針用於調用邏輯函數的結束操作處理函數。例如,設置高級函數的結束動作函數指針(如等待就緒函數),並調用高級函數。該高級函數依次爲低級函數設置結束動作函數指針,並調用低級函數來啓動它。低級函數接着設置中斷結束動作函數指針,並啓動某種類型的中斷驅動序列,通過一系列中斷函數使中斷函數指針前進以跟隨序列,然後在序列時調用低級末端動作函數指針完成返回到高級序列中的一個步驟。

爲了保持準確的定時並避免一段時間內的漂移,您需要將所有「延遲」都置於定時器的原始讀數之外。對於每一步,您將一個固定的計數添加到一個變量中,該變量通過定時器的原始讀數進行初始化,以確定下一個延遲點。對於不是定時器精確倍數的頻率,可以使用除法來產生商和餘數,並根據每個間隔步驟的需要累計餘數以湊整商。

相關問題