RM新时代网站-首页

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

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

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

MAXQ微控制器中斷編程

星星科技指導(dǎo)員 ? 來源:ADI ? 作者:ADI ? 2023-02-20 10:11 ? 次閱讀

閱讀本筆記沒有暗示或要求的特殊知識(shí),但對(duì)MAXQ架構(gòu)和寄存器映射有基本的熟悉是一個(gè)加分項(xiàng)。這些信息可以在MAXQ系列用戶指南、數(shù)據(jù)資料(如MAXQ2000)和其他應(yīng)用筆記(如MAXQ架構(gòu)簡(jiǎn)介;使用MAXQ2000評(píng)估板的示例應(yīng)用)。本應(yīng)用筆記中使用的示例的源代碼和項(xiàng)目文件可以下載

MAXQ10和MAXQ20微控制器具有簡(jiǎn)單、廉價(jià)的單向量中斷機(jī)制,而中斷源和控制則在邏輯上組織成三級(jí)分層結(jié)構(gòu)。硬件不會(huì)優(yōu)先考慮中斷。應(yīng)用程序代碼負(fù)責(zé)通過單個(gè)向量調(diào)度各種中斷,因此,對(duì)中斷進(jìn)行編程和調(diào)試是應(yīng)用程序開發(fā)周期的重要組成部分。本說明提供:

為需要編寫簡(jiǎn)單中斷功能編程的用戶提供的入門指南

有關(guān)實(shí)現(xiàn)更詳細(xì)的中斷優(yōu)先級(jí)方案、嵌套中斷和可用硬件資源的最佳利用的提示。

MAXQ中斷機(jī)制概述

MAXQ系列微控制器具有一個(gè)寄存器IV(中斷向量),用于保存中斷例程的地址,以及一個(gè)位INS(中斷iN服務(wù)),用于指示中斷活動(dòng)。當(dāng)中斷被觸發(fā)時(shí),處理器內(nèi)核的行為就像在代碼中插入了“呼叫IV”和“移動(dòng)INS,#1”指令一樣。MAXQ內(nèi)核執(zhí)行子程序調(diào)用,即指令指針I(yè)P被推入堆棧并加載IV寄存器的內(nèi)容,然后設(shè)置INS位表示存在活動(dòng)的“服務(wù)中斷”,以防止進(jìn)一步的中斷調(diào)用。中斷服務(wù)以“RETI”(或“POPI”)指令結(jié)束,該指令將返回地址從堆棧彈出到 IP 中并清除 INS 位,用戶代碼從中斷的位置恢復(fù)。

中斷觸發(fā)邏輯如圖1所示,以MAXQ2000微控制器為例。其它MAXQ微控制器可能具有不同的中斷源集,但邏輯結(jié)構(gòu)在整個(gè)MAXQ系列中都是通用的。

邏輯結(jié)構(gòu)從圖 1 左側(cè)列出的各個(gè)中斷源開始。每個(gè)源都有一個(gè)關(guān)聯(lián)的中斷標(biāo)志,即在檢測(cè)到來自該源的中斷事件時(shí)由硬件設(shè)置的特殊位。每個(gè)源還具有單獨(dú)的使能位,允許應(yīng)用程序啟用或禁用中斷源。僅當(dāng)標(biāo)志位和使能位都設(shè)置為 1 時(shí),來自該源的中斷信號(hào)才有效。這些位在MAXQ架構(gòu)中提供單獨(dú)的中斷信號(hào)和控制。

poYBAGPy1seAFzz2AACTewcu2vk685.gif?imgver=1

圖1.MAXQ2000微控制器中的中斷觸發(fā)邏輯

由于MAXQ架構(gòu)是模塊化的,中斷也根據(jù)其在模塊中的位置進(jìn)行分組。與單個(gè)中斷源一樣,每個(gè)模塊都有自己的中斷標(biāo)志和使能位,如圖 1 中間所示。該標(biāo)志是來自該模塊的所有底層中斷信號(hào)的邏輯“OR”,而使能位允許應(yīng)用程序啟用或禁用整個(gè)模塊的中斷。這些位分配在兩個(gè)8位寄存器中(IIR中的標(biāo)志和IMR中的使能),并在模塊級(jí)別提供中斷信號(hào)和控制。

最后,來自所有模塊的中斷信號(hào)被“OR化”以形成全局中斷觸發(fā)信號(hào),如圖1右側(cè)所示?!爸袛嗳质鼓堋蔽籌GE允許應(yīng)用禁用或啟用此信號(hào),從而提供全局級(jí)別的中斷控制。

設(shè)置后,單個(gè)中斷標(biāo)志將保持設(shè)置狀態(tài),直到被軟件(即中斷服務(wù)代碼)清除,即使導(dǎo)致設(shè)置該標(biāo)志的條件消失或刪除。如果軟件清除標(biāo)志失敗,退出服務(wù)代碼后將反復(fù)觸發(fā)中斷。模塊化中斷標(biāo)志(IIR 寄存器)是只讀的;一旦應(yīng)用程序代碼清除了模塊中的所有基礎(chǔ)單個(gè)標(biāo)志,它就會(huì)自動(dòng)清除。

在圖 1 所示的配置中,右側(cè)的全局中斷觸發(fā)信號(hào)處于活動(dòng)狀態(tài),由左側(cè)的三個(gè)獨(dú)立源引起:UART1 傳輸、定時(shí)器1 溢出和看門狗定時(shí)器。這三者都設(shè)置了各自的標(biāo)志和啟用位。另一個(gè)源(模塊 8 中的 Ext1)也是信令,但該信號(hào)在模塊級(jí)別被屏蔽(禁用),因?yàn)橹袛嘌诖a位 IMR.1 為 0。中斷服務(wù)例程 (ISR) 中的軟件通過分析標(biāo)志和使能位(圖 1 中以相反的順序顯示,即從右到左)來識(shí)別信令源,然后為每個(gè)活動(dòng)源提供服務(wù)并清除各個(gè)中斷標(biāo)志。

對(duì)簡(jiǎn)單的中斷服務(wù)例程進(jìn)行編程

許多應(yīng)用程序不需要復(fù)雜的中斷功能,只需要一兩個(gè)中斷,而不考慮優(yōu)先級(jí)。讓我們看看如何為MAXQ編程這樣的服務(wù)例程。我們使用IAR嵌入式工作臺(tái)作為示例編程工具,但是我們的代碼主要是可移植的(除了一些特定于工具的功能,如下所示)。?

假設(shè)現(xiàn)有應(yīng)用程序需要每毫秒在端口引腳上觸發(fā)短脈沖,同時(shí)執(zhí)行許多其他重要任務(wù)。這可以使用配置為每 1ms 生成一次中斷請(qǐng)求的板載定時(shí)器來實(shí)現(xiàn)。

為了完成中斷編程,我們需要向現(xiàn)有的無中斷應(yīng)用程序添加一些與中斷相關(guān)的代碼。與中斷相關(guān)的代碼由兩部分組成:初始化和 ISR。初始化代碼放置在應(yīng)用程序開頭的某個(gè)位置,以設(shè)置正確的中斷配置:使能位(單個(gè)、模塊和全局)和 IV 寄存器。ISR 可以放置在任何位置,并且在退出之前應(yīng)執(zhí)行三個(gè)基本任務(wù):

確定中斷源(如果僅使用一個(gè)源,則不需要)

清除中斷標(biāo)志

執(zhí)行所需的操作

首先,讓我們看看這一切在匯編語言中是如何工作的。C程序員可以跳過這一部分,盡管它確實(shí)提供了對(duì)幕后發(fā)生的事情的有用見解。圖 2 顯示了我們的無中斷應(yīng)用程序的源代碼。除了許多其他非常重要的任務(wù)外,它還以0的波特率連續(xù)輸出字節(jié)35x5(ASCII符號(hào)“115200”)。在硬件上運(yùn)行時(shí),可以通過COM端口輕松捕獲輸出,如圖3所示。

pYYBAGPy1smAY1RxAADa6tJSxhk930.jpg?imgver=1

圖2.沒有中斷的示例應(yīng)用程序代碼。

pYYBAGPy1sqATGRcAAC-a8IjM9M108.jpg?imgver=1

圖3.圖 2 中示例無中斷應(yīng)用程序的輸出。

現(xiàn)在我們按照上述四個(gè)步驟添加中斷代碼,從 ISR 開始。

由于只有一個(gè)中斷處于活動(dòng)狀態(tài),因此不需要源標(biāo)識(shí);

如果我們使用 Timer1 溢出中斷,則標(biāo)志是模塊 3 的寄存器 8 的第 4 位。清除它

move  M4[8].3,#0  ; clear interrupt flag

如果我們使用端口引腳 P0.0 觸發(fā)脈沖,則操作代碼可能如下所示:

move  M0[0].0,#1  ; set pin high
move  M0[0].0,#0  ; set pin low

這解決了任務(wù),但是如果沒有示波器,我們就無法看到結(jié)果。為了可視化它,讓我們通過串行端口輸出“5”以外的內(nèi)容,例如“$”符號(hào)(0x24):

move  M2[7],#0x24 ; start transmission

通過此添加,我們希望在輸出上的 5 中偶爾出現(xiàn)$s(如果執(zhí)行 ISR)。請(qǐng)注意,當(dāng)串行端口忙于傳輸時(shí),可以調(diào)用 ISR,從而導(dǎo)致“$”和“5”字符之間的沖突。當(dāng)然,正確編寫的 ISR 應(yīng)該避免此類沖突,但為了簡(jiǎn)單起見,我們有意忽略了這個(gè)問題。

退出

reti  ; exit ISR

中斷初始化代碼應(yīng):

將定時(shí)器1配置為每1ms溢出一次。

move  M4[10],#(65536-16000)  ; ovfl every 1ms @ 16MHz
move  M4[9],M4[10]           ; init counter
move  M4[16],#0x0            ; 16-bit timer mode

使用ISR的地址加載IV寄存器。

move  IV,#   ;  load interrupt vector

在所有三個(gè)級(jí)別啟用 Timer1 溢出中斷:?jiǎn)蝹€(gè)、模塊和全局。

move  M4[0],#0x88      ; int enabled, start the timer
move  IMR.4,#1         ; enable ints from module 4
move  IC.0,#1          ; enable global interrupts (IGE=1)

我們還必須初始化端口引腳,即設(shè)置方向和電壓電平:

move  M0[16].0,#1 ; Configure Port Pin P0.0 direction (output)
move  M0[0].0,#0  ; Set Port Pin P0.0 Low

將所有部分組裝在一起,我們最終得到圖 4 中所示的代碼及其輸出(如圖 5 所示)。$s如預(yù)期的那樣,端口引腳P0.0每1ms發(fā)射一次短脈沖。由于上述傳輸沖突,$s和 5 的模式并不完全規(guī)則——有些$s無法通過。

現(xiàn)在讓我們?cè)?C 中重做相同的應(yīng)用程序。這甚至更容易,因?yàn)镃編譯器將為我們做一些工作。也就是說,IAR C 編譯器將中斷向量 IV 設(shè)置為通用 ISR,用于標(biāo)識(shí)信令模塊并調(diào)用與此模塊對(duì)應(yīng)的 C 函數(shù)。它還負(fù)責(zé)保存/恢復(fù) ISR 內(nèi)部使用的寄存器,因此應(yīng)用程序流不會(huì)因中斷而中斷。我們需要做的就是為每個(gè)模塊編寫 ISR 函數(shù),該函數(shù)將生成中斷并進(jìn)行配置,即正確設(shè)置啟用位。后者很重要 — 如果應(yīng)用程序錯(cuò)誤地啟用了沒有相應(yīng) ISR 功能的中斷,則結(jié)果將難以預(yù)測(cè)。

pYYBAGPy1suAZl6LAAFqHPhuI1s084.jpg?imgver=1

圖4.帶中斷的示例應(yīng)用程序代碼。

poYBAGPy1s2AenHvAAC5l-ApaDc042.jpg?imgver=1

圖5.圖 4 和圖 6 中示例應(yīng)用程序的典型輸出。

我們現(xiàn)在遵循相同的邏輯步驟,但這次對(duì) ISR 函數(shù)使用 C 語法。

來源識(shí)別。我們必須告訴編譯器哪個(gè)模塊是中斷的來源:

#pragma vector=4
__interrupt void  isr_module4() {}

#pragma 指令和關(guān)鍵字__interrupt通知編譯器,當(dāng)模塊 4 有活動(dòng)中斷信號(hào)時(shí),應(yīng)調(diào)用以下示例中的 isr_module4())。由于模塊 4 中只有一個(gè)源處于活動(dòng)狀態(tài),因此不需要更多源標(biāo)識(shí)。

清除標(biāo)志。如果我們使用定時(shí)器1溢出中斷,則標(biāo)志在寄存器T2CNB2中為位TF1。清除它

T2CNB1_bit.TF2=0; // clear interrupt flag

請(qǐng)注意,名稱 TF2 和 T2CNB1_bit 分別只是位 3 和寄存器 M4[8] 的替代品。它們?cè)谔囟ㄓ诠ぞ叩陌募癷omaxq200x.h”中定義。

中斷操作。在端口引腳 P0.0 上發(fā)出脈沖:

PO0=1;            // set pin high
PO0=0;            // set pin low

退出。無事可做;編譯器會(huì)處理這個(gè)問題。

SBUF0='$';        // start transmission

同樣,中斷初始化代碼是直接的ASM到C轉(zhuǎn)換,除了設(shè)置由編譯器自動(dòng)完成的IV寄存器:

將定時(shí)器1配置為每1ms溢出一次。

T2R1=65536-16000; // ovfl every 1ms @ 16MHz
T2V1=T2R1;        // init counter
T2CFG1=0;         // 16-bit timer mode

使用 ISR 地址加載 IV 寄存器 — 由編譯器完成。

在所有三個(gè)級(jí)別啟用 Timer1 溢出中斷:?jiǎn)蝹€(gè)、模塊和全局。

T2CNA1=0x88;      // int enabled, start the timer
IMR_bit.IM4=1;    // enable ints from module 4
IC_bit.IGE=1;     // enable global interrupts (IGE=1)

poYBAGPy1tCACt7yAAFeGY1nexE688.jpg?imgver=1

圖6.在 C 語言中使用中斷的示例應(yīng)用程序。

我們還必須初始化端口引腳,即設(shè)置方向和電壓電平:

PD0=1;            // Configure P0.0 direction (output)
PO0=0;            // Set P0.0 Low

將所有部分組裝在一起,我們最終得到圖 6 中所示的代碼。在硬件上運(yùn)行時(shí),其輸出看起來與圖 5 所示相同。

對(duì)嵌套中斷進(jìn)行編程

通常,當(dāng)中斷被處理時(shí),觸發(fā)信號(hào)在全局級(jí)別被稱為INS的特殊位阻止(圖1中未顯示)。該位在進(jìn)入 ISR 時(shí)由硬件自動(dòng)設(shè)置,并在執(zhí)行 RETI 或 POPI 指令時(shí)清除(通常在退出 ISR 時(shí))。當(dāng) INS = 1 時(shí),無法觸發(fā)中斷。但是,某些應(yīng)用程序可能希望允許嵌套或遞歸中斷。這可以通過清除 ISR 內(nèi)的 INS 位來完成,從而允許中斷中斷服務(wù)例程流。請(qǐng)注意,第二個(gè)中斷調(diào)用將向量到與第一個(gè)中斷調(diào)用相同的 IV 寄存器指向的 ISR,因此應(yīng)用程序在允許遞歸中斷調(diào)用時(shí)應(yīng)針對(duì)無限循環(huán)進(jìn)行配置。

圖7顯示了一個(gè)在端口引腳(連接到按鈕)的下降沿激活中斷的應(yīng)用。本應(yīng)用使用模塊0中的MAXQ2000上的Ext0中斷。按鈕連接到相應(yīng)的端口引腳P0.4。中斷服務(wù)例程旨在通過清除 INS 位(圖 14 中的第 7 行)來中斷其自身的代碼。為此目的提供了內(nèi)在函數(shù) __reenable_interrupt(),盡管可以通過直接寫入位來完成相同的工作:IC_bit。INS=0;。為了防止無限循環(huán),ISR 通過在進(jìn)入時(shí)遞增全局變量nest_level和在退出時(shí)遞減來計(jì)算嵌套級(jí)別。僅當(dāng)嵌套級(jí)別不超過特定限制時(shí),才會(huì)清除 INS 位(此示例中最多允許 7 個(gè)級(jí)別)。

當(dāng)沒有發(fā)生中斷時(shí),應(yīng)用程序通過串行端口連續(xù)輸出字符“0”,指示正在執(zhí)行 main() 函數(shù)。按下按鈕時(shí),ISR 會(huì)打印當(dāng)前嵌套級(jí)別并執(zhí)行空閑循環(huán)幾秒鐘,以便在 ISR 仍在運(yùn)行時(shí)再次按下按鈕。當(dāng)嵌套達(dá)到級(jí)別 7 時(shí),不再清除 INS 位。如果在級(jí)別 7 執(zhí)行 ISR 時(shí)按下該按鈕,則新的中斷請(qǐng)求將保持掛起狀態(tài)(設(shè)置了標(biāo)志,但觸發(fā)信號(hào)被 INS = 1 阻止),直到 ISR 完成并退出,清除 INS 位并在級(jí)別 6 恢復(fù) ISR。然后,掛起的中斷變?yōu)榛顒?dòng)狀態(tài),并再次導(dǎo)致級(jí)別 7 的 ISR 呼叫。圖 8 說明了這種描述的行為 — 每個(gè)非零數(shù)字表示一個(gè) ISR 條目,包括遞歸中斷調(diào)用。

編程中斷優(yōu)先級(jí)方案

到目前為止,我們只考慮了一個(gè)中斷源的簡(jiǎn)單應(yīng)用程序。更高級(jí)的應(yīng)用可以同時(shí)使用多個(gè)中斷源,例如RTC報(bào)警,定時(shí)器/計(jì)數(shù)器,按鈕或其他外部I / O信號(hào),看門狗,發(fā)送/接收與UART的通信,SPI?、1-Wire等各種中斷可能會(huì)來來去去,多個(gè)中斷源可能會(huì)同時(shí)變?yōu)榛顒?dòng)狀態(tài),但應(yīng)用程序一次只能為它們提供服務(wù)。因此,應(yīng)用程序必須應(yīng)用一些規(guī)則來決定應(yīng)首先、第二、依此類推為哪些同時(shí)處于活動(dòng)狀態(tài)的源提供服務(wù)。這些規(guī)則通常以中斷優(yōu)先級(jí)表示 — 為每個(gè)中斷源分配一個(gè)稱為優(yōu)先級(jí)的整數(shù)。如果發(fā)生沖突,優(yōu)先級(jí)較高的源會(huì)先于優(yōu)先級(jí)較低的源進(jìn)行服務(wù)。?

在MAXQ架構(gòu)中,這種中斷服務(wù)排序必須在軟件中實(shí)現(xiàn),因?yàn)椴淮嬖谟布?yōu)先級(jí)。在本應(yīng)用筆記中,我們僅考慮確定中斷服務(wù)優(yōu)先級(jí)的眾多可能方法中的兩種:

源標(biāo)識(shí)排序(無遞歸中斷)

動(dòng)態(tài)中斷重新配置(帶遞歸中斷)

事實(shí)上,這兩種方法都可以在一個(gè)應(yīng)用程序中混合在一起,正如我們將在下面的示例中看到的那樣,創(chuàng)建靈活有效的中斷服務(wù)結(jié)構(gòu)。

pYYBAGPy1tGAQK4QAAFrv88mgUQ560.jpg?imgver=1

圖7.在 C 語言中具有嵌套中斷的示例應(yīng)用程序。

前一種方法意味著安排ISR的來源識(shí)別部分,以便首先識(shí)別和維修優(yōu)先級(jí)較高的源,然后再識(shí)別和維修優(yōu)先級(jí)較低的源。例如,假設(shè)圖 1 中的三個(gè)源同時(shí)發(fā)出信號(hào),但應(yīng)用程序希望首先處理看門狗中斷,然后處理 Timer1 溢出,然后處理 UART1 傳輸。該任務(wù)可以通過以下偽代碼解決:

if (  )
        {  }
if (  )
        {  }
if (  )
        {  }

這種簡(jiǎn)單的技術(shù)幾乎沒有開銷;它不需要額外的內(nèi)存或遞歸中斷調(diào)用。每個(gè)中斷都按照接收順序從頭到尾執(zhí)行,除非有兩個(gè)或多個(gè)中斷掛起。在這種情況下,服務(wù)順序由應(yīng)用程序代碼中的源標(biāo)識(shí)排列定義。但這種方法有一個(gè)缺點(diǎn):如果在為另一個(gè)源提供服務(wù)時(shí)發(fā)生緊急、優(yōu)先級(jí)最高的中斷,則必須等到 ISR 完成,到那時(shí)可能為時(shí)已晚。為了克服這個(gè)問題,我們必須允許中斷ISR流,這就引出了第二種方法——?jiǎng)討B(tài)中斷重新配置。

后一種方法更通用,意味著每個(gè)單獨(dú)的 ISR 需要執(zhí)行以下步驟:

保存當(dāng)前中斷配置并重新配置整個(gè)使能位集,以禁用所有較低(低于當(dāng)前)或同等優(yōu)先級(jí)的源,但啟用更高優(yōu)先級(jí)的源

允許遞歸中斷,即清除 INS 位

執(zhí)行當(dāng)前中斷的操作

禁止遞歸中斷,即設(shè)置 INS 位

恢復(fù)保存在步驟i)中斷配置并退出。

此實(shí)現(xiàn)允許幾乎立即為較高優(yōu)先級(jí)的中斷提供服務(wù),即使它在為較低優(yōu)先級(jí)的源提供服務(wù)時(shí)發(fā)生。但是,此方法會(huì)消耗更多的數(shù)據(jù)和程序空間,并且隨著方案中添加的每個(gè)額外中斷源而增加。

poYBAGPy1tKAEslHAADAXFuy1C8079.jpg?imgver=1

圖8.圖 7 中示例應(yīng)用程序的輸出。

為了演示這兩種方法,我們創(chuàng)建一個(gè)MAXQ2000應(yīng)用示例,具有以下中斷優(yōu)先級(jí)方案:

中斷源 源模塊 優(yōu)先權(quán) 中斷操作
看門狗定時(shí)器 7 99 (最高) 清除看門狗定時(shí)器;將符號(hào)打印到 UART0
UART0 傳輸 2 70 從緩沖區(qū)傳輸下一個(gè)字節(jié)(如果有)
定時(shí)器1 溢出 4 50 在端口引腳 P0.0 上觸發(fā)脈沖(每 128 毫秒)
外部國際 0 0 30 非常重要的按鈕操作(紅色按鈕)
外部國際 10,11,12 1 10, 11, 12 按鈕操作(綠色按鈕)

看門狗定時(shí)器具有最高優(yōu)先級(jí),因?yàn)槿绻醇皶r(shí)清除,它將重置設(shè)備。然后我們利用UART的傳輸中斷,它表示一個(gè)字節(jié)已成功發(fā)送,下一個(gè)字節(jié)傳輸可以開始。此中斷也是確保快速通信和防止緩沖區(qū)溢出的高優(yōu)先級(jí)。接下來是Timer1,它以相對(duì)較慢但有規(guī)律的速度發(fā)射脈沖。按鈕中斷的優(yōu)先級(jí)較低,因?yàn)樗鼈兪遣灰?guī)則的。

模塊化架構(gòu)使在模塊級(jí)別分配優(yōu)先級(jí)變得簡(jiǎn)單方便。在這種情況下,唯一要保存/重新配置/恢復(fù)的配置數(shù)據(jù)是 IMR 寄存器,即 8 位模塊中斷掩碼。否則,必須在每個(gè)單獨(dú)的 ISR 中存儲(chǔ)、重新配置和恢復(fù)整個(gè)分散的單個(gè)使能位集。因此,我們?yōu)槟K實(shí)現(xiàn)了通用優(yōu)先級(jí)方法(動(dòng)態(tài)重新配置),但對(duì)模塊內(nèi)的中斷源實(shí)現(xiàn)了簡(jiǎn)單的排序方法。

我們示例中的模塊 1 有多個(gè)中斷源,圖 9 顯示了如何在模塊 1 中斷例程 isr_module1() 中實(shí)現(xiàn)優(yōu)先級(jí)。首先,它保存當(dāng)前中斷配置(圖 39 中的第 9 行),然后重新配置中斷以禁用模塊 1 中的源,但啟用更高優(yōu)先級(jí)的模塊 0、4、2、7(第 40 行),并通過清除 INS 位(第 41 行)重新啟用中斷。然后,它按照優(yōu)先級(jí)順序識(shí)別模塊 1 中的中斷源并為其提供服務(wù)。首先檢查優(yōu)先級(jí)較高的 int12(第 45-50 行),其次檢查優(yōu)先級(jí)較低的 int11(第 52-57 行),最后檢查優(yōu)先級(jí)最低的 int10(第 59-64 行)。這些中斷的服務(wù)例程具有較長(zhǎng)的延遲循環(huán)(在 button() 函數(shù)內(nèi)部,圖 48 中的第 55、62 和 9 行),因此在中斷例程 isr_module1() 仍在運(yùn)行時(shí)可能會(huì)發(fā)生其他中斷。

其他中斷也以類似的方式設(shè)計(jì)(請(qǐng)參閱附錄A中的完整源代碼,可供下載),但優(yōu)先級(jí)最高的看門狗中斷除外,其中不需要重新配置。應(yīng)用程序通過 UART0 寫入各種 ASCII 標(biāo)記,以便可以在 PC 上捕獲它們以可視化執(zhí)行流程。為了演示,硬件組裝有兩個(gè)按鈕:一個(gè)連接到引腳P0.4,按下時(shí)激活外部中斷0;另一個(gè)連接到引腳 P5.2、P5.3、P6.0,分別對(duì)應(yīng)于外部中斷 10、11、12,因此當(dāng)按下該按鈕時(shí),所有三個(gè)中斷都會(huì)同時(shí)激活。由于前一個(gè)中斷 Ext0 具有更高的優(yōu)先級(jí),因此我們將其稱為“紅色按鈕”,而另一個(gè)按鈕將稱為“綠色按鈕”,激活三個(gè)優(yōu)先級(jí)較低的中斷。

當(dāng)未按下任何按鈕時(shí),應(yīng)用程序打印“=Reset=”,然后連續(xù)寫入單詞“Main”,點(diǎn)“...”和單詞“”,表示重置后它執(zhí)行main()函數(shù),并且經(jīng)常被看門狗(點(diǎn))中斷,偶爾被Timer1溢出打斷(參見圖10)。當(dāng)檢測(cè)到任何按鈕中斷時(shí),應(yīng)用程序在 ISR 條目上打印“”,在 ISR 出口時(shí)打印“ExtN>”(N 是外部中斷的編號(hào))。對(duì)于圖 10 中的示例,按下“綠色”按鈕一次,然后按幾次“紅色”按鈕。“綠色”按鈕同時(shí)激活了三個(gè)外部中斷 — 10、11 和 12 — 但如圖 10 所示,int12 首先根據(jù)其優(yōu)先級(jí)提供服務(wù),而 int11 和 int10 處于掛起狀態(tài)。ISR 顯然被看門狗和計(jì)時(shí)器打斷。緊接著是 int11(int10 仍處于掛起狀態(tài)),它被使用“紅色”按鈕激活的更高優(yōu)先級(jí)的 int0 打斷。最后,緊跟在 int11 之后的是 int10,而 int0 又被按下 (int10) 的“紅色”按鈕打斷了幾次。在這個(gè)過程中的某個(gè)時(shí)刻,所有優(yōu)先中斷都被嵌套了:main功能被int0按鈕中斷,被int1按鈕中斷,被Timer<>溢出中斷,被UART傳輸中斷,被看門狗中斷!

pYYBAGPy1tSAfzjcAAFTWyg2LOM279.jpg?imgver=1

圖9.具有多個(gè)優(yōu)先級(jí)中斷的示例應(yīng)用程序(片段)。

poYBAGPy1tWAFDfiAAENkIeIcc0961.jpg?imgver=1

圖 10.圖 9(附錄 A)中示例應(yīng)用程序的輸出。

結(jié)論

MAXQ微控制器的中斷機(jī)制非常簡(jiǎn)單,可配置性強(qiáng),使得MAXQ的中斷編程變得容易。盡管硬件資源有限,但MAXQ獨(dú)特的模塊化架構(gòu)允許開發(fā)人員以極低的開銷實(shí)現(xiàn)復(fù)雜的中斷優(yōu)先方案。

審核編輯:郭婷

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

    關(guān)注

    48

    文章

    7542

    瀏覽量

    151316
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19259

    瀏覽量

    229651
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120230
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    帶紅外模塊的16位微控制器MAXQ61C電子資料

    概述:MAXQ61C是一款低功耗、16位MAXQ 微控制器 ,設(shè)計(jì)用于通用遙控 、消費(fèi)類電子和白色家電等低功耗產(chǎn)品。器件結(jié)合了功能強(qiáng)大的16位RISC
    發(fā)表于 04-13 07:16

    16位微控制器MAXQ613電子資料

    概述:MAXQ613是一款低功耗、16位MAXQ 微控制器 ,設(shè)計(jì)用于通用 遙控 、消費(fèi)類 電子 和白色家電等低功耗產(chǎn)品。器件結(jié)合了強(qiáng)大的16位RISC
    發(fā)表于 04-13 07:35

    16位微控制器具有紅外模塊MAXQ610電子資料

    概述:MAXQ610是MAXIM公司生產(chǎn)的一款低功耗、16位MAXQ?微控制器,設(shè)計(jì)用于通用遙控、消費(fèi)類電子和白色家電等低功耗產(chǎn)品。 MAXQ
    發(fā)表于 04-21 07:47

    MAXQ2000微控制器與MAX4397是如何連接的?

    MAX4397是什么?MAXQ2000微控制器與MAX4397是如何連接的?
    發(fā)表于 06-04 06:15

    實(shí)現(xiàn)MAXQ2000微控制器的JTAG加載主機(jī)

    摘要:MAXQ®微控制器提供的JTAG啟動(dòng)加載程序使外部JTAG主機(jī)能夠利用一組標(biāo)準(zhǔn)命令,輕松地識(shí)別MAXQ微控制器,并對(duì)其進(jìn)行編程
    發(fā)表于 04-23 16:22 ?1529次閱讀
    實(shí)現(xiàn)<b class='flag-5'>MAXQ</b>2000<b class='flag-5'>微控制器</b>的JTAG加載主機(jī)

    MAXQ微控制器中斷編程

    programming techniques for the MAXQ family of microcontrollers. IntroductionNo special knowledge is implied or required
    發(fā)表于 04-23 16:50 ?982次閱讀
    <b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>的<b class='flag-5'>中斷</b><b class='flag-5'>編程</b>

    在應(yīng)用編程MAXQ微控制器中可分區(qū)擦除的程序和數(shù)據(jù)閃存

    摘要:本應(yīng)用筆記介紹了MAXQ微控制器中的程序和數(shù)據(jù)閃存,以及如何使用內(nèi)置的應(yīng)用ROM對(duì)閃存進(jìn)行擦/寫。本應(yīng)用筆記適用于所有使用分區(qū)擦除閃存的MAXQ微控制器。
    發(fā)表于 04-23 17:16 ?702次閱讀
    在應(yīng)用<b class='flag-5'>編程</b><b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>中可分區(qū)擦除的程序和數(shù)據(jù)閃存

    MAXQ8913微控制器中從RAM執(zhí)行應(yīng)用程序

    MAXQ8913微控制器中從RAM執(zhí)行應(yīng)用程序 MAXQ8913及其它MAXQ®微控制器采用的Harvard存儲(chǔ)
    發(fā)表于 01-11 17:56 ?1160次閱讀
    在<b class='flag-5'>MAXQ</b>8913<b class='flag-5'>微控制器</b>中從RAM執(zhí)行應(yīng)用程序

    MAXQ1103 高性能RISC安全微控制器

    MAXQ1103 高性能RISC安全微控制器 概述 MAXQ1103微控制器是一款低功耗32位R
    發(fā)表于 01-26 16:18 ?848次閱讀

    MAXQ61H 低功耗、16位MAXQ微控制器

      MAXQ61H是一款低功耗、16位MAXQ®微控制器,設(shè)計(jì)用于通用遙控、消費(fèi)類電子和白色家電等低功耗產(chǎn)品。 MAXQ61H結(jié)合
    發(fā)表于 01-05 09:34 ?843次閱讀
    <b class='flag-5'>MAXQ</b>61H 低功耗、16位<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>

    MAXQ618 低功耗6位MAXQ微控制器

    MAXQ618是一種低功耗,16位MAXQ微控制器的低功耗應(yīng)用,包括通用遙控,消費(fèi)電子和白色家電設(shè)計(jì)。該器件結(jié)合了強(qiáng)大的16位RISC微控制器
    發(fā)表于 03-14 11:02 ?1231次閱讀
    <b class='flag-5'>MAXQ</b>618 低功耗6位<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>

    MAXQ612/MAXQ622低功耗、16位MAXQ微控制器

    MAXQ612/MAXQ622低功耗、16位MAXQ?微控制器設(shè)計(jì)用于通用遙控、消費(fèi)類電子和白色家電等低功耗產(chǎn)品。兩款器件均采用低功耗、高
    發(fā)表于 05-28 11:47 ?1322次閱讀
    <b class='flag-5'>MAXQ</b>612/<b class='flag-5'>MAXQ</b>622低功耗、16位<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>

    MAXQ微控制器中斷編程

    發(fā)表于 11-18 23:45 ?0次下載
    <b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b><b class='flag-5'>中斷</b><b class='flag-5'>編程</b>

    使用uIP堆棧將MAXQ微控制器聯(lián)網(wǎng)

    本應(yīng)用筆記介紹如何使用uIP TCP/IP網(wǎng)絡(luò)堆棧將MAXQ?微控制器聯(lián)網(wǎng)。常用的SPI?轉(zhuǎn)以太網(wǎng)IC用作此應(yīng)用的MAC/PHY。MAXQ2000作為微控制器示例。
    的頭像 發(fā)表于 01-11 20:32 ?1198次閱讀
    使用uIP堆棧將<b class='flag-5'>MAXQ</b><b class='flag-5'>微控制器</b>聯(lián)網(wǎng)

    MAXQ2000微控制器實(shí)現(xiàn)JTAG自舉加載程序主控

    通過使用一組標(biāo)準(zhǔn)化命令,MAXQ微控制器提供的JTAG引導(dǎo)加載程序允許外部JTAG主機(jī)輕松識(shí)別和編程任何MAXQ微控制器
    的頭像 發(fā)表于 02-21 11:22 ?1126次閱讀
    為<b class='flag-5'>MAXQ</b>2000<b class='flag-5'>微控制器</b>實(shí)現(xiàn)JTAG自舉加載程序主控
    RM新时代网站-首页