1、邊沿觸發
邊沿觸發包括上升沿觸發和下降沿觸發,邊沿觸發檢測的是電平變化,高電平轉低電平或低電平轉高電平時,觸發一次中斷。
邊沿沿觸發是鎖存中斷信號的,由D觸發器記憶,即:若CPU來不及響應中斷,外部中斷信號撤消後,由於D觸發器的記憶作用,消失的中斷信號仍然有效,直到中斷被響應並進入中斷ISR,記憶的中斷信號纔會由硬件自動清除。
2、電平觸發
電平觸發分爲高電平觸發和低電平觸發;電平觸發需要手動清除中斷信號
電平觸發根據硬件設計的不同,分爲即時觸發和信號鎖存觸發;
(1)即時的電平觸發,當外部中斷信號撤消時,中斷申請信號隨之消失。如果在外部中斷信號申請期間,CPU來不及響應此中斷,那麼有可能這次中斷申請就漏掉了。
即時的電平觸發是一個時間段,需要一直觸發中斷的,就用電平觸發。比如高電平觸發,只要檢測到是高電平就觸發中斷。
(2)信號鎖存的電平觸發,當檢測到高電平或低電平信號,該觸發信號也會被鎖存,類似於邊沿觸發,但是觸發信號需要進行手動清除;
3、邊沿觸發及電平觸發的區別
如果是採用邊沿檢測外部中斷,檢測到電平變化會中斷,但是如果中斷檢測口一直保持某一電平,則無法產生下次中斷,需要等下次檢測到電平變化纔會中斷。中斷得到響應後由硬件自動清除。
如果是採用電平檢測外部中斷,檢測到低/高電平會中斷,但是如果中斷檢測口一直保持低電平,中斷處理完成後,會繼續產生下次中斷,需要檢測到高電平纔會停止中斷產生。中斷得到響應後由硬件手動清除。
驗證:msm8909上,gpio中斷的對應寄存器TLMM_GPIO_INTR_STATUSn
The GPIO_INTR_STATUS[n] indicates the status of the summary interrupt for GPIO[n].
When read it returns the status for the interrupt on GPIO[n]. When written with a 1 in this position, it sets the interrupt for GPIO[n]. When it is written with a 0, it clears the interrupt.
實際發現對於邊沿中斷而言:
- 大部分情況下,中斷一旦觸發就被處理,所以寄存器的值都爲0
- 先通過disable_irq屏蔽一個gpio邊沿中斷,再觸發這個中斷,可以發現這個狀況下,寄存器的值keep爲1,然後通過enable_irq打開這個中斷,中斷處理將被調用。
- 先驗證寄存器的值在常態下爲0,然後手動寫入1,發現中斷處理被執行
- 問題:先通過disable_irq屏蔽一個gpio邊沿中斷,再觸發這個中斷,寄存器的值變爲1,然後手動寫入0,驗證成功寫入,enable_irq打開中斷,中斷處理也被調用了。所以寄存器描述裏的寫0可以清楚中斷這件事,我暫時很懷疑,但是手邊的資料沒有找到更多關於高通中斷寄存器相關的,有了解的朋友也可以和我分享下