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