版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第5章 中斷系統(tǒng)及應(yīng)用 5.1 概述 5.2 SPCE061A中斷系統(tǒng) 5.3 中斷系統(tǒng)應(yīng)用 思考題 5.1 概 述 1. 中斷 中斷是指計算機在執(zhí)行某一程序的過程中,由于計算機系統(tǒng)內(nèi)、外的某種原因而必須終止原程序的執(zhí)行,轉(zhuǎn)去完成相應(yīng)的處理程序,待處理結(jié)束之后再返回繼續(xù)執(zhí)行被終止原程序的過程。 中斷技術(shù)能實現(xiàn)CPU與外部設(shè)備的并行工作,提高CPU的利用率及數(shù)據(jù)的輸入/輸出效率,能及時發(fā)現(xiàn)計算機運行過程中的突發(fā)事件并自動處理,如計算機對外部事件、硬件故障、運算錯誤、定時器溢出等做出響應(yīng)。觸鍵喚醒中斷能使我們通過鍵盤發(fā)出申請,隨時對運行中的CPU提出請求,轉(zhuǎn)而完成一些必須馬上處理的事件。 2. 中
2、斷源 中斷源是指在計算機系統(tǒng)中向CPU發(fā)出中斷請求的事件。中斷源可以是人為設(shè)定的,也可以是突發(fā)的隨機事件。如定時器中斷就是由定時器溢出產(chǎn)生的中斷。 3. 中斷優(yōu)先級 由于在實際應(yīng)用系統(tǒng)中往往有多個中斷源,且中斷申請是隨機的,有時還可能會有多個中斷源同時提出中斷申請,但CPU一次只能響應(yīng)一個中斷源發(fā)出的中斷請求,這時CPU響應(yīng)哪個中斷請求,就需要用軟件或硬件按中斷源工作性質(zhì)的輕重緩急給它們安排一個優(yōu)先順序,即所謂的優(yōu)先級排隊。中斷優(yōu)先級越高則響應(yīng)優(yōu)先權(quán)就越高。當CPU正在執(zhí)行中斷服務(wù)程序時,又有中斷優(yōu)先級更高的中斷申請產(chǎn)生,CPU就會暫停原來的中斷處理程序而轉(zhuǎn)去處理優(yōu)先級更高的中斷請求,處理完畢
3、后再返回原低級中斷服務(wù)程序,這一過程稱為中斷嵌套,具有這種功能的中斷系統(tǒng)稱為多級中斷系統(tǒng)。沒有中斷嵌套功能的則稱為單級中斷系統(tǒng)。圖5.1 中斷嵌套示意圖 4. 中斷響應(yīng)過程 中斷響應(yīng)過程有以下幾步: (1) 檢測中斷。在每一條指令結(jié)束后,系統(tǒng)自動檢測中斷請求信號,如果有中斷請求且相應(yīng)的中斷允許位為真(允許中斷)時,則響應(yīng)中斷。 (2) 保護現(xiàn)場。CPU一旦響應(yīng)中斷,中斷系統(tǒng)會自動保存當前內(nèi)容PC和SR寄存器內(nèi)容(通過入棧完成),執(zhí)行中斷服務(wù)程序,中斷服務(wù)程序還可以通過壓入堆棧來保護原程序中用到的數(shù)據(jù)和寄存器的值。保護現(xiàn)場前一般要關(guān)中斷,以防止現(xiàn)場保護過程中有高優(yōu)先級中斷發(fā)生而破壞現(xiàn)場保護。保護
4、現(xiàn)場一般是用堆棧指令將原程序中用到的寄存器壓入堆棧,現(xiàn)場保護之后要開中斷,以便響應(yīng)更高優(yōu)先級的中斷申請。 (3) 中斷服務(wù)。通過執(zhí)行中斷服務(wù)程序完成相應(yīng)的功能。 (4) 清除中斷標志位。CPU響應(yīng)中斷后,要請除相應(yīng)的中斷請求標志位,以免CPU再次響應(yīng)該中斷。 (5) 恢復(fù)現(xiàn)場。中斷服務(wù)完成后,返回之前要用彈出堆棧指令使保護在堆棧中的數(shù)據(jù)和寄存器的值彈出,以實現(xiàn)恢復(fù)原有數(shù)據(jù)的目的。 注意:在恢復(fù)現(xiàn)場前要關(guān)中斷,以防止恢復(fù)現(xiàn)場過程中再有中斷響應(yīng)破壞恢復(fù)現(xiàn)場。現(xiàn)場恢復(fù)后應(yīng)及時開中斷。 (6) 中斷返回。此時CPU將PC指針和SR內(nèi)容彈出堆棧恢復(fù)斷點,從而使CPU繼續(xù)執(zhí)行剛才被中斷的程序。 在單片機中
5、,中斷技術(shù)主要用于實時控制和及時處理外部突發(fā)事件。要求計算機能及時響應(yīng)被控對象提出的分析計算和控制等請求,使被控對象保持在最佳工作狀態(tài),以達到預(yù)定的控制效果。由于這些控制參量的請求都是隨機發(fā)生的,而且要求單片機必須做出快速響應(yīng)并及時處理,對此只有利用中斷技術(shù)才能實現(xiàn)。 5.2 SPCE061A中斷系統(tǒng) 5.2.1 中斷類型 1. 軟件中斷 軟件中斷是由軟件指令break 產(chǎn)生的中斷,軟件中斷的向量地址為FFF5H。 2. 異常中斷 異常中斷是非常重要的事件,該中斷一旦發(fā)生,CPU必須立即進行處理。目前,SPCE061A定義的異常中斷只有復(fù)位一種。通常系統(tǒng)復(fù)位可以由以下三種情況引起:上電、看門狗
6、計數(shù)器溢出和系統(tǒng)電源電壓低于限值。不論什么情況引起復(fù)位,都會使復(fù)位引腳的電位變低,進而使程序指針PC指向由復(fù)位向量FFF7H所指的系統(tǒng)復(fù)位程序入口地址。 3. 事件中斷 事件中斷簡稱中斷,以下提到的中斷均為事件中斷,一般產(chǎn)生于片內(nèi)某部件或由外設(shè)中斷輸入引腳引入的某個事件,這種中斷的開放/屏蔽由對應(yīng)位和相應(yīng)的IRQ或FIQ總使能控制,由軟件設(shè)置。 事件中斷可采用兩種方式:快速中斷請求(FIQ)和中斷請求(IRQ),這兩種中斷都由相應(yīng)的總使能來控制。 5.2.2 中斷源 表5.1 中斷源列表 1. 定時器中斷 定時器中斷由單片機內(nèi)部定時器TimerA和TimerB產(chǎn)生。在定時脈沖作用下從預(yù)置數(shù)單元
7、初值開始加1計數(shù),當計數(shù)為0 xFFFFH時,再加1便產(chǎn)生溢出,向CPU提出中斷請求,以表明定時器的定時時間到,定時時間可通過程序設(shè)定,通常用于需要進行定時控制的場合。 2. 外部中斷 SPCE061A單片機有兩個外部中斷EXT1和EXT2。兩個外部輸入引腳分別與B口的IOB2和IOB3復(fù)用,即EXT1(IOB2)和EXT2(IOB3)。引入兩個外部中斷源的中斷請求信號,外部中斷以負跳沿觸發(fā)方式輸入中斷請求信號,如圖5.2所示。 圖5.2 外部中斷信號 EXT1、EXT2可以由外部單脈沖產(chǎn)生中斷請求信號,也可以通過接入相應(yīng)的阻容元件實現(xiàn)定時中斷。 在IOB2和IOB4之間以及IOB3和IOB5
8、之間分別接入兩個反饋電路,外接RC振蕩器做外部定時中斷使用,如圖5.3所示,此時,外部中斷的反饋電路使用四個管腳(B口的IOB2、IOB3、IOB4和IOB5引腳),其中IOB4和IOB5主要用來組成RC反饋電路,通過IOB2和IOB4之間(或者IOB3和IOB5之間)增加一個RC振蕩電路,便可在EXT1(或EXT2)端得到振蕩信號作為外中斷觸發(fā)信號。為使反饋電路正常工作,必須將IOB2(或IOB3)設(shè)置為反相輸出方式,IOB4(或IOB5)設(shè)置為輸入方式。 圖5.3 IOB2、IOB4或IOB3、IOB5之間的反饋結(jié)構(gòu) 3. 串行通信口中斷 串行通信口中斷由SPCE061A內(nèi)部串行通信口中斷
9、源產(chǎn)生。串行通信口中斷分為串行口發(fā)送中斷和接收中斷兩種,共用一個中斷向量。因此,在進入串行通信口中斷服務(wù)程序后,需要判斷是接收中斷還是發(fā)送中斷。 當串行通信口發(fā)送/接收完一組串行數(shù)據(jù)時,自動使串行通信口控制寄存器P_UART_Command2中的TxReady和RxReady中斷標志置位,并向CPU發(fā)出中斷請求,CPU響應(yīng)串行通信口中斷后,轉(zhuǎn)入中斷服務(wù)程序執(zhí)行。因此,只要在串行通信口中斷服務(wù)程序中,安排一段對P_UART_Command2寄存器的TxReady和RxReady中斷標志位的狀態(tài)判斷程序,便可區(qū)分發(fā)生了接收中斷還是發(fā)送中斷請求。當然串行傳輸中既可以使用中斷方式收發(fā)數(shù)據(jù),也可通過查詢
10、TxReady和RxReady中斷標志位的狀態(tài)收發(fā)數(shù)據(jù)。串行通信口接收、發(fā)送端為B口的IOB7(RxD)和IOB10(TxD)兩個復(fù)用腳。 4. 觸鍵喚醒中斷 當系統(tǒng)執(zhí)行睡眠命令時,CPU便關(guān)閉PLL倍頻電路,停止CPU時鐘,使系統(tǒng)進入睡眠狀態(tài)。系統(tǒng)處于睡眠狀態(tài)時,通過IOA口低八位接的鍵盤給出喚醒信號,使系統(tǒng)接通PLL倍頻電路,啟動CPU 時鐘,將系統(tǒng)從睡眠狀態(tài)轉(zhuǎn)到工作狀態(tài),CPU從睡眠處繼續(xù)執(zhí)行程序。與此同時產(chǎn)生一個IRQ3_KEY中斷請求,進入喚醒中斷。一般來講,中斷系統(tǒng)提供的中斷源FIQ(TMA)、IRQ1IRQ7均可作為系統(tǒng)的喚醒源,作為定時喚醒系統(tǒng)。 5. 時基信號中斷 SPCE0
11、61A單片機提供了多組時基信號能作為中斷源。時基信號來自實時時鐘32 768 Hz,輸出有通過選頻邏輯的TMB1、TMB2信號和直接從時基計數(shù)器溢出的各種實時時基信號,在開啟時基信號中斷的情況下,有時基信號時,便發(fā)出時基信號中斷申請,CPU查詢到有中斷請求后,置位P_INT_Ctrl中相應(yīng)的中斷請求標志位,在中斷服務(wù)程序中通過測試P_INT_Ctrl來確定是哪個頻率的時基信號產(chǎn)生的中斷請求。 5.2.3 中斷控制 1. 中斷控制寄存器 SPCE061A 單片機對中斷源的開放和屏蔽以及每個中斷源是否被允許中斷,都受中斷允許寄存器P_INT_Ctrl和一些中斷控制指令的控制。下面分別作一介紹。 1
12、) 中斷控制寄存器 P_INT_Ctrl(讀/寫)(7010H) P_INT_Ctrl 控制單元具有讀/寫屬性,其讀寫時表達的意義不同。中斷控制寄存器功能如表5.2所示。 表5.2 中斷控制寄存器功能表 2) 清中斷標志寄存器 P_INT_Clear (寫)(7011H) 清中斷標志寄存器用于清除中斷控制標志位。當CPU響應(yīng)中斷后中斷標志仍為1,硬件并不自動清除該標志,當進入中斷服務(wù)程序后,必須將其控制標志清零,否則,CPU還會響應(yīng)該中斷。 P_INT_Clear寄存器的每一位對應(yīng)一個中斷源(如表5.2所示,具體位置與中斷控制寄存器相同),如果想清除某個中斷標志,只要將該寄存器中對應(yīng)位置1,即
13、可清除該中斷標志。該寄存器只有寫的屬性,讀該寄存器是無任何意義的。 2. 中斷控制端口配置 3. 中斷控制指令 表5.4 中斷控制指令一覽表 (1) FIQ ON指令。 功能:開放FIQ中斷,是FIQ中斷的總中斷允許命令,其控制指令不能代替P_INT_Ctrl。也就是說,即使在程序中寫了該指令,但沒有將P_INT_Ctrl 寄存器的FIQ 位置1,CPU也無法響應(yīng)該中斷。FIQ ON與FIQ OFF配對使用。例1 FIQ ON的使用。 _main: FIQ OFF r1 = 0 x8000H P_INT_Ctrl = r1 /在P_INT_Ctrl 開放FIQ中斷 FIQ ONloop:NOP
14、 GOTO loop (2) FIQ OFF指令。 功能:屏蔽FIQ 中斷,該指令可以屏蔽P_INT_Ctrl 控制寄存器打開的FIQ 中斷。 例2 快速中斷的屏蔽與開放。 _main:FIQ ONr1 = 0 x8000HP_INT_Ctrl = r1 /開放FIQ中斷FIQ OFF /關(guān)閉FIQ中斷FIQ ON /開放FIQ中斷l(xiāng)oop: NOP GOTO loop (3) IRQ ON IRQ總中斷允許指令。 功能:開放IRQ 中斷。該控制指令不能代替P_INT_Ctrl,與FIQ ON 相似,必須通過P_INT_Ctrl允許中斷,與IRQ OFF配對使用。 (4) IRQ OFF IR
15、Q總中斷屏蔽指令。功能:屏蔽IRQ中斷,與FIQ OFF相似,可以屏蔽P_INT_Ctrl開放的中斷,并通過IRQ ON開放。 (5) INT指令。 功能:設(shè)置允許/禁止FIQ 和IRQ 中斷。該控制指令與前面的指令相同,只有先通過P_INT_Ctrl 寄存器打開中斷,才能完全開放中斷。 INT 控制指令可以細分為: INT FIQ 功能:允許FIQ中斷,關(guān)閉IRQ中斷。 INT IRQ 功能:允許IRQ中斷,關(guān)閉FIQ中斷。 INT FIQ IRQ功能:允許FIQ中斷,允許IRQ中斷。 INT OFF 功能:關(guān)閉FIQ中斷,關(guān)閉IRQ中斷。例3 中斷命令的使用。_main:r1=0 x800
16、4H/開中斷IRQ5_2 Hz和FIQ_PWMP_INT_Ctrl=r1INT FIQ/允許FIQ_PWM中斷,屏蔽IRQ5中斷 INT IRQ /允許IRQ5中斷,屏蔽FIQ_PWMNT FIQ,IRQ/允許IRQ和FIQ中斷INT OFF /屏蔽IRQ和FIQ中斷l(xiāng)oop: NOP GOTO loop5.2.4 中斷向量及優(yōu)先級 SPCE061A單片機每一中斷都對應(yīng)一個向量單元,稱為中斷向量。在中斷向量單元中存放中斷服務(wù)程序的入口地址,而不是轉(zhuǎn)移指令(與MCS-8051不同),如表5.5所示。在允許中斷的情況下,當有中斷請求時,將使程序轉(zhuǎn)移至由中斷向量單元內(nèi)容所決定的中斷服務(wù)程序起始地址運
17、行。 SPCE061A單片機快速中斷的優(yōu)先級高于普通中斷的優(yōu)先級。在IRQ中斷中,IRQ0的中斷優(yōu)先于IRQ1,IRQ1 的中斷優(yōu)先于IRQ2,IRQ的序號越大,中斷優(yōu)先級越低。串行通信口(UART)的中斷優(yōu)先級最低。 表5.5 SPCE061A中斷的優(yōu)先級 在IRQ中斷中,只是中斷查詢有先后,不能進行中斷嵌套。同一中斷向量內(nèi)的中斷源中斷優(yōu)先級相同。 中斷優(yōu)先關(guān)系如下: FIQIRQ0IRQ1IRQ2IRQ3IRQ4IRQ5IRQ6UART、IRQ同級 5.2.5 中斷響應(yīng) 1. 中斷響應(yīng)過程 1) 中斷查詢 把所有的中斷請求都匯集到P_INT_Ctrl 和P_UART_Command2(該寄
18、存器用于檢測串行通信口中斷標志位)寄存器中。外部中斷時運用采樣將中斷請求信號鎖存在P_INT_Ctrl 寄存器的相應(yīng)標志位,而音頻輸出中斷、觸鍵喚醒、定時中斷、時基中斷、串行通信口中斷等中斷請求,由于都發(fā)生在芯片的內(nèi)部,可以直接去置位P_INT_Ctrl和P_UART_Command2中各自的中斷請求標志位。所謂查詢就是由CPU測試P_INT_Ctrl和P_UART_Command2中各標志位的狀態(tài),確定是否有中斷請求發(fā)生以及是哪一個中斷請求。 中斷查詢發(fā)生在每條指令周期結(jié)束,按中斷優(yōu)先級順序?qū)χ袛嗾埱筮M行查詢,即先查詢FIQ,再查詢IRQ。同級中斷按IRQ0、IRQ1、IRQ2、IRQ3、I
19、RQ4、IRQ5、IRQ6、UART的順序查詢。如果查詢到有標志位為1,則表明有中斷請求發(fā)生。由于中斷請求是隨機發(fā)生的,無法預(yù)先知道,因此,程序執(zhí)行過程中,在每條指令結(jié)束都要進行中斷查詢。 2) 中斷響應(yīng) 當允許中斷且查詢到中斷請求時,才能響應(yīng)中斷。此時,CPU首先將程序計數(shù)器PC的內(nèi)容壓入堆棧,再將SR壓入堆棧以保護斷點,然后將存放在中斷向量單元的中斷服務(wù)程序入口地址裝入PC,執(zhí)行中斷服務(wù)程序。 3) 中斷響應(yīng)條件中斷響應(yīng)條件如下:(1) 中斷開放;(2) 對應(yīng)中斷源允許中斷;(3) 無高優(yōu)先級的中斷請求;(4) 一條指令執(zhí)行結(jié)束。 2. 中斷請求的撤銷 中斷響應(yīng)后P_INT_Ctrl和P_
20、UART_Command2中的中斷請求標志應(yīng)及時清除,否則就意味著中斷請求仍然存在,會造成中斷的重復(fù)響應(yīng)。因此,必須及時撤銷中斷請求。SPCE061A中斷撤銷只需向中斷標志位寫1即可。 除UART中斷外,所有的中斷均需軟件清除標志位,即將P_INT_Ctrl中相應(yīng)的中斷標志位清除, 就撤銷了中斷請求。而UART中斷則是硬件自動清除,不需要軟件操作。 如當接收到數(shù)據(jù)后P_UART_Command2中的接收標志位自動置1,進入UART中斷。在UART中斷服務(wù)程序中讀出數(shù)據(jù),P_UART_Command2相應(yīng)的中斷標志位自動清除。 3. 中斷服務(wù)流程 1) 中斷入口 表5.6 中斷入口地址表 圖5.
21、4 中斷服務(wù)流程圖 2) 關(guān)中斷和開中斷 在一個中斷執(zhí)行過程中,有可能有新的中斷請求發(fā)生,對于重要的中斷必須執(zhí)行完成,不允許被其它的中斷所嵌套,對此可以采用關(guān)閉中斷的方法來解決。如在IRQ中斷中不允許FIQ中斷嵌套,可以在IRQ中斷響應(yīng)后關(guān)閉中斷,當中斷服務(wù)程序執(zhí)行結(jié)束后,再開放中斷,響應(yīng)FIQ。也可在進入中斷服務(wù)程序后,先關(guān)閉中斷系統(tǒng),徹底屏蔽其它中斷請求,等中斷處理完成后,再打開中斷系統(tǒng)。還有一種情況是中斷處理可以被打斷,但現(xiàn)場的保護和恢復(fù)不允許打擾以免現(xiàn)場被破壞,為此應(yīng)在保護現(xiàn)場和恢復(fù)現(xiàn)場的前后,進行關(guān)中斷和開中斷,這樣除現(xiàn)場保護和現(xiàn)場恢復(fù)的片刻外,仍然保持著系統(tǒng)中斷嵌套功能。 SPCE
22、061A單片機開中斷和關(guān)中斷通過中斷控制指令來完成。如果只要對單個中斷源進行控制,通過P_INT_Ctrl 控制寄存器相應(yīng)位置1和清0來打開或關(guān)閉某個中斷源。 3) 現(xiàn)場保護和現(xiàn)場恢復(fù) 所謂現(xiàn)場是指中斷時刻單片機存儲單元的數(shù)據(jù)狀態(tài)。為了使中斷服務(wù)的執(zhí)行不破壞這些數(shù)據(jù)或狀態(tài),以免在中斷返回后影響主程序的運行,通常要把它們送入堆棧中保存起來,這就是現(xiàn)場保護。 現(xiàn)場保護一定要位于中斷服務(wù)程序的前面,中斷服務(wù)結(jié)束后在返回主程序前把保存的現(xiàn)場內(nèi)容從堆棧中彈出,以恢復(fù)那些存儲單元的原有內(nèi)容,這就是現(xiàn)場恢復(fù)。現(xiàn)場恢復(fù)一定要位于中斷處理程序之后返回主程序前。 4) 中斷源判斷 由于SPCE061A中斷源多于中
23、斷向量,多個中斷源共用一個中斷向量,所以當CPU響應(yīng)中斷進入中斷服務(wù)程序后,要通過讀P_INT_Ctrl判斷產(chǎn)生中斷請求的中斷源。 5) 中斷處理 中斷處理是中斷服務(wù)程序的核心內(nèi)容,是中斷的具體目的,即中斷后要完成的操作。 6) 清中斷標志位 CPU是根據(jù)中斷標志位來判斷并進行響應(yīng)中斷的,除串行通信口中斷外所有的中斷標志位不是硬件清除,而是由軟件清除的,所以在中斷服務(wù)程序中必須將中斷標志位清除。 中斷標志位的清除只要在中斷服務(wù)程序中即可,位置不是固定的。一般在中斷服務(wù)程序返回前清除中斷標志。 7) 中斷返回 中斷服務(wù)程序最后一條指令必須是中斷返回指令RETI,當CPU執(zhí)行這條指令時,從堆棧中彈
24、出斷點PC及SR,即可恢復(fù)斷點,重新執(zhí)行被中斷的程序。 5.3 中斷系統(tǒng)應(yīng)用5.3.1 單中斷源應(yīng)用 1. 定時中斷 定時器中斷包括定時器A中斷和定時器B中斷,而且不僅FIQ中斷方式中有定時器中斷源,在IRQ1(TimerA)、IRQ2(TimerB)中也有定時器中斷源,可根據(jù)具體程序需要選擇。如果需要定時器中斷優(yōu)先級高,可以打開FIQ方式的定時器中斷;如果不要求較高的中斷優(yōu)先級,可以將定時器中斷放在IRQ中斷方式中。 例4 利用定時器A,在A口的IOA0腳輸出周期為20 ms的方波(定時10 ms)。分析:(1) 選擇使用哪種中斷方式,是FIQ中斷方式還是IRQ中斷方式。當然在這個例子中采用
25、哪一種中斷都可以,這里我們采用IRQ中斷,開中斷時需打開IRQ1_TMA中斷即定時器A中斷,將P_INT_Ctrl 的IRQ1_TMA置位即可。(2) 產(chǎn)生T=20 ms的方波,只要每10 ms使IOA0腳輸出電平翻轉(zhuǎn)一次,因此只需定時10 ms即可。 (3) 選擇時鐘源,以方便準確為原則,我們選用8 kHz時鐘源A,時鐘源B為1。(4) 確定定時器A的預(yù)置初數(shù)(P_imerA_Data)。計算方法:定時器溢出率1/10 ms=100 Hz定時器初值N=0 xFFFF-時鐘源頻率/定時器溢出頻率 =0 xFFFF-8192/100 =0 xFFAD 表5.7 定時中斷使用的寄存器 圖5.5 定
26、時器中斷主程序流程圖 圖5.6 定時器中斷服務(wù)程序流程圖 程序名稱: TimerA _10ms _Pulse .asm。.include hardware.inc.define TIMERA_CLKA_8 K 0 x0003 /時鐘源A選擇8192Hz.defineTIMERA_CLKB_1 0 x0030H /時鐘源B選擇1.define TIMER_DATA_FOR_8 kHz 0 xFFAD /計算: 0 xFFFFH-時鐘源頻率/定時器溢出率 0 xFFFF-8192/100 OxFFAD.RAM.CODE.PUBLIC_main _main:r1 = 0 x0001/定義IOA0為輸
27、出P_IOA_Dir = r1P_IOA_Attrib = r1P_IOA_Data = r1r1 = TIMER_DATA_FOR_8 kHz/定時器A置初值0 xFFADP_TimerA_Data=r1/定義時鐘源A為8192 Hz,時鐘源B為1r1 = TIMERA_CLKA_8K + TIMERA_CLKB_1P_TimerA_Ctrl=r1r1 = Ox1000/開放定時A的中斷P_INT_Ctrl=r1INT IRQ /開IRQ中斷l(xiāng)oop: NOP/等待中斷GOTO loop 定時器A中斷服務(wù)程序:每10 ms中斷一次,將IOA0端口狀態(tài)取反。 .TEXT.PUBLIC _IRQ
28、1_IRQ1:INT OFF /關(guān)中斷PUSH r1,r5 TO sp /保護現(xiàn)場r1 = P_IOA_DATAr1 = 0 xFFFFH/方波標識位取反, 輸出波形P_IOA_Data=r1r1=0 x1000/清除中斷標志位P_INT_Clear=r1POP r1,r5 FROMsp /恢復(fù)現(xiàn)場INT IRQ FIQ /開中斷 RETI /中斷返回 2. 時基中斷 SPCE061A單片機時基信號頻率資源豐富,有2 Hz、4 Hz、8 Hz、16 Hz、32 Hz、64 Hz、128 Hz、256 Hz、512 Hz、1024 H、2048 Hz、4096 Hz等多種頻率供實時處理時鐘選擇。
29、提供了七個時基中斷源,占用了三個中斷向量,可根據(jù)實際需要選擇適當?shù)臅r基信號源。時基中斷使用的控制寄存器如表5.8所示。 表5.8 時基中斷使用的控制寄存器 例5 在A口低8位接八個發(fā)光二極管,利用時基信號設(shè)計一定時器,定時0.5 s閃爍一次。 分析:首先考慮定時0.5 s采用哪個時基信號比較方便,我們可以很明顯地看出2 Hz時基信號中斷是最方便的。只要設(shè)定2 Hz的時基信號中斷為0.5 s的定時時間即可。 硬件:IOA0IOA7接八個發(fā)光二極管。 主程序:端口初始化,2 Hz中斷開放。 程序名稱:TimeBase_2Hz.asm。 時基中斷主程序流程圖如圖5.7所示,中斷服務(wù)程序流程圖如圖5.
30、8所示。 圖5.7 時基中斷主程序流程圖 圖5.8 時基中斷中斷服務(wù)程序流程圖 主程序:.include hardware.inc.CODE.PUBLIC _main_main:r1=0 x00FF /初始化A口低8位為輸出P_IOA_Attrib=r1P_IOA_Dir=r1r1=0 x0000P_IOA_Data=r1r1 =0 x0004 /開放IRQ5_2 Hz中斷P_INT_Ctrl=r1INT IRQ /開IRQ中斷l(xiāng)oop:NOPGOTO loop 中斷服務(wù)程序:每中斷一次,使IOA0IOA7狀態(tài)取反,所接LED狀態(tài)變化。.TEXT.PUBLIC _IRQ5_IRQ5:PUSH
31、r1,r5 TO sp /保護現(xiàn)場r1 = 0 x0004TEST r1,P_INT_Ctrl /判2 Hz中斷源JNZ IRQ5_2Hz /是,2 Hz中斷,則轉(zhuǎn)至對應(yīng)程序段IRQ5_4Hz: r1=0 x0008/否則是4 Hz中斷GOTO Exit_INT IRQ5_2Hz: r1 = P_IOA_DATA/2 Hz中斷應(yīng)用程序 r1 = 0 xFFFF/IOA口值取反P_IOA_Data = r1r1 = 0 x0004Exit_INT: P_INT_Clear=r1 /清中斷標志POP r1,r5 FROM sp /恢復(fù)現(xiàn)場RETI/中斷返回 3. 觸鍵喚醒中斷 觸鍵喚醒中斷是系統(tǒng)進
32、入睡眠狀態(tài)后,通過A口低8位的按鍵來喚醒系統(tǒng)時鐘,恢復(fù)睡眠時的PC指針的,同時進入觸鍵喚醒中斷。觸鍵喚醒中斷使用的控制寄存器如表5.9所示。 例6 使CPU進入睡眠狀態(tài),通過觸鍵喚醒系統(tǒng)。IOA0IOA7接八個發(fā)光二極管并利用喚醒中斷點亮LED。 分析:首先考慮如何使系統(tǒng)進入睡眠狀態(tài),前面已經(jīng)介紹了,通過設(shè)置時鐘系統(tǒng)控制寄存器P_SystemClock 的b4位使系統(tǒng)進入睡眠狀態(tài)。其次設(shè)置喚醒按鍵,因為只有A口的低8位具有喚醒功能,所以按鍵必須在A口低8位中選擇。本例選用A口低8位接鍵盤。 表5.9 觸鍵喚醒中斷使用的控制寄存器 硬件:A口低8位接鍵盤;高8位接八個LED。 主程序:IOA口、
33、觸鍵喚醒/中斷初始化,系統(tǒng)進入睡眠狀態(tài)。 觸鍵喚醒中斷主程序流程圖如圖5.9所示,中斷服務(wù)程序流程圖如圖5.10所示。 圖5.9 觸鍵喚醒主程序流程圖 圖5.10 觸鍵喚醒中斷服務(wù)程序流程圖 主程序:.include hardware.inc.PUBLIC _main.define P_IOA_latch 0 x7004.CODE_main:r1=0 xFF00 /初始化A口低8位為帶下拉輸入, 高8位為輸出P_IOA_Dir=r1P_IOA_Attrib=r1r1 =0 x0000 P_IOA_Data=r1r1 =0 x0080 /開放IRQ3_KEY觸鍵喚醒中斷P_INT_Ctrl =
34、r1r1=P_IOA_latch /激活A(yù)口觸鍵喚醒INT IRQ/開IRQ中斷r1=0 x0007P_SystemClock=r1 /系統(tǒng)進入睡眠狀態(tài)Loop: NOP/當有鍵喚醒時繼續(xù)執(zhí)行GOTO Loop 中斷服務(wù)程序:判斷中斷源類型,是觸鍵喚醒中斷點亮八個發(fā)光二極管,否則返回。.TEXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH r1,r4 TO sp /保護現(xiàn)場r1 = 0 x0080test r1,P_INT_Ctrl /是否為觸鍵喚醒中斷jz L_notKeyArouse/否,外部中斷L_KeyArouse:r1 = P_IOA_Data/是,觸鍵喚醒中斷r1
35、|= 0 xFF00 /點亮八個發(fā)光二極管P_IOA_Data = r1r1 =0 x0080GOTO Exit_INT L_notKeyArouse:/外部中斷r1 =0 x0100/判斷是EXT1中斷嗎TEST r1,P_INT_Ctrl JNZ L_EXT1 r1 = 0 x0200/外部中斷2L_EXT1:NOPExit_INT: P_INT_Clear=r1 /清中斷標志POP r1,r4 FROM sp /恢復(fù)現(xiàn)場INT IRQRETI.END 4. 外部中斷 SPCE061A單片機有兩個外部中斷源EXT1和EXT2,這兩個外部中斷源可以使用反饋電路定時觸發(fā),也可以通過IOB2或I
36、OB3引腳的下降沿觸發(fā)。外部中斷使用的控制寄存器如表5.10所示。 表5.10 反饋電路外部中斷使用的控制寄存器 例7 利用外部中斷點亮接在A口低8位的八個LED。 分析:選擇使用外部中斷EXT1還是外部中斷EXT2。兩個外部中斷都可以,只是初始化時略有不同。選擇EXT1初始化IOB2為帶上拉電阻的輸入端口,選擇EXT2初始化IOB3為帶上拉電阻的輸入端口。此例我們選擇EXT1中斷源。 硬件:A口低8位接八個LED。 主程序:端口初始化,開放EXT1中斷。 程序名稱:Ext1.asm。 外部中斷的主程序流程圖如圖5.11所示,中斷服務(wù)程序流程圖如圖5.12所示。 圖5.11 外部中斷主程序流程
37、圖 圖5.12 外部中斷中斷服務(wù)程序流程圖 主程序:.include hardware.inc.CODE.PUBLIC _main_main:r1=0 x00FF /設(shè)置A口低8位為輸出P_IOA_Attrib=r1P_IOA_Dir=r1r1 = 0 x0000P_IOA_Data=r1r1=0 x0000/設(shè)IOB2帶上拉電阻輸入 P_IOB_Dir=r1P_IOB_Attrib=r1r1=0 x0004P_IOB_Data=r1r1=0 x0100/開中斷IRQ3_EXT1P_INT_Ctrl=r1INT IRQloop:NOPJMP loop 中斷服務(wù)程序:判斷中斷源、點亮LED。.T
38、EXT.PUBLIC _IRQ3_IRQ3:INT OFFPUSH r1,r5 TO sp/現(xiàn)場保護r1=0 x0100TEST r1,P_INT_Ctrl /判斷IRQ3_EXT1中斷JNZ irq3_ext1 /是,則轉(zhuǎn)至IRQ3_EXT1程序段r1=0 x0200TEST r1,P_INT_Ctrl /判斷IRQ3_EXT2JNZ irq3_ext2 irq3_key: r1 = 0 x0080/鍵喚醒中斷GOTO Exit_INTirq3_ext2: /外部中斷2GOTO Exit_INTirq3_ext1: /外部中斷1r2=0 x00FFP_IOA_Data=r2 /點亮LEDEx
39、it_INT:P_INT_Clear=r1POP r1,r5 FROM sp /恢復(fù)現(xiàn)場INT IRQ,FIQRETI 5. 串行通信口中斷 串行通信口中斷用于串行通信過程中數(shù)據(jù)的接收和發(fā)送。UART可以實現(xiàn)全雙工通信,P_UART_Data (讀/寫) ($7023H)單元用于接收和發(fā)送數(shù)據(jù)的緩存。串行通信口中斷使用的控制寄存器如表5.11所示。 表5.11 異步串行通信口中斷使用的控制寄存器 寫入:將發(fā)送的數(shù)據(jù)送入緩存器,按字節(jié)傳送。 讀出:從緩存器讀出接收的單字節(jié)數(shù)據(jù)。UART模塊的接收管腳Rx和發(fā)送管腳Tx分別可與IOB7 和IOB10 共用。 注意:由于UART串行傳輸方式為8位數(shù)據(jù)
40、傳輸,所以傳輸一個字需要發(fā)送兩次,接收也是如此。 例8 準備一組數(shù)據(jù)自發(fā)自收。系統(tǒng)時鐘頻率Fosc=24.576 MHz,串行通信口波特率為115.2 kb/s。分析:允許串行通信口中斷并設(shè)置P_UART_Command1,允許UART接收、發(fā)送中斷。串行通信口波特率控制字為0000006BH。異步串行通信主程序:Rx、Tx端口初始化、串行通信口工作方式、波特率設(shè)定、接收、發(fā)送指針設(shè)定。自發(fā)自收五個數(shù)據(jù):0 x1122, 0 x3344,0 x5566,0 x7788和0 xAAFF。 異步串行通信主程序流程圖如圖5.13所示,中斷服務(wù)程序流程圖如圖5.14所示。 圖5.13 異步串行通信主程
41、序流程圖 圖5.14 異步串行通信中斷服務(wù)程序流程圖 主程序:.include hardware.inc.define UART_DATA_SIZE 0 x0005H.DATA SendData: .DW 0 x1122, 0 x3344,0 x5566,0 x7788, 0 xAAFF /發(fā)送的數(shù).ISRAM.PUBLIC RecData /接收數(shù)據(jù)RecData: .DW 5 DUPdup(0).var recNum /接收計數(shù).var sendNum /發(fā)送計數(shù).var sendFlag /發(fā)送標志 1:發(fā)送高8位, 0:發(fā)送低8位.var recFlag /接收標志 1:接收高8位,
42、0:接收低8位.CODE.PUBLIC_main_main: /主程序 r2 = RecDataR1 = 0 x0480 /設(shè)置IOB7為懸浮輸入, IOB10為同相輸出P_IOB_Attrib = R1R1 =0 x0400P_IOB_Dir = R1R1 = 0 x0000P_IOB_Data = R1R1 = 0 x006B /設(shè)置波特率114.84 kHz(=115.2 kHz)P_UART_BaudScalar Low = R1R1 = 0 x0000P_UART_BaudScalar High = R1R1 = 0 x00C0 /R1=0000 0000 1100 0000BP_U
43、ART_Command1 = R1 /開接收、發(fā)送中斷P_UART_Command2 = R1 /允許接收、發(fā)送 1.2R1 =0 x0000sendNum = r1 /發(fā)送指針清0recNum = R1 /接收指針清0R1 = 0 x0001sendFlag = R1 /初始化發(fā)送標志位recFlag = r1 /初始化接收標志位INT IRQ /開中斷l(xiāng)oop: NOPGOTO loop 串行通信口中斷服務(wù)程序:接收、發(fā)送一組數(shù)據(jù)。.TEXT.PUBLIC _IRQ7UART_RECC_IRQ:.PROC_IRQ7:INT OFFPUSH r1,r5 TO spr1 = 0 x0080 /
44、判斷接收中斷標志RxRDYTEST R1,P_UART_Command2/判是否為接收中斷JNZ UART_RECV_IRQ UART_SEND_IRQ: /發(fā)送數(shù)據(jù)r2 = sendFlagr2 = 0 x0001sendFlag = r2 r1 = SendDatar4 = sendNumr3 = UART_DATA_SIZECMP r4,r3/比較發(fā)送是否結(jié)束JE exit_INT/結(jié)束發(fā)送r1 = r1+r4/繼續(xù)發(fā)送r1 = r1 /取發(fā)送數(shù)據(jù)r2 = sendFlag JZ Send_Datar1 = r1 lsr 4/發(fā)送高8位r1 = r1 lsr 4 r4 += 1/發(fā)送計數(shù)
45、加1sendNum = r4Send_Data:P_UART_Data = r1 /發(fā)送數(shù)據(jù)GOTO exit_INT 接收中斷服務(wù)程序:UART_RECV_IRQ: r2 = recFlagr2 = 0 x0001 /接收標識取反recFlag = r2r4 = recNumr3 = UART_DATA_SIZECMP r3,r4 JE exit_INT /判接收結(jié)束r1 = P_UART_Data /接收沒結(jié)束,繼續(xù)接收r2 = recFlag JNZ Shift_Datar3 = r4 + RecData /保存高8 位 r3 = r1 GOTO exit_INTShift_Data:
46、/接收高8 位數(shù)r1 = r1 lsl 4r1 = r1 lsl 4r2 = recNumr3 = r2 + RecData /保存高8位r4 = r3r4 |= r1r3 = r4r2 += 1 /接收計數(shù)加1recNum = r2 exit_INT:POP r1,r5 FROM spINT IRQ,FIQRETI.ENDP 5.3.2 多中斷源應(yīng)用 1. 同中斷向量多中斷源的應(yīng)用 例9 IRQ6 中斷有兩個中斷源IRQ6_TMB1和IRQ6_TMB2,此處利用兩個中斷源控制四個發(fā)光二極管分別為1 s和0.5 s周期閃爍。 分析:IRQ6_TMB1時鐘源有多種選擇,如8 Hz、16 Hz、3
47、2 Hz、64 Hz等,可以選擇其中任一頻率做0.5 s定時,此處我們選擇64 Hz時鐘源。同樣,IRQ6_TMB2有128 Hz、256 Hz、512 Hz、1024 Hz時鐘源可供選擇,此處選擇128 Hz時鐘源。 硬件:IOA0IOA7接八個LED。主程序:利用IRQ6_TMB1使IOA0IOA3接的LED 1 s閃爍1次。IRQ6_TMB2使IOA4IOA7接的LED 0.5 s閃爍1次。多中斷源主程序流程圖如圖5.15所示,中斷服務(wù)程序流程圖如圖5.16所示。圖5.15 同中斷向量的多中斷源主程序流程圖 圖5.16 同中斷向量的多中斷源中斷服務(wù)程序流程圖 主程序:.define tm
48、b1clk_8Hz 0 x0000.define tmb1clk_16Hz 0 x0001.define tmb1clk_32Hz 0 x0002.define tmb1clk_64Hz 0 x0003.define tmb2clk_128Hz 0 x0000.define tmb2clk_256Hz 0 x0004.define tmb2clk_512Hz 0 x0008.define tmb2clk_1024Hz 0 x000C.define tmb1_clk tmb1clk_64Hz.define tmb2_clk tmb2clk_128Hz.define P_IOA_DATA 0 x7
49、000.define P_IOA_DIR 0 x7002.define P_IOA_ATTRI 0 x7003 .define P_IOB_DATA 0 x7005.define P_IOB_DIR 0 x7007.define P_IOB_ATTRI 0 x7008.define P_INT_CTRL 0 x7010.define P_INT_CLEAR 0 x7011.define P_Timebase_setup 0 x700E.define P_Timebase_clear 0 x700F.RAM.VAR TIME1.VAR TIME2.CODE.PUBLIC _main _main:
50、INT OFFr1=0 xFFFF /IOA口為輸出口P_IOA_ATTRI=r1P_IOA_DIR=r1r1=0 x0000P_IOA_DATA=r1r1=0 xFFFF; /IOB口為輸出口P_IOB_ATTRI=r1P_IOB_DIR=r1r1=0 x0000P_IOB_DATA=r1 r1=tmb1_clk/TMB1選64 Hz,TMB2選128 Hzr1|=tmb2_clk/0000H或0003H,此時 R1的值為 0003HP_Timebase_setup=r1r1=0 x0003 /允許IRQ6_TMB1 和IRQ6_TMB2中斷P_INT_CTRL=r1R1=0 x0000TI
51、ME1=r1TIME2=r1INT IRQloop:NOP /等待中斷NOPJMP loop IRQ6中斷服務(wù)程序:.TEXT .PUBLIC _IRQ6 _IRQ6:PUSH r1,r5 TO sp /保護現(xiàn)場r1=0 x0001TEST r1,P_INT_CTRL /判斷IRQ6_TMB2 的中斷JNZ l_irq6_tmb2 /轉(zhuǎn)至IRQ6_TMB2中斷服務(wù)程序l_irq6_tmb1: /否,則進入IRQ6_TMB1中斷服務(wù)程序r2 = TIME1r2 += 0 x0001TIME1 = R2CMP r2,64 /比較1 s JBE LED1_OFF /小于等于則LED滅r1=P_IOA
52、_DATAr1=0 x000F /大于則LED亮P_IOA_DATA=r1CMP r2,128 /比較JBE LED1_RET /小于等于則LED繼續(xù)亮r2=0 x0000 /否則TIME1單元清零,返回中斷TIME1=R2JMP LED1_RETLED1_OFF: r1=P_IOA_DATA r1&=0 x00F0 P_IOA_DATA=r1 LED1_RET: /清除IRQ6_TMB1中斷標志位 r1=0 x0002P_INT_CLEAR=r1POP r1,r5 FROM sp RETIl_irq6_tmb2:r2=TIME2r2+=0 x0001TIME2=R2CMP r2,64 /比較
53、0.5 sJBE LED2_OFF /小于等于則LED滅 r1=P_IOA_DATAr1=0 x00F0 /大于則LED亮P_IOA_DATA=r1CMP r2,128/比較1 sJBE LED2_RET /小于等于則LED繼續(xù)亮r2=0 x0000 /否則TIME2單元清零TIME2=R2JMP LED2_RET LED2_OFF: r1=P_IOA_DATAr1&=0 x000FP_IOA_DATA=r1LED2_RET:r1=0 x0001/清除IRQ6_TMB1中斷標志位P_INT_CLEAR=r1POP r1,r5 FROM spRETI 2. 不同中斷入口的多中斷源應(yīng)用例10 采用不同中斷入口的中斷源控制八個發(fā)光二極管分別為1 s和0.5 s閃爍。分析:使用IRQ2中的定時器B定時0.5 s,利用IRQ4 中的IRQ_1 kHz中斷定時1 s。硬件:IOA0IOA7接八個LED,IOB0IOB7接八個LED。 主程序:利用定時B定時0.5 s使B口的LED閃爍,利用時基信號1024 Hz產(chǎn)生中斷1 s,使A口LED閃爍。不同中斷入口的多中斷源的主程序流程圖如圖5.17所示,中斷服務(wù)程序流程圖如圖5.18和圖5.19所示。 圖5.17 主程序流程圖 圖5.18 定時器B中斷服務(wù)程序流
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2022年小學(xué)教師資格考試《綜合素質(zhì)》能力提升試題D卷-附答案
- 《小小工程師》2024課件新變化
- 2024年夢想高地:《理想的翅膀》課件助力成長
- 全面升級的2024版辦公自動化培訓(xùn)課件:助力職場發(fā)展
- 2024年考研復(fù)試分數(shù)線及錄取趨勢
- 2024年全新教學(xué)體驗:故宮課件制作工作坊
- 2024年幼兒園《詠鵝》詩朗誦活動策劃案
- 江蘇專用2024高考政治一輪復(fù)習(xí)高考特訓(xùn)9探究開放類主觀題專項突破含解析
- 2024秋三年級數(shù)學(xué)上冊第七單元分數(shù)的初步認識一1認識幾分之一學(xué)案蘇教版
- 2024-2025學(xué)年高中歷史專題八19世紀以來的文學(xué)藝術(shù)8.2碰撞與沖突課時分層作業(yè)含解析人民版必修3
- 第四講夏商周考古
- 微機原理與接口技術(shù)8259A練習(xí)題及答案
- 正方體的11種展開圖
- 第15章《分式》教材分析課件(32張)
- 商鋪裝修工程施工方案.
- 西門子RWD68說明書
- 形式發(fā)票樣本(Proforma Invoice)
- 醫(yī)院車輛加油卡管理制度
- 數(shù)獨題目高級50題(后附答案)【最新】
- 問題線索辦理呈批表
- 學(xué)、練、評一體化課堂模式下賽的兩個問題與對策
評論
0/150
提交評論