在微控制器上正確設置中斷并不容易,工程師在其職業生涯中設置中斷的次數似乎并沒有什么不同。配置中斷總是隱藏一些問題,讓嵌入式開發人員摸不著頭腦,在晦澀難懂的數據表或在線代碼片段中尋找答案。值得慶幸的是,可以遵循10個步驟來緩解這些痛苦,并允許開發人員在第一次嘗試時配置中斷。
步驟 1 – 配置GPIO引腳
在GPIO引腳上觸發的外部中斷始終是最糟糕的設置中斷。外部中斷和內部中斷之間的唯一區別是需要設置GPIO。配置GPIO本身有許多步驟。首先,啟用GPIO 時鐘,其次,將GPIO配置為輸入。根據硬件,這可能還需要在GPIO外設上配置內部上拉電阻。圖1顯示了如何在 STM32Nucleo 板上完成此操作的示例。
圖 1 – 配置GPIO引腳
步驟 2 – 禁用中斷
一旦配置了GPIO引腳,就該開始關注實際的中斷配置了。在做任何事情之前,開發人員應該首先禁用所有中斷。這確保了在設置過程中,部分配置的中斷不會意外觸發并使系統陷入混亂和未知狀態。
步驟 3 – 清除中斷標志
現在禁用中斷,開發人員不再需要擔心設置過程被中斷。但是,由于系統的啟動狀態,在設置過程之前可能存在未決的中斷。清除中斷標志可以確保一旦中斷控制器被配置和啟用,系統不會立即跳轉到舊的和過期的中斷請求。
步驟 4 – 將引腳連接到中斷線
GPIO引腳配置為輸入并準備就緒,但目前它沒有在內部連接到任何東西。為了觸發中斷,嵌入式開發人員需要將該GPIO引腳連接到中斷控制器。每個微控制器以略微不同的方式執行此操作。對于ARM微控制器,這是使用系統配置外設 EXTICFG 寄存器完成的。這需要額外的步驟來打開系統配置外設的時鐘。圖 4 顯示了如何為STM32Nucleo板的GPIO C13上的按鈕完成此操作的示例。
圖 2 – 將GPIO連接到中斷控制器
步驟 5 – 設置觸發極性
中斷控制器現在已連接到GPIO引腳,但控制器不知道實際應該觸發中斷的內容?,F代微控制器有許多不同的選擇。中斷可以是電平觸發和邊沿觸發,例如上升或下降。觸發設置將高度依賴于應用程序。對于STM32 Nucleo板,GPIO有一個上拉電阻,可將輸入保持在邏輯1,除非按下按鈕。中斷控制器可以設置為在上升沿和下降沿觸發。圖3顯示了如何禁用上升沿觸發和啟用下降沿觸發。
圖 3 – 設置下降沿觸發
步驟 6 – 設置中斷優先級
現代中斷控制器不是簡單直接的外圍設備。中斷控制器提供了廣泛的特性和功能,開發人員可以利用這些特性和功能并針對他們自己的特定應用進行調整。一個中斷控制器可以有多達256個不同的中斷!如果兩個或多個中斷同時觸發,控制器需要知道應該首先處理哪個中斷。設置中斷優先級可以是一個簡單的練習,只需設置中斷控制器中的優先級位。圖4中顯示了一個使用ARM CMSIS規范的示例。
圖 4 – 設置中斷優先級
步驟 7 – 啟用中斷
啟用中斷通常是一個兩步過程。第一步是嵌入式開發人員可以檢查中斷寄存器并取消屏蔽系統將要使用的中斷,取消屏蔽中斷允許中斷控制器在觸發該特定中斷時做出響應;第二步是啟用實際中斷,再次啟用中斷可能因微控制器而異,因此打開數據表并仔細檢查非常重要。圖5顯示了如何通過首先取消屏蔽中斷然后使用CMSIS啟用與GPIO C13關聯的中斷線來啟用STM32 Nucleo板上的GPIO C13的示例。
圖 5 – 啟用中斷
步驟 8 – 創建中斷處理程序
中斷控制器現已配置!只有一個問題,當中斷發生時,沒有中斷處理程序來響應中斷。下一個合乎邏輯的步驟是創建一個中斷處理程序。有很多方法可以做到這一點,不僅取決于架構,還取決于編譯器和IDE。將函數指定為中斷通常使用#pragma或類似類型的編譯器內在函數。在ARM平臺上進行開發時,開發人員只需要查看中斷列表并使用匹配的預先指定的處理程序創建一個函數。圖6顯示了中斷處理程序如何查找GPIO C13的示例。
圖 6 – 空中斷處理程序
步驟 9 – 清除處理程序中的中斷標志
大多數微控制器要求開發人員在中斷處理程序中手動清除中斷標志。在特殊情況下,中斷標志會自動清除,但應參考微控制器的數據表來確定哪些中斷以這種方式運行。GPIO中斷通常作為一個塊觸發,進入中斷后,需要執行簡單的檢查以確定是哪條GPIO線導致了中斷。然后可以清除相應的標志。圖7顯示了如何做到這一點。
圖 7 – 清除處理程序中的中斷標志
步驟 10 – 測試和調試
最后,在完成所有這些步驟之后,嵌入式開發人員人員現在可以測試他們的代碼了。固件在第一次嘗試時不太可能正確運行,但是在密切遵循每個步驟之后,在中斷啟動并正確運行之前應該只需要進行微小的調整。