簡體   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