99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度剖析GPIO中斷

科技觀(guān)察員 ? 來(lái)源:allaboutcircuits ? 作者:菲利普·阿薩雷 ? 2022-04-27 16:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文介紹 GPIO 中斷,包括中斷示例及其各種功能。這是上一篇文章的延續(xù),該文章解釋了微控制器的并發(fā)和中斷的概念。

GPIO 外設(shè)有什么作用?

GPIO 外設(shè)能夠檢測(cè)(或“知道”)四件事:引腳上的值是 1 還是 0,以及該值是從 0 變?yōu)?1 還是從 1 變?yōu)?0。

這些對(duì)于檢測(cè)許多事件很有用。例如,如果我將簧片開(kāi)關(guān)連接到門(mén)上,那么我在微控制器上的程序可以根據(jù)簧片開(kāi)關(guān)所連接的引腳上的值變化來(lái)判斷門(mén)是剛剛打開(kāi)還是剛剛關(guān)閉,如圖 1 所示。

poYBAGJo-rSAbHeGAAA3nQtQlMQ890.jpg

圖 1.使用 GPIO 和簧片開(kāi)關(guān)檢測(cè)門(mén)的狀態(tài)(打開(kāi)或關(guān)閉)和狀態(tài)變化。

我將首先解釋假設(shè)一切都已正確配置,中斷是如何工作的,然后我們將查看需要正確配置以使中斷工作的各個(gè)部分。

外設(shè)中斷標(biāo)志

讓我們假設(shè)與我們之前的示例類(lèi)似,我們?cè)噲D檢測(cè)的事件是引腳值從 1 變?yōu)?0 時(shí)。在 GPIO 外設(shè)內(nèi)部,將有一個(gè)硬件檢測(cè)到這種變化并指示這種變化已經(jīng)發(fā)生將該引腳的所謂中斷標(biāo)志設(shè)置為 1。

如圖 2 所示。

pYYBAGJo-rSAZ0HpAAAcfhxcD8U961.jpg

圖 2.檢測(cè)到應(yīng)該產(chǎn)生中斷的事件后設(shè)置 GPIO 引腳中斷標(biāo)志。

中斷控制器和中斷控制器標(biāo)志

微控制器中有許多外圍設(shè)備,每個(gè)外圍設(shè)備都有自己的一組中斷。大多數(shù)微控制器都有一個(gè)硬件,通常稱(chēng)為中斷控制器,它管理來(lái)自外設(shè)的所有中斷,決定運(yùn)行哪個(gè)中斷,并中斷 CPU 以使其執(zhí)行正確的 ISR。

通常,中斷控制器有一個(gè)可能的中斷列表以及它們相應(yīng)的優(yōu)先級(jí)。我們的 GPIO 外設(shè)在中斷控制器保留的列表中可能有一個(gè)或多個(gè)中斷。

例如,對(duì)于 CC2544,有一組 8 個(gè)引腳是 GPIO 的一部分,稱(chēng)為 PORT0。每個(gè)引腳標(biāo)記為 P0_0、P0_1,依此類(lèi)推,直到 P0_7。雖然每個(gè)引腳都有自己的中斷標(biāo)志,但中斷控制器對(duì)整個(gè)端口只有一個(gè)中斷,P0INT。每當(dāng)設(shè)置GPIO 外設(shè)中的任何引腳標(biāo)志時(shí),也會(huì)設(shè)置整個(gè)端口的中斷控制器中的標(biāo)志。

注意這里有兩個(gè)標(biāo)志,一個(gè)是特定引腳的標(biāo)志,它是 GPIO 外設(shè)的一部分,另一個(gè)是整個(gè)端口的中斷標(biāo)志,它是中斷控制器的一部分。如圖 3 所示。

poYBAGJo-rWAKVkDAAAssVs12EY549.jpg

圖 3.檢測(cè)到應(yīng)該產(chǎn)生中斷的事件后,在中斷控制器中設(shè)置 GPIO 引腳中斷標(biāo)志和中斷標(biāo)志。

向量表

許多微控制器使用所謂的中斷向量方法。在這種方法中,內(nèi)存中有一個(gè)向量表,它為每個(gè)中斷列出了 CPU 必須為該特定中斷執(zhí)行的 ISR 所在的地址。該地址通常稱(chēng)為中斷向量。

例如,對(duì)于使用 8501 微控制器架構(gòu)的 CC2544,PORT0 的中斷向量是內(nèi)存地址 0x6B。當(dāng)中斷控制器告訴 CPU 有來(lái)自特定向量的中斷時(shí),CPU 會(huì)做一些記錄,然后開(kāi)始從該中斷向量執(zhí)行 ISR。這如圖 4 所示。

poYBAGJo-raABJzdAABPnWSFPoI385.jpg

圖 4.在檢測(cè)到應(yīng)該產(chǎn)生中斷的事件后,在設(shè)置 GPIO 引腳中斷標(biāo)志和中斷控制器中的 GPIO 中斷標(biāo)志后執(zhí)行 GPIO 中斷向量的 ISR。

配置中斷行為

像 GPIO 這樣的外設(shè)通常讓您可以選擇配置哪些類(lèi)型的事件會(huì)導(dǎo)致外設(shè)產(chǎn)生中斷。對(duì)于 GPIO,典型的選項(xiàng)是當(dāng)值從 0 變?yōu)?1 時(shí),當(dāng)值從 1 變?yōu)?0 時(shí),值的任何變化(即,0 到 1 或 1 到 0 但無(wú)所謂),或者當(dāng)值保持為 1 或 0。

根據(jù)微控制器的不同,這可以針對(duì)每個(gè)引腳或端口上的所有引腳完成。ATmega328P 有兩個(gè)引腳,您可以在其中單獨(dú)更改。默認(rèn)情況下,其他 GPIO 引腳會(huì)檢測(cè)引腳上的任何變化(0 到 1 或 1 到 0)。回想一下,在上一篇文章中,我們說(shuō)明了中斷是如何工作的,我們假設(shè)引腳配置為僅檢測(cè)從 1 到 0 的變化。

此外,一些微控制器要求將感興趣的引腳配置為輸入,以便在事件發(fā)生時(shí)設(shè)置中斷標(biāo)志(例如,CC2544)。其他人(例如,ATmega328P)將設(shè)置標(biāo)志,無(wú)論引腳配置為輸出還是輸入。

中斷屏蔽

用于描述啟用和禁用中斷的常用術(shù)語(yǔ)是“屏蔽”。通常,可以在多個(gè)級(jí)別禁用中斷。CPU 可以啟用或禁用所有中斷,但通常有一些至關(guān)重要的中斷稱(chēng)為不可屏蔽中斷,它們永遠(yuǎn)不會(huì)被禁用。

禁用 CPU 中的所有中斷實(shí)際上會(huì)停止中斷控制器和 CPU 之間的通信。這意味著 GPIO 外設(shè)中的 pin 標(biāo)志及其在控制器中的相應(yīng)中斷標(biāo)志將被設(shè)置;但是,CPU 不會(huì)得到中斷請(qǐng)求。這如圖 5 所示。

pYYBAGJo-reAW4fmAABVIQ4Jw9s047.jpg

圖 5.在 CPU 級(jí)別全局禁用中斷。

可以屏蔽中斷的另一個(gè)級(jí)別是中斷控制器級(jí)別。在這里,我們可以啟用或禁用控制器內(nèi)部的特定中斷。

中斷示例:CC2544

一個(gè)具體的例子會(huì)有所幫助。假設(shè)我們正在使用 CC2544,并且禁用了 PORT0。假設(shè)引腳 P0_3 更改了其值,以便在 GPIO 外設(shè)中設(shè)置其標(biāo)志。PORT0 中斷標(biāo)志也會(huì)在中斷控制器中設(shè)置,但中斷控制器會(huì)忽略該標(biāo)志。

這與 CPU 禁用所有中斷不同,因?yàn)橹袛嗫刂破魅栽谂c CPU 通信。因此,例如,如果 PORT1 已啟用其中斷,并且引腳 P1_2 更改了其值,因此其標(biāo)志在 GPIO 外設(shè)中設(shè)置,并且 PORT1 中斷標(biāo)志也已設(shè)置,則中斷控制器將中斷 CPU 以處理該中斷。

中斷控制器忽略中斷向量標(biāo)志的情況如圖 6 所示。

poYBAGJo-riAZWBKAABNKNNC2tE208.jpg

圖 6.中斷控制器級(jí)別的中斷屏蔽。

大多數(shù)微控制器還允許在外設(shè)級(jí)別屏蔽中斷。在這里,我們可以啟用或禁用 GPIO 外設(shè)中特定引腳的中斷。

在我遇到的所有微控制器中,當(dāng)我們要查找的事件發(fā)生在 GPIO 外設(shè)中時(shí),總是設(shè)置中斷標(biāo)志,無(wú)論該引腳的中斷是啟用還是禁用。例如,如果引腳 P0_3 以我們正在尋找的方式更改其值,則其標(biāo)志將在 GPIO 外設(shè)中設(shè)置。但是,GPIO 外設(shè)不會(huì)向中斷控制器發(fā)出警報(bào),因此不會(huì)設(shè)置中斷控制器中的 PORT0 中斷標(biāo)志,并且由于我們需要設(shè)置該標(biāo)志才能中斷 CPU,因此不會(huì)發(fā)生中斷。這如圖 7 所示。

pYYBAGJo-rmADUmFAABQzBhFnSQ223.jpg

圖 7. GPIO 外設(shè)級(jí)別的中斷屏蔽

當(dāng)一個(gè)中斷被屏蔽時(shí),它仍然會(huì)被檢測(cè)到。CPU只是不響應(yīng)它。如果中斷標(biāo)志沒(méi)有被清除并且中斷被完全取消屏蔽,那么如果它滿(mǎn)足所有其他條件(除了屏蔽),CPU 就會(huì)響應(yīng)它以執(zhí)行它。已檢測(cè)到并等待 CPU 執(zhí)行其 ISR 的中斷通常稱(chēng)為待處理中斷。

圖 8 說(shuō)明了中斷處于未決狀態(tài),隨后又被取消屏蔽的情況。

poYBAGJo-rqAOPUOAABZE-j86lQ478.jpg

圖 8. GPIO 級(jí)別的中斷屏蔽和取消屏蔽,假設(shè)中斷在中斷控制器和 CPU 級(jí)別取消屏蔽。

回顧一下,完全取消屏蔽中斷,以便在滿(mǎn)足中斷的所有其他條件時(shí) CPU 可以響應(yīng)它:

必須在外設(shè)中啟用中斷(如果適用)。

它在中斷控制器中的相應(yīng)中斷也必須使能。

所有中斷必須由 CPU 啟用(即 CPU 和中斷控制器之間的通信必須啟用可屏蔽中斷)。

中斷優(yōu)先級(jí)

有時(shí)會(huì)同時(shí)發(fā)生兩個(gè)或多個(gè)導(dǎo)致中斷的事件。發(fā)生這種情況時(shí),中斷控制器需要一種機(jī)制來(lái)知道應(yīng)該先執(zhí)行哪個(gè)中斷等等,因?yàn)?CPU 一次只能處理一個(gè)中斷。中斷控制器通常提供一種稱(chēng)為優(yōu)先級(jí)的配置,允許用戶(hù)通過(guò)他們的代碼來(lái)指定哪些中斷是較高優(yōu)先級(jí),哪些是較低優(yōu)先級(jí)。大多數(shù)還為每個(gè)中斷提供默認(rèn)設(shè)置。

每當(dāng)多個(gè)事件同時(shí)發(fā)生并導(dǎo)致多個(gè)中斷在中斷控制器處掛起時(shí),中斷控制器就會(huì)選擇最高優(yōu)先級(jí)的中斷供 CPU 處理。中斷可以中斷(或搶占)已經(jīng)運(yùn)行的中斷,因此如果 CPU 正在處理較低優(yōu)先級(jí)的中斷,并且發(fā)生與較高優(yōu)先級(jí)中斷相關(guān)的事件,控制器將中斷 CPU 以處理較高優(yōu)先級(jí)的中斷,并且 CPU 將恢復(fù)處理完成后被搶占的低優(yōu)先級(jí)中斷。圖 9 說(shuō)明了中斷的優(yōu)先級(jí)和搶占是如何工作的。

poYBAGJo-ruAUqMgAABJxViUj60086.jpg

圖 9.假設(shè)只有兩個(gè)中斷的優(yōu)先級(jí)中斷處理。

高優(yōu)先級(jí)和低優(yōu)先級(jí)中斷標(biāo)志同時(shí)設(shè)置。CPU 在低優(yōu)先級(jí)中斷之前執(zhí)行高優(yōu)先級(jí)中斷(因?yàn)楫?dāng)高優(yōu)先級(jí)中斷完成時(shí),它的標(biāo)志仍處于掛起狀態(tài))

在 CPU 開(kāi)始處理低優(yōu)先級(jí)中斷后,高優(yōu)先級(jí)中斷標(biāo)志被設(shè)置。高優(yōu)先級(jí)中斷搶占低優(yōu)先級(jí)中斷,CPU 執(zhí)行高優(yōu)先級(jí)中斷的 ISR 直到完成,然后恢復(fù)執(zhí)行低優(yōu)先級(jí)中斷的 ISR。請(qǐng)注意,CPU 會(huì)繼續(xù)執(zhí)行低優(yōu)先級(jí)中斷的 ISR,即使在執(zhí)行高優(yōu)先級(jí)中斷的 ISR 時(shí)它的標(biāo)志仍未設(shè)置。這是因?yàn)樵趫?zhí)行 ISR 之后,除非代碼干擾正常的中斷過(guò)程,否則 CPU 總是會(huì)恢復(fù)到它開(kāi)始執(zhí)行 ISR 之前的任何狀態(tài)。它返回的這個(gè)狀態(tài)可能是另一個(gè) ISR。

較低優(yōu)先級(jí)的中斷標(biāo)志設(shè)置在較高優(yōu)先級(jí)的中斷標(biāo)志之后。由于較低優(yōu)先級(jí)的中斷不能搶占較高優(yōu)先級(jí)的中斷,CPU 在響應(yīng)較低優(yōu)先級(jí)的中斷之前執(zhí)行較高優(yōu)先級(jí)的中斷 ISR 直到完成。

檢查和清除中斷標(biāo)志

前面我們看到,對(duì)于像 CC2544 這樣的一些微控制器,當(dāng) ISR 代碼開(kāi)始執(zhí)行時(shí),我們只知道哪個(gè)端口導(dǎo)致了中斷,而不知道具體的引腳。例如,如果 P0_3 改變它的值,它的標(biāo)志將在 GPIO 外設(shè)內(nèi)部設(shè)置,但 CPU 只執(zhí)行 ISR 以響應(yīng)來(lái)自中斷控制器的 PORT0 中斷標(biāo)志。檢查 ISR 中的 GPIO 外設(shè)中斷標(biāo)志可以告訴我們哪個(gè)特定引腳產(chǎn)生了中斷,以便我們做出相應(yīng)的響應(yīng)。

由于中斷標(biāo)志表明我們要查找的事件已經(jīng)發(fā)生,所以只要設(shè)置了中斷標(biāo)志,CPU每次有機(jī)會(huì)都會(huì)響應(yīng)中斷。例如,假設(shè) P0_3 只改變了一次狀態(tài)并導(dǎo)致其中斷標(biāo)志被設(shè)置。如果我們不設(shè)置標(biāo)志位,那么在 CPU 運(yùn)行了與 PORT0 相關(guān)的 ISR 之后,它仍然會(huì)認(rèn)為有一個(gè)新的中斷,所以它會(huì)再次運(yùn)行 ISR。

為了避免這種情況,我們需要清除中斷標(biāo)志。有時(shí)中斷標(biāo)志在 CPU 開(kāi)始運(yùn)行 ISR 時(shí)會(huì)自動(dòng)清除;其他時(shí)候你必須自己清除標(biāo)志。微控制器的技術(shù)文檔會(huì)讓您知道是哪種情況。例如,CC2544 不會(huì)自動(dòng)清除引腳中斷標(biāo)志,但 ATmega328P 會(huì)。如果您必須自己清除中斷,這通常是您在 ISR 代碼中做的第一件事,通常是在確定哪個(gè)引腳中斷導(dǎo)致 ISR 被執(zhí)行之后。

回顧:讓 GPIO 中斷工作

要將以上所有內(nèi)容放在一起,為了使 GPIO 中斷與您的代碼一起工作,您必須:

編寫(xiě)一個(gè) ISR,在其中你

確保清除任何需要清除的標(biāo)志

用所需的動(dòng)作響應(yīng)中斷

將 ISR 與正確的中斷向量相關(guān)聯(lián)

配置要觸發(fā)中斷的 GPIO 事件??赡艿倪x項(xiàng)可能并非全部適用于您的特定微控制器,僅從 0 更改為 1、僅從 1 更改為 0、任何更改(0 到 1 或 1 到 0)、穩(wěn)定為 1 或穩(wěn)定為 0 。

為 GPIO 內(nèi)的引腳啟用中斷。通常建議在啟用引腳中斷之前清除引腳的標(biāo)志。

啟用中斷控制器內(nèi)部的中斷。

確保 CPU 已啟用所有中斷。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7953

    瀏覽量

    155074
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    905

    瀏覽量

    42807
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1280

    瀏覽量

    54106
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    STM32 GPIO的外部中斷設(shè)計(jì)

    在之前針對(duì)STM32的GPIO相關(guān)API函數(shù)及配置使用進(jìn)行了詳細(xì)的介紹,GPIO作為輸入引腳時(shí),調(diào)用相關(guān)讀信號(hào)引腳函數(shù)接口就可以在程序的循環(huán)中,輪詢(xún)的對(duì)輸入信號(hào)進(jìn)行讀取檢測(cè)操作,除了輪詢(xún)的方式訪(fǎng)問(wèn)
    發(fā)表于 04-14 10:51 ?2663次閱讀
    STM32 <b class='flag-5'>GPIO</b>的外部<b class='flag-5'>中斷</b>設(shè)計(jì)

    《C語(yǔ)言深度剖析》【超經(jīng)典書(shū)籍】

    本帖最后由 zgzzlt 于 2012-8-16 14:23 編輯 《C語(yǔ)言深度剖析》【超經(jīng)典書(shū)籍】
    發(fā)表于 08-02 08:59

    C語(yǔ)言深度剖析

    C語(yǔ)言深度剖析——一本關(guān)于C語(yǔ)言學(xué)習(xí)的教程,里面包含C語(yǔ)言編寫(xiě)規(guī)范,各種變量指針用法等。以含金量勇敢挑戰(zhàn)國(guó)內(nèi)外同類(lèi)書(shū)籍
    發(fā)表于 08-14 11:36

    c語(yǔ)言深度剖析

    c語(yǔ)言深度剖析
    發(fā)表于 04-02 09:12

    陳正沖《C語(yǔ)言深度剖析

    陳正沖編寫(xiě)的《C語(yǔ)言深度剖析》,挺經(jīng)典,剛來(lái)論壇,多多指教~~
    發(fā)表于 08-17 12:06

    【資料分享】C語(yǔ)言深度剖析

    C語(yǔ)言深度剖析
    發(fā)表于 10-16 15:16

    C語(yǔ)言深度剖析

    C語(yǔ)言深度剖析
    發(fā)表于 08-25 09:08

    C語(yǔ)言深度剖析

    C語(yǔ)言深度剖析[完整版].pdfC語(yǔ)言深度剖析[完整版].pdf (919.58 KB )
    發(fā)表于 03-19 05:11

    C語(yǔ)言深度剖析

    C語(yǔ)言深度剖析。
    發(fā)表于 05-05 17:40 ?7次下載

    C語(yǔ)言深度剖析

    C語(yǔ)言深度剖析
    發(fā)表于 12-20 22:50 ?0次下載

    嵌入式Linux的GPIO中斷

    做個(gè)STM32開(kāi)發(fā)的都知道,通過(guò)程序配置讓普通的GPIO口具有中斷功能。這樣對(duì)于設(shè)備檢測(cè)某些硬件的自動(dòng)設(shè)備要方便的多。那么在嵌入式的Linux是否具有這樣的功能呢?答案是肯定的,下面我們就來(lái)介紹一下
    發(fā)表于 11-01 17:37 ?6次下載
    嵌入式Linux的<b class='flag-5'>GPIO</b><b class='flag-5'>中斷</b>

    關(guān)于Linux的GPIO中斷知識(shí)

    在嵌入式系統(tǒng)中,經(jīng)常會(huì)用到gpio外部中斷來(lái)獲取外部事件,比如按鍵、傳感器、網(wǎng)絡(luò)通信等等。一般中斷都會(huì)綁定一個(gè)中斷回調(diào)函數(shù),來(lái)執(zhí)行產(chǎn)生中斷
    的頭像 發(fā)表于 03-24 11:27 ?4225次閱讀
    關(guān)于Linux的<b class='flag-5'>GPIO</b><b class='flag-5'>中斷</b>知識(shí)

    如何配置GPIO中斷功能呢?

    如何配置GPIO中斷功能呢? GPIO在嵌入式系統(tǒng)中經(jīng)常用于控制外設(shè),如LED、攝像頭、傳感器等。除此之外,GPIO還可以被配置為中斷功能
    的頭像 發(fā)表于 10-30 09:57 ?3954次閱讀

    C語(yǔ)言深度剖析.zip

    C語(yǔ)言深度剖析
    發(fā)表于 12-30 09:20 ?5次下載

    stm32 GPIO中斷配置教程

    在嵌入式開(kāi)發(fā)中,STM32微控制器因其高性能和豐富的外設(shè)而廣受歡迎。GPIO(通用輸入/輸出)中斷是STM32微控制器中常用的功能之一,它允許開(kāi)發(fā)者在特定引腳上檢測(cè)到外部信號(hào)變化時(shí)快速響應(yīng)。 1.
    的頭像 發(fā)表于 11-19 15:53 ?3462次閱讀