ARM_Cortex-M3內(nèi)核結(jié)構(gòu)_第1頁(yè)
ARM_Cortex-M3內(nèi)核結(jié)構(gòu)_第2頁(yè)
ARM_Cortex-M3內(nèi)核結(jié)構(gòu)_第3頁(yè)
ARM_Cortex-M3內(nèi)核結(jié)構(gòu)_第4頁(yè)
ARM_Cortex-M3內(nèi)核結(jié)構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ARMCortex-M3內(nèi)核結(jié)構(gòu)2.1ARMCortex-M3處理器簡(jiǎn)介概述ARM公司成立于上個(gè)世紀(jì)九十年代初,致力于處理器內(nèi)核研究,ARM即AdvancedRISCMachines的縮寫,ARM公司本身不生產(chǎn)芯片,只設(shè)計(jì)內(nèi)核,靠轉(zhuǎn)讓設(shè)計(jì)許可,由合作伙伴公司來(lái)生產(chǎn)各具特色的芯片。這種運(yùn)行模式運(yùn)營(yíng)的成果受到全球半導(dǎo)公司以及用戶的青睞。目前ARM體系結(jié)構(gòu)的處理器內(nèi)核有:ARM7TDMI、ARM9TDMI、ARM10TDMI、ARM11以及Cortex等。2005年ARM推出的ARMCortex系列內(nèi)核,分別為:A系列、R系列和M系列,其中A系列是針對(duì)可以運(yùn)行復(fù)雜操作系統(tǒng)(Linux、Windows

2、CE、Symbian等)的處理器;R系列是主要針對(duì)處理實(shí)時(shí)性要求較高的處理器(汽車電子、網(wǎng)絡(luò)、影像系統(tǒng));M系列又叫微控制器,對(duì)開發(fā)費(fèi)用敏感,對(duì)性能要求較高的場(chǎng)合。Cortex-M系列目前的產(chǎn)品有M0、M1、M3,其中M1用在FPGA中。Cortex-M系列對(duì)微控制器和低成本應(yīng)用提供優(yōu)化,具有低成本、低功耗和高性能的特點(diǎn),能夠滿足微控制器設(shè)計(jì)師進(jìn)行創(chuàng)新設(shè)計(jì)的需求。其中,ARMCortex-M3處理器的性能是ARM7的兩倍,而功耗卻只有ARM7的1/3,適用于眾多高性能、極其低成本需求的嵌入式應(yīng)用,如微控制器、汽車系統(tǒng)、大型家用電器、網(wǎng)絡(luò)裝置等,ARMCortex-M3提供了32位微控制器市場(chǎng)前

3、所未有的優(yōu)勢(shì)。Cortex-M3內(nèi)核,內(nèi)部的數(shù)據(jù)路徑為32位,寄存器為32位,存儲(chǔ)器接口也是32位。Cortex-M3采用了哈佛結(jié)構(gòu),擁有獨(dú)立的指令總線和數(shù)據(jù)總線,可以讓取指與數(shù)據(jù)訪問(wèn)分開進(jìn)行。Cortex-M3還提供一個(gè)可選的MPU,對(duì)存儲(chǔ)器進(jìn)行保護(hù),而且在需要的情況下也可以使用外部的cache。另外在Cortex-M3中,存儲(chǔ)器支持小端模式和大端存儲(chǔ)格式。Cortex-M3內(nèi)部還附贈(zèng)了很多調(diào)試組件,用于在硬件水平上支持調(diào)試操作,如指令斷點(diǎn),數(shù)據(jù)觀察點(diǎn)等。另外,為支持更高級(jí)的調(diào)試,還有其它可選組件,包括指令跟蹤和多種類型的調(diào)試接口。內(nèi)核結(jié)構(gòu)組成及功能描述Cortex-M3微控制器內(nèi)核包括處理

4、核心和許多的組件,目的是用于系統(tǒng)管理和調(diào)試支持。如圖為Cortex-M3內(nèi)核方框圖。NMI中斷中斷號(hào)239:0Cortex-M3SLEEPINGSLEEPDEEPJ SW-DP JTAG-DPNVICSysTickAHB-API-code 總線總線矩陣Flash#LRP-1盾石,睡眠調(diào)試CM3核觸發(fā)指令數(shù)據(jù)MPUDWTFPB專用外設(shè)篇第(內(nèi)部)總線矩陛ITAPB-T D-code 總線w系統(tǒng)總線系細(xì)、線(AHB)靜態(tài)RAM外部RAM外部卜設(shè)總有I/O外部RAMSRAM -fflr-圖Cortex-M3內(nèi)核方框圖ETM專用外設(shè)總線-上ROM 衣AHB tgPB總線UARTPWMTimer1.處理

5、器內(nèi)核Cortex-M3處理器內(nèi)核采用ARMv7-M架構(gòu),其主要特性如下:Thumb-2指令集架構(gòu)(ISA)的子集,包含所有基本的16位和32位Thumb-2指令;哈佛處理器架構(gòu),在加載/存儲(chǔ)數(shù)據(jù)的同時(shí)能夠執(zhí)行指令取指;帶分支預(yù)測(cè)的三級(jí)流水線;32位單周期乘法;硬件除法;Thumb狀態(tài)和調(diào)試狀態(tài);處理模式和線程模式;ISR的低延遲進(jìn)入和退出;可中斷-可繼續(xù)(interruptible-continued)的LDM/STM、PUSH/PO桂支持ARMv6類型BE8/LE支持ARMv6非對(duì)齊訪問(wèn)。(嵌套向量中斷控制器)NVIC與處理器內(nèi)核是緊密耦合的,這樣可實(shí)現(xiàn)快速、低延遲的異常處理。在Corte

6、x-M微控制器此功能非常強(qiáng)大。3.總線矩陣總線矩陣用來(lái)將處理器和調(diào)試接口與外部總線相連。處理器包含4個(gè)總線接口:ICode存儲(chǔ)器接口:從Code存儲(chǔ)器空間(0x00000006x1FFFFFFF的取指者B在這條32位AHBLite總線上執(zhí)行。DCode存儲(chǔ)器接口:對(duì)Code存儲(chǔ)器空間(0x0000000Kx1FFFFFFF進(jìn)行數(shù)據(jù)和調(diào)試訪問(wèn)都在這條32位AHBLite總線上執(zhí)行。系統(tǒng)接口:對(duì)系統(tǒng)空間(0x-0xDFFFFFFF進(jìn)行取指、數(shù)據(jù)和調(diào)試訪問(wèn)都在這條32位AHBLite總線上執(zhí)行。外部專用外設(shè)總線(PPB):對(duì)外部PPB空間(0xE00400000xE00FFFFF進(jìn)行數(shù)據(jù)和調(diào)試訪問(wèn)都

7、在這條32位APB總線(AMBA)上執(zhí)行。跟蹤端口接口單元(TPIU)和廠商特定的外圍器件都在這條總線上。注:處理器包含一條內(nèi)部專用外設(shè)總線,用來(lái)訪問(wèn)嵌套向量中斷控制器(NVIC)、數(shù)據(jù)觀察點(diǎn)和觸發(fā)(DWT)、Flash修補(bǔ)和斷點(diǎn)(FPB),以及存儲(chǔ)器保護(hù)單元(MPU)。FPB單元實(shí)現(xiàn)硬件斷點(diǎn)以及從代碼空間到系統(tǒng)空間的修補(bǔ)訪問(wèn),F(xiàn)PB有8個(gè)比較器。數(shù)據(jù)觀察點(diǎn)和跟蹤,調(diào)試功能部件。ITM是一個(gè)應(yīng)用導(dǎo)向(applicationdriven)的跟蹤源,支持對(duì)應(yīng)用事件的跟蹤和printf類型的調(diào)試。存儲(chǔ)器保護(hù)單元(MPU)是用來(lái)保護(hù)存儲(chǔ)器的一個(gè)元件。處理器支持標(biāo)準(zhǔn)的ARMv7受保護(hù)的存儲(chǔ)器系統(tǒng)結(jié)構(gòu)(P

8、MSA)模型。如果希望向處理器提供存儲(chǔ)器保護(hù),則可以使用可選的MPU;MPU對(duì)訪問(wèn)允許和存儲(chǔ)器屬性進(jìn)行檢驗(yàn)。它包含8個(gè)區(qū)和一個(gè)可選的執(zhí)行默認(rèn)存儲(chǔ)器映射訪問(wèn)屬性的背景區(qū)。ETM支持指令跟蹤的低成本跟蹤宏單元。TPIU用作來(lái)自ITM和ETM(如果存在)的Cortex-M3內(nèi)核跟蹤數(shù)據(jù)與片外跟蹤端口分析儀之間的橋接。JTAG-DPCortex-M3處理器可配置為具有SW-DP或JTAG-DP調(diào)試端口的接口,或兩者都有。這兩個(gè)調(diào)試端供對(duì)系統(tǒng)中包括處理器寄存器在內(nèi)的所有寄存器和存儲(chǔ)器的調(diào)試訪問(wèn)。內(nèi)核寄存器組織如圖所示,Cortex_M3內(nèi)核寄存器分為16個(gè)通用寄存器R0R15和7個(gè)特殊功能寄存器。狀態(tài)寄

9、存器低 寄 存 器高 寄 存 器通 用 寄 存 器特 殊 功 能寄存器中斷屏蔽J控制寄存器圖寄存器組織圖通用寄存器R0-R15R0R12寄存器:是真正意義上的通用。在處理器運(yùn)行過(guò)程中,作數(shù)據(jù)的寄存。R13為堆棧指針寄存器:堆棧指針是用于訪問(wèn)堆棧,也即系統(tǒng)的RAM區(qū)。Cortex_M3中采用了兩個(gè)堆棧指針:主堆棧指針(MSP)和進(jìn)程堆棧指針(PSP,R13在任何時(shí)刻只能是其中一個(gè),默認(rèn)情況為MSP,可以通過(guò)控制寄存器(CONTORL來(lái)改變。Cortex_M3中堆棧方向是向低地址方向增長(zhǎng),為滿堆棧機(jī)制。堆棧操作是通過(guò)PUSH口POP來(lái)完成操作的。例如MSPi前指針指向:0x2000_000C;R0

10、=0x00000000。執(zhí)行:PUSHR0此時(shí)MSP旨向:0x2000_0008執(zhí)行示意如圖所示。MSP已使用n0x2000_0008已使用已使用已使用上次壓入的數(shù)據(jù)已使用未用0x00000000未用MSP-*未用RAMRAM0x2000 000C堆棧操作示意圖R14程序連接寄存器(LR):在執(zhí)行分支(B)和鏈接(BL)指令或帶有交換分支(BXO和鏈接指令(BLX)時(shí),PC的返回地址自動(dòng)保存進(jìn)LR比如在子程序調(diào)用時(shí)用保存子程序的返回地址。LR也用于異常返回,但是在這里保存的是返回后的狀態(tài),不是返回的地址,異常返回是通過(guò)硬件自動(dòng)出棧彈出之前壓入的PC完成的。R15程序計(jì)數(shù)器(PC):是程序運(yùn)行的

11、基礎(chǔ),具有自加的功能。該寄存器的位0始終為0,因此,指令始終與字或半字邊界對(duì)齊。特殊功能寄存器特殊功能寄存器分為程序狀態(tài)寄存器、中斷屏蔽寄存器和控制寄存器三類。xPSR程序狀態(tài)寄存器:系統(tǒng)級(jí)的處理器狀態(tài)可分為3類,應(yīng)用狀態(tài)寄存器(APSR、中斷狀態(tài)寄存器(IPSR、執(zhí)行狀態(tài)寄存器(EPSR,可組合起來(lái)構(gòu)成一個(gè)32位的寄存器,統(tǒng)稱xPSR表xPSRW存器寄存器名位313029282726:252423:2019:1615:10987654:0APSRNZCVQIPSR中斷編號(hào)EPSRICI/ITTICI/ITxPS商存器的各位的功能如表表xPSRW存器各位功能位名稱定義31N負(fù)數(shù)或小于標(biāo)志:1:

12、結(jié)果為負(fù)數(shù)或小于;0結(jié)果為正數(shù)或大于30Z零標(biāo)志:1:結(jié)果為0;0:結(jié)果為非029C進(jìn)位/借位標(biāo)志:1:進(jìn)位或借位;0沒(méi)有進(jìn)位或借位28V溢出標(biāo)志:1:溢出;0:沒(méi)有溢出27Q粘著飽和標(biāo)志:1:已飽和;0:沒(méi)有飽和26:2515:10ITIF-Then位。它們是if-Then指令的執(zhí)行狀態(tài)位。包含f-Then模塊的指令數(shù)目和它們的執(zhí)行條件24T用于指示處理器當(dāng)前是ARM狀態(tài)還是Thumb狀態(tài)15:12ICI可中斷-可繼續(xù)的指令位:如果在執(zhí)行LDM或STM操作時(shí)產(chǎn)生一次中斷,則LDM或STM操作暫停,該位來(lái)保存該操作中下一個(gè)寄存器操作數(shù)的編號(hào),在中斷響應(yīng)之后,處理器返回由該位指向的寄存器并恢復(fù)操

13、作。8:0ISR占先異常的編號(hào)中斷屏蔽寄存器:分為三組,分別是PRIMASKFAULTMASKBASEPRIPRIMAS四片上外設(shè)總中斷開關(guān),該寄存器只有位0有效,當(dāng)該位為0是響應(yīng)所有外設(shè)中斷;當(dāng)該位為1時(shí)屏蔽所有片上外設(shè)中斷。FAULTMASK?存器管理系統(tǒng)錯(cuò)誤的總開關(guān),該寄存器中有位0有效,當(dāng)該位為0時(shí),響應(yīng)所有的異常;為1屏蔽所有的異常。BASEP就存器用來(lái)屏蔽優(yōu)先級(jí)等于和小于某一個(gè)中斷數(shù)值的寄存器??刂萍拇嫫鳎篊ONTROL兩個(gè)作用,其一用于定義處理器特權(quán)級(jí)別,其二用于選擇堆棧指針,如表所示。表CONTROL?存器位功能CONTROL1堆棧指針選擇0:選擇主堆棧指針MSP1:選擇進(jìn)程堆

14、棧指針PSPCONTROL00:特權(quán)級(jí)1:用戶級(jí)CONTROL0異常情況下,處理器總是處于特權(quán)模式,CONTROL啦總是為0;在線程模式情況下(非異常情況),處理器可以工作在特權(quán)級(jí)也可工作在用戶級(jí),該位可為0或1。特權(quán)級(jí)下所有的資源都可以訪問(wèn),而用戶級(jí)下被限制的資源不能訪問(wèn),比如MPU被限制的資源。CONTROL1為0時(shí),只使用MSP,此時(shí)用戶程序和異常共享同一個(gè)堆棧,處理器復(fù)位后默認(rèn)的也是該模式。為1時(shí),用戶應(yīng)用程序使用進(jìn)程堆棧PSP,而中斷任然得使用主堆棧MSB這種雙堆棧機(jī)制,特別適合在帶有OS(操作系統(tǒng))的環(huán)境下使用,只要OS內(nèi)核在特權(quán)級(jí)下執(zhí)行,而用戶應(yīng)用程序在用戶模式下執(zhí)行,就可很好的

15、將代碼隔離互不影響。處理器操作模式ARMCortex-M3支持2個(gè)模式和兩個(gè)特權(quán)等級(jí)。如圖所示,在嵌入式系統(tǒng)應(yīng)用程序中,程序代碼涉及異常服務(wù)程序代碼和非異常服務(wù)程序代碼,這些代碼可以工作在處理器特權(quán)級(jí)也可以工作在用戶級(jí)級(jí),但有區(qū)別。當(dāng)處理器處在線程模式下時(shí),既可以使用特權(quán)級(jí),也可以使用用戶級(jí);另一方面,handler模式總是特權(quán)級(jí)的。在復(fù)位后,處理器進(jìn)入線程模式+特權(quán)級(jí)。異常handler的代碼主應(yīng)用程序的代碼Handler 模式錯(cuò)誤的用法線程模式線程模式特權(quán)級(jí)用戶級(jí)圖操作模式和特權(quán)等級(jí)在線程模式+用戶級(jí)下,對(duì)系統(tǒng)控制空間(SCS0XE000E0000xE000EFFF包括NVIC、SysTi

16、ckMPU以及代碼調(diào)試控制所用的寄存器)的訪問(wèn)將被禁止。除此之外,還禁止使用MRS/MSR訪問(wèn),除了APSM外的特殊功能寄存器。如果操作,則對(duì)于訪問(wèn)特殊功能寄存器的,訪問(wèn)操作被忽略;而對(duì)于訪問(wèn)SCS空間的,將產(chǎn)生錯(cuò)誤。在特權(quán)級(jí)下不管是任何原因產(chǎn)生了任何異常,處理器都將以特權(quán)級(jí)來(lái)運(yùn)行其服務(wù)例程,異常返回后,系統(tǒng)將回到產(chǎn)生異常時(shí)所處的級(jí)別,同時(shí)特權(quán)級(jí)也可通過(guò)置位CONTROL0來(lái)進(jìn)入用戶級(jí)。用戶級(jí)下的代碼不能再試圖修改CONTROL0琛回到特權(quán)級(jí)。它必須通過(guò)一個(gè)異常handler,來(lái)修改CONTROL0才能在返回到線程模式后進(jìn)入特權(quán)級(jí)。如圖所示。特權(quán)級(jí)handlerCONTROL0=0圖處理器模式

17、轉(zhuǎn)換圖把代碼按特權(quán)級(jí)和用戶級(jí)分開處理,有利于使Cortex-M3的架構(gòu)更加穩(wěn)定可靠。例如,當(dāng)某個(gè)用戶程序代碼出問(wèn)題時(shí),可防止處理器對(duì)系統(tǒng)造成更大的危害,因?yàn)橛脩艏?jí)的代碼是禁止寫特殊功能寄存器和NVIC中寄存器的。另外,如果還配有MPU,保護(hù)力度就更大,甚至可以阻止用戶代碼訪問(wèn)不屬于它的內(nèi)存區(qū)域。在引入了嵌入式實(shí)時(shí)操作系統(tǒng)中,為了避免系統(tǒng)堆棧因應(yīng)用程序的錯(cuò)誤使用而毀壞,我們可以給應(yīng)用程序?qū)iT配一個(gè)堆棧,不讓它共享操作系統(tǒng)內(nèi)核的堆棧。在這個(gè)管理制度下,運(yùn)行在線程模式的用戶代碼使用PSP而異常服務(wù)例程則使用MSP。這兩個(gè)堆棧指針的切換是智能全自動(dòng)的,在異常服務(wù)的始末由Cortex-M3硬件處理。如前

18、所述,特權(quán)等級(jí)和堆棧指針的選擇均由CONTRO演責(zé)。當(dāng)CONTROL0=Q在異常處理的始末,只發(fā)生了處理器模式的轉(zhuǎn)換,如圖所示。若CONTROL0=1(線程模式+用戶級(jí)),則在中斷響應(yīng)的始末,處理器模式和特權(quán)等級(jí)都要發(fā)生變化,如圖所示。CONTROL0只有在特權(quán)級(jí)下才能訪問(wèn)。用戶級(jí)的程序如想進(jìn)入特權(quán)級(jí),通常都是使用一條系統(tǒng)服務(wù)呼叫指令(SVC”來(lái)觸發(fā)“SV異常”,該異常的服務(wù)例程可以視具體情況而修改CONTROL0圖中斷前后的狀態(tài)轉(zhuǎn)換圖中斷前后的狀態(tài)轉(zhuǎn)換+特權(quán)等級(jí)切換存儲(chǔ)器系統(tǒng)存儲(chǔ)器映射Cortex-M3采用了固定的存儲(chǔ)映射結(jié)構(gòu),如圖所示。Cortex-M3的地址空間是4GB,程序可以在代碼區(qū)

19、,內(nèi)部SRAM區(qū)以及外部RAM區(qū)中執(zhí)行。但是因?yàn)橹噶羁偩€與數(shù)據(jù)總線是分開的,最理想的是把程序放到代碼區(qū),從而使取指和數(shù)據(jù)訪問(wèn)各自使用己的總線。內(nèi)部SRAM區(qū)的大小是512MB,用于讓芯片制造商連接片上的SRAM,這個(gè)區(qū)通過(guò)系統(tǒng)總線來(lái)訪問(wèn)。在這個(gè)區(qū)的下部,有一個(gè)1MB的區(qū)間,被稱為位帶區(qū)”。該位帶區(qū)還有一個(gè)對(duì)應(yīng)的32MB的位帶別名(alias)區(qū)”,容納了8M個(gè)位變量”(對(duì)比8051的只有128個(gè)位變量),位帶區(qū)對(duì)應(yīng)的是最低的1MB地址范圍,而位帶別名區(qū)里面的每個(gè)字對(duì)應(yīng)位帶區(qū)的一個(gè)比特。位帶操作只適用于數(shù)據(jù)訪問(wèn),不適用于取指。通過(guò)位帶的功能,可以把多個(gè)布爾型數(shù)據(jù)打包在單一的字中,卻依然可以從位帶

20、別名區(qū)中,像訪問(wèn)普通內(nèi)存一樣地使用它們。位帶別名區(qū)中的訪問(wèn)操作是原子的,消滅了傳統(tǒng)的讀一改一寫”三步。片上外設(shè)對(duì)應(yīng)512MB的空間,芯片上所有與外圍設(shè)備相關(guān)的寄存器都位于該區(qū)域。這個(gè)區(qū)中也有一條32MB的位帶別名,以便于快捷地訪問(wèn)外設(shè)寄存器,用法與內(nèi)部SRAM區(qū)中的位帶相同。例如,可以方便地訪問(wèn)各種控制位和狀態(tài)位。要注意的是,外設(shè)區(qū)內(nèi)不允許執(zhí)行指令。通常半導(dǎo)體廠商就是修改此區(qū)域的片上外設(shè),來(lái)達(dá)到各具特色的、個(gè)性化的設(shè)備。還有兩個(gè)1GBW范圍,分別用于連接外部RAM和外部設(shè)備,它們之中沒(méi)有位帶。兩者的區(qū)別在于外部RAM區(qū)允許執(zhí)行指令,而外部設(shè)備區(qū)則不允許。最后還剩下的隱秘地帶,包括了系統(tǒng)級(jí)組件,

21、內(nèi)部私有外設(shè)總線,外部私有外設(shè)總線,以及由提供者定義的系統(tǒng)外設(shè)。私有外設(shè)總線有兩條:AH用有外設(shè)總線,只用于CM3內(nèi)部的AH的卜設(shè),它們是:NVIC,FPB,DW和ITM。AP幽有外設(shè)總線,既用于CM3內(nèi)部的AP瞰備,也用于外部設(shè)備(這里的外部”是對(duì)內(nèi)核而言)。Cortex-M3允許器件制造商再添加一些片上AP的卜設(shè)至UAP爾有總線上,它們通過(guò)AP噴口來(lái)訪問(wèn)。NVlC/f處的區(qū)域叫做系統(tǒng)控制空間(SCS”,在SCSI的除了NVIC7卜,還有SysTick、MPU以及代碼調(diào)試控制所用的寄存器。最后,未用的提供商指定區(qū)也通過(guò)系統(tǒng)總線來(lái)訪問(wèn),但是不允許在其中執(zhí)行指令。位帶操作在 間中。 帶別名Cot

22、ex-M3存儲(chǔ)器映射中包括兩個(gè)位操作區(qū)。分別位于SRAM和片上外設(shè)存儲(chǔ)區(qū)的最低1MB空這兩個(gè)位帶中的地址除了可以像普通的RAM一樣使用外,它們還都有自己的位帶別名區(qū)”,位區(qū)把每個(gè)比特膨脹成一個(gè)32位的字形成位地址。當(dāng)你通過(guò)位帶別名區(qū)訪問(wèn)這些字時(shí),就可以達(dá)位操作對(duì)應(yīng)關(guān)系圖到訪問(wèn)原始比特的目的,其對(duì)應(yīng)關(guān)系如圖所。位地址與位別名對(duì)應(yīng)關(guān)系統(tǒng)如下:對(duì)于SRAM位帶區(qū)的某個(gè)位:Aliasaddr0x(A0x)8n)40x(A0x)32n4對(duì)于片上外設(shè)位帶區(qū)的某個(gè)位:Aliasaddr0x(A0x)8n)40x(A0x)32n4在上述表達(dá)式中,A表示要操作的位所在的字節(jié)地址,n(0wnw)7表示位序號(hào)。)x

23、23FFFFFC0x23FFFFF0x23FFFFF40x?3FFFFF0x23FFFFEC0x23FFFFE80x23FFFFE4x23FFFFE0位帶別名區(qū)(共32MB),x2200001c(x0x0x0x2200000C0x0x0x舉例:將地址0x的第2位置1。通過(guò)上述計(jì)算關(guān)系,可計(jì)算出位帶別名為0x。如程序清單所示。程序清單SRAM位操作實(shí)例LDRR0,=0xLDRR1,=0x01STRR1,R0將片上外設(shè)I/O端口的A口的第0位(也即PORTA0)為輸出,其A口的方向寄存器地址為0x,設(shè)置1作為輸出,可根據(jù)上述關(guān)系計(jì)算出位帶別名為0x。如程序清單所示。程序清單片上外設(shè)位操作實(shí)例LDR

24、R0=0xLDRR1,=0x01STRR1,R0注:采用大端格式時(shí),對(duì)位邦定別名區(qū)的訪問(wèn)必須以字節(jié)方式,否則訪問(wèn)不可預(yù)知。異常ARMCortex-M3中異常涉及異常的類型、優(yōu)先級(jí)、向量表等,本節(jié)并以Luminary系列微控制器為例說(shuō)明異常的具體行為。異常類型在Cortex-M3中有一個(gè)與內(nèi)核緊耦合部件叫嵌套向量中斷控制器(NVIC,NestedVectoredInterruptController),定義了16種系統(tǒng)異常和240路外設(shè)中斷。通常芯片設(shè)計(jì)者可自由設(shè)計(jì)片上外設(shè),因此具體的片上外設(shè)中斷都不會(huì)用到多達(dá)240路。如表所示系統(tǒng)異常類型,表所示為外設(shè)中斷類型。Cortex-M3中目前只有11

25、種系統(tǒng)異??捎梅謩e是:系統(tǒng)復(fù)位、NMI(不可屏蔽中斷)、硬件故障、存儲(chǔ)器管理、總線故障、用法故障、SVCall(軟件中斷)、調(diào)試監(jiān)視器中斷、PendSV(系統(tǒng)服務(wù)請(qǐng)求卜SysTick(24位定時(shí)器中斷)。240路外設(shè)中斷,是指片上外設(shè)的各模塊,比如I/O口、UART通信接口、SSI總線接口等所需的中斷。表異常類型編號(hào)類型優(yōu)先級(jí)描述0-復(fù)位時(shí)載入向量表的第一項(xiàng)作為主堆棧棧頂?shù)刂贰?復(fù)位-3復(fù)位。2NMI-2不可屏蔽中斷(來(lái)自外部NMI輸入腳)。3硬故障-1當(dāng)故障由于優(yōu)先級(jí)或者是可配置的故障處理程序被禁止的原因而無(wú)法激活時(shí),所有類型故障都會(huì)以硬故障的方式激活。4存儲(chǔ)器管理可編程MPU不匹配,包括訪

26、問(wèn)沖突和不匹配。5總線故障可編程預(yù)取指故障、存儲(chǔ)器訪問(wèn)故障和其它地址/存儲(chǔ)器相關(guān)的故障。6用法故障可編程由于程序錯(cuò)誤導(dǎo)致的異常,通常是使用一條無(wú)效指令,或都是非法的狀態(tài)轉(zhuǎn)換。7-10保留-保留11SVCall可編程執(zhí)行SVC旨令的系統(tǒng)服務(wù)調(diào)用。12調(diào)試監(jiān)視器可編程調(diào)試監(jiān)視器(斷點(diǎn),數(shù)據(jù)觀察點(diǎn),或是外部調(diào)試請(qǐng)求)13保留-14PendSV可編程系統(tǒng)服務(wù)的可觸發(fā)(pendable)請(qǐng)求。15SysTick可編程系統(tǒng)節(jié)拍定時(shí)器。表中斷類型編號(hào)類型優(yōu)先級(jí)描述16IRQ#0可編程外設(shè)中斷#017IRQ#1可編程外設(shè)中斷#1,255IRQ#239可編程外設(shè)中斷#239優(yōu)先級(jí)Cortex-M3的異常功能非常

27、強(qiáng)大,機(jī)制非常靈活,異??梢酝ㄟ^(guò)占先、末尾連鎖和遲來(lái)等處理來(lái)降低中斷的延遲。優(yōu)先級(jí)決定了處理器何時(shí)以及怎樣處理異常。Cortex-M3支持3個(gè)固定的高優(yōu)先級(jí)和多達(dá)256級(jí)的可編程優(yōu)先級(jí),并且支持128級(jí)搶占,絕大多數(shù)芯片都會(huì)精簡(jiǎn)設(shè)計(jì),實(shí)際中支持的優(yōu)先級(jí)數(shù)會(huì)更少,如8級(jí)、16級(jí)、32級(jí)等,通常的做法是裁掉表達(dá)優(yōu)先級(jí)的幾個(gè)低端有效位(防止優(yōu)先級(jí)反車專),以減少優(yōu)先級(jí)的級(jí)數(shù)。比如Luminary的芯片采用8級(jí)優(yōu)先級(jí)。Cortex-M3中NVIC支持由軟件指定的可配置的優(yōu)先級(jí)(稱為軟件優(yōu)先級(jí)),其寄存器地址為:0xE000_E400-0xE000_E4EF通過(guò)對(duì)中斷優(yōu)先級(jí)寄存器的8位PRI_N區(qū)執(zhí)行寫

28、操作,來(lái)將中斷的優(yōu)先級(jí)指定為0-255。硬件優(yōu)級(jí)隨著中斷中的增加而降低。0優(yōu)先級(jí)最高,255優(yōu)先級(jí)最低。指定軟件優(yōu)先級(jí)后,硬件優(yōu)先級(jí)無(wú)效。例如:如果將INTISR0指定為優(yōu)先級(jí)1,INTISR31脂定為優(yōu)先級(jí)0,則INTISR0的優(yōu)先級(jí)比INTISR31低。為了對(duì)具有大量中斷的系統(tǒng)加強(qiáng)優(yōu)先級(jí)控制,Cortex-M3支持優(yōu)先級(jí)分組,通過(guò)NVIC控制,設(shè)置為占先優(yōu)先級(jí)和次優(yōu)先級(jí)??赏ㄟ^(guò)對(duì)應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR地址為:0xE000_ED0。的10:8位進(jìn)行設(shè)置。如果有多個(gè)激活異常共用相同的組優(yōu)先級(jí),則使用次優(yōu)先級(jí)區(qū)來(lái)決定同組中的異常優(yōu)先級(jí),這就是同組內(nèi)的次優(yōu)先級(jí)。如表應(yīng)用程序中斷及

29、復(fù)位控制寄存器,表為占先優(yōu)先級(jí)和次優(yōu)級(jí)的關(guān)系。表2.6應(yīng)用程序中斷及復(fù)位控制寄存器(AIRCR地址:0xE000ED00位段名稱類型復(fù)位值描述31:16VECTKEYRW-訪問(wèn)鑰匙:任何對(duì)該寄存器的寫操作,都必須同時(shí)把0x05FAf入此段,否則寫操作被忽略。若讀取此半字,則讀回值為0xFA0515ENDIANESSR-指示端設(shè)置。1:大端,0:小端。10:8PRIGROUPR/W0優(yōu)先級(jí)分組2SYSRESETREQW-請(qǐng)求芯片控制邏輯產(chǎn)生一次復(fù)位1VECTCLRACTIVEW-清零所有異常的活動(dòng)狀態(tài)信息。通常只在調(diào)試時(shí)用,或都在OS從錯(cuò)誤中恢復(fù)時(shí)用。0VECTRESETW-復(fù)位Coretex-

30、M3微控制器內(nèi)核。表?yè)屨純?yōu)先級(jí)和次優(yōu)先級(jí)分組位置的關(guān)系分組位置表達(dá)搶占優(yōu)先級(jí)的位段表達(dá)亞優(yōu)先的位段07:10:017:21:027:32:037:43:047:54:057:65:067:76:07無(wú)7:0所有位注:表顯示了利用優(yōu)先級(jí)的8個(gè)位來(lái)配置處理器優(yōu)先級(jí)。如果使用小于8的位來(lái)配置處理器的優(yōu)先級(jí),則寄存器的低位始終為0,例如,如果使用3個(gè)位來(lái)配置優(yōu)先級(jí),則PRI_N7:5用來(lái)配置優(yōu)先級(jí),而PRI_N4:0為4bOOOOo中斷向量表當(dāng)發(fā)生了異常并且要響應(yīng)它時(shí),Cortex-M3需要定位其服務(wù)例程的入口地址。這此入口地址存儲(chǔ)在所謂異常向量表”中。缺省情況下,Cortex-M3認(rèn)為該表位于零地址

31、處,且各向量占用4字節(jié)。因此每個(gè)表項(xiàng)占用4字節(jié),復(fù)位后的向量表如表所列。表復(fù)位后向量表地址異常編號(hào)值(32位整數(shù))0x0000_0000-MSP的初始值0x0000_00041復(fù)位向量(PC始值)0x0000_00082NMI服務(wù)例程的入口地址0x0000_000C3硬fault服務(wù)例程的入口地址其它異常服務(wù)例程的入口地址向量表中的第1個(gè)字為指向堆棧棧頂?shù)闹羔?,?fù)位時(shí)內(nèi)核讀取該地址的數(shù)據(jù)設(shè)置主堆棧。向量表的基地址可以通過(guò)NVIC中的向量偏移寄存器(0XE000ED08)來(lái)設(shè)置,如表所示。從表中可以看出,可以將異常向量表放在Code區(qū)也可以將其放在RAM區(qū),起始地址也可改變,起始地址是有要求的:

32、必須先求出系統(tǒng)中共有多少個(gè)向量,再把這個(gè)數(shù)字向上記到2的整次哥,而起始地址必須對(duì)齊到后者的邊界上。仞如,如果一共有32個(gè)中斷,則共有32+16(系統(tǒng)異常)=48個(gè)向量,向上記到2的整數(shù)次哥后值為64,因此向量表重定位的地址必須能被64X4=25喊除。表向量偏移量寄存器(0XE000ED08位段名稱類型復(fù)位值描述29TBLOFFR-向量表是在Code區(qū)(0),還是在RAM區(qū)(1)7-28TBLBASER/0向量表的起始地址W向量表中至少需要有4個(gè)值:棧頂?shù)刂?;?fù)位程序的位置;NMI異常的位置;硬故障的異常的位置。當(dāng)中斷使能時(shí),不管向量表的位置在哪,它指向所有使能屏蔽的異常。并且如果使用SVC旨令

33、,還需要指定SVCCallISRJ位置。異常的進(jìn)入與退由1 .異常進(jìn)入入棧:當(dāng)處理器發(fā)生異常時(shí),首先自動(dòng)把8個(gè)寄存器(xPSRPGLRR12、R3、R2、R1、R0)壓入棧,處理器自動(dòng)完成,在自動(dòng)入棧的過(guò)程中,把寄存器寫入棧的時(shí)間順序,并不是寫入空間相對(duì)應(yīng)的,但機(jī)器會(huì)保證正確的寄存器被保存到正確的位置,如圖所示,假設(shè)入棧,棧地址為No地址數(shù)據(jù)N-8N-4N-32N-28N-24N-20N-16N-1211f1r1F1f11_1FPCPSRR0R1R2R3R12LR時(shí)間內(nèi)部入棧示意圖取向量:發(fā)生異常,緊接著內(nèi)核將根據(jù)向量表找出正確的異常向量,然后在服務(wù)程序的入口處預(yù)取指,處理器將取指與取數(shù)據(jù)分別

34、能過(guò)總線控制,使入棧與取指這兩項(xiàng)工作能同時(shí)進(jìn)行,以便快速進(jìn)入中斷。更新寄存器:入棧和取向量操作完成之后,在執(zhí)行服務(wù)程序之前,還必須更新一系列寄存器。SR在入棧后會(huì)把堆棧指針(PSP或MSP)更新到新的位置。在執(zhí)彳T服務(wù)例程時(shí),將由MSP負(fù)責(zé)對(duì)堆棧的訪問(wèn)。PSR更新IPSR位段(地處PSR的最低部分)的值為新響應(yīng)的異常編號(hào)。PC:在取向量完成后,PC將指向服務(wù)例程的入口地址,LR在出入ISR的時(shí)候,LR的值將得到重新的詮釋,這種特殊的值稱為EXC_RETURN在異常進(jìn)入時(shí)由系統(tǒng)計(jì)算并賦給LR并在異常返回時(shí)使用它。以上是在響應(yīng)異常時(shí)通用寄存器及特殊功能寄存器的變化。另外在NVIC中,也會(huì)更新若干個(gè)

35、相關(guān)寄存器。2 .異常退出當(dāng)異常服務(wù)程序最后一條指令將進(jìn)入異常時(shí)的LR的值加載到PC中。該操作指示中斷服務(wù)結(jié)束,在從異常返回時(shí)處理器將執(zhí)行下列操作之一:如果激活異常的優(yōu)先級(jí)比所有被壓棧(等待處理)的異常的優(yōu)先級(jí)都高,則處理器會(huì)末尾連鎖到一個(gè)激活異常。如果沒(méi)有激活異常,或者如果被壓棧的異常的最高優(yōu)先級(jí)比激活異常的最高優(yōu)先級(jí)要高,則處理器返回到上一個(gè)被壓棧的中斷服務(wù)程序。如果沒(méi)有激活的中斷或被壓棧的異常,則處理器返回線程模式。在啟動(dòng)了中斷返回序列后,下述的處理就將進(jìn)行:出棧:先前壓入棧中的寄存器在這里恢復(fù)。內(nèi)部的出棧順序與入棧時(shí)的相對(duì)應(yīng),堆棧指針的值也改回先前的值。更新NVIC寄存器:伴隨著異常的

36、返回,它的活動(dòng)位也被硬件清除。對(duì)于外部中斷,倘若中斷輸入再次被置為有效,懸起位也將再次置位,新一次的中斷響應(yīng)序列也可隨之再次開始。異常返回值:異常返回值存放在LR中。這是一個(gè)高28位全為1的值,只有3:0的值有特殊含義,如表所示。當(dāng)異常服務(wù)例程把這個(gè)值送往PC時(shí),就會(huì)啟動(dòng)處理器的中斷返回序列。因?yàn)長(zhǎng)R的值是由Cortex-M3自動(dòng)設(shè)置的,所以只要沒(méi)有特殊需求,就不要改動(dòng)它。表EXC_RETUR隔位含義位段31:4EXC_RETURI標(biāo)識(shí):必須全為1。30=后回后進(jìn)入處理器模1=返回后進(jìn)入線程模式。20=從主堆棧中做出棧操作,返回后使用MSP1=從進(jìn)程堆棧中做出棧操作,返回使用PSR1保留,必須

37、為0。00=回ARM狀態(tài)1射回Thumb狀態(tài)。Cortex-M3中必須為1。因此,上述表格中EXC_RETURN勺值有三種情況:0xFFFF_FFF值回處理器模式;0xFFFF_FFF驅(qū)回線程模式,并使用主堆棧;0xFFFF_FFF亟回線程模式,并使用線程堆棧。例如系統(tǒng)中使用了PendSV異常,服務(wù)程序結(jié)束時(shí)由處理模式返回到線程模式前使用進(jìn)程堆棧,如程序清單所示。程序清單異常返回類型實(shí)例OSPendSV,;異常服務(wù)程序LDRLR,=0Xfffffffd;返回到線程模式進(jìn)程堆棧BXLRCortex-M3異常處理機(jī)制1 .末尾連鎖末尾連鎖能夠在兩個(gè)中斷之間沒(méi)有多余的狀態(tài)保存和恢復(fù)指令的情況下實(shí)現(xiàn)異

38、常背對(duì)背處理。如圖所示。在退出IS進(jìn)入另一個(gè)中斷時(shí),處理器省略了8個(gè)寄存器的出棧和入棧操作。如果當(dāng)前掛起中斷的優(yōu)先級(jí)比所有被壓棧的異常的優(yōu)先級(jí)都高。則處理器執(zhí)行末尾連鎖機(jī)制。如果掛起中斷的優(yōu)先級(jí)比被壓棧的異常的最高優(yōu)先級(jí)都高,則省略壓棧和出棧操作,處理器立即取出掛起的中斷向量。在退出前一個(gè)IS也后,開始執(zhí)行被末尾連鎖的ISR圖末尾連鎖示意圖2 .異常遲來(lái)在Cortex-M3中遲來(lái)中斷的意思是如果前一個(gè)ISR3E沒(méi)有進(jìn)入執(zhí)行階段,并且遲來(lái)中斷的優(yōu)先級(jí)比前一個(gè)中斷的優(yōu)先級(jí)要高,則遲來(lái)中斷能夠搶占前一個(gè)中斷。如圖所示。圖遲來(lái)異常示意圖IS電取操作。遲來(lái)中斷不保存狀,因?yàn)闋顟B(tài)保存已經(jīng)被 最響應(yīng)遲來(lái)中斷

39、時(shí)需執(zhí)行新的取向量地址和初的中斷執(zhí)行過(guò)了,因此不需要重復(fù)執(zhí)行。嵌套向量中斷控制器嵌套向量中斷控制器,簡(jiǎn)稱NVIC,完成對(duì)中斷的響應(yīng)。NVIC共支持1至240個(gè)外部中斷輸入(通常外部中斷寫作IRQ9。具體的數(shù)值由芯片廠商在設(shè)計(jì)芯片時(shí)決定。NVIC的訪問(wèn)地址是0xE000_E00a所有NVIC的中斷控制/狀態(tài)寄存器都只能在特權(quán)級(jí)下訪問(wèn)。不過(guò)有一個(gè)例外軟件觸發(fā)中斷寄存器可以在用戶級(jí)下訪問(wèn)以產(chǎn)生軟件中斷。所有的中斷控制、狀態(tài)寄存器均可按字、半字、字節(jié)的方式訪問(wèn)。中斷配置內(nèi)容:使能與禁止寄存器掛起與解掛寄存器優(yōu)先級(jí)寄存器活動(dòng)狀態(tài)寄存器另外,下列寄存器也對(duì)中斷處理有重大影響:異常掩蔽寄存器向量表偏移寄存器

40、軟件觸發(fā)中斷寄存器優(yōu)先級(jí)分組寄存器Cortex-M3中異常及中斷的行為如圖所示。分成三級(jí),由NVIC負(fù)責(zé)管理。中斷掛起NVIC_PEND中斷解掛-NVIC_CLRPEND,系統(tǒng)異常源中斷控制及狀態(tài) 寄存器NVIC INT CTRL外設(shè)中斷源圖異常和中斷控制示意圖1.中斷的使能與禁止此處的中斷使能與禁止,主要是針對(duì)片上外設(shè)240路中斷的控制,使能是向SETENA!?存器對(duì)應(yīng)位寫“1;禁止是向CLREN/W存器對(duì)應(yīng)位寫“1;如表所示。表SETENA/CLRENA存器族名稱類型地址復(fù)位值描述SETENA0R/W0xE000_E1000中斷0-31的使能寄存,共32個(gè)使能位n,中斷#n使能(異常號(hào)16

41、+n)SETENA1R/W0xE000_E1040中斷32-63使能寄存器,共32個(gè)使能位,SETENA7R/W0xE000_E11C0中斷224-239使能寄存器,16個(gè)使能位CLRENA0R/W0xE000_E18000-31禁止,共32個(gè)禁止位,CLRENA7R/W0xE000_E19C0224-239的禁止寄存器,共16個(gè)禁止在Luminary系列的單片機(jī)中,片上外設(shè)中斷對(duì)應(yīng)編號(hào)如表所示:表Luminary單片機(jī)外設(shè)中斷源編號(hào)類型優(yōu)先級(jí)描述0IRQ#0可編程GPIOA1IRQ#1可編程GPIOB2IRQ#2可編程GPIOC3IRQ#3可編程GPIOD4IRQ#4可編程GPIOE5IRQ

42、#5可編程UART06IRQ#6可編程UART17IRQ#7可編程SSI8IRQ#8可編程IC9IRQ#9可編程PWM_Fault10IRQ#10可編程PWM011IRQ#11可編程PWM112IRQ#12可編程PWM213IRQ#13可編程QEI14IRQ#14可編程ADC015IRQ#15可編程ADC116IRQ#16可編程ADC217IRQ#17可編程ADC318IRQ#18可編程Watchdog19IRQ#19可編程T0A20IRQ#20可編程T0B21IRQ#21可編程T1A22IRQ#22可編程T1B23IRQ#23可編程T2A24IRQ#24可編程T2B25IRQ#25可編程An

43、alog_comparator026IRQ#26可編程Analog_comparator127IRQ#27可編程Analog_comparator228IRQ#28可編程System_Control29IRQ#29可編程FLASH_Control30IRQ#30可編程GPIOF31IRQ#31可編程GPIOG32IRQ#32可編程GPIOH33IRQ#33可編程UART234IRQ#34可編程SSI135IRQ#35可編程T3A36IRQ#36可編程T3B37IRQ#37可編程IC138IRQ#38可編程QEI139IRQ#39可編程CAN040IRQ#40可編程CAN141IRQ#41可編程

44、CAN242IRQ#42可編程Ethernet43IRQ#43可編程Hibernate44IRQ#44可編程USB045IRQ#45可編程PWM346IRQ#46可編程uDMASoftwareTransfer47IRQ#47可編程uDMAError這8個(gè)寄存器用于控制240外設(shè)中斷的使能與禁止,向其中的對(duì)應(yīng)位寫入1可以使能相應(yīng)的中斷,中斷使能設(shè)置寄存器0的位0對(duì)應(yīng)外部中斷0號(hào)(GPIOA中斷),位1對(duì)應(yīng)外部中斷1號(hào)(GPIOB中斷),依此類推,如表所示。例如使能外部中斷2的操作,如程序清單所示。程序清單使能外部中斷#defineHWREG(x)(*(volatileunsignedchar*)

45、(x)#defineNVIC_EN00xE000E100斷的掛起與角軍掛當(dāng)中斷發(fā)生時(shí),正在處理同級(jí)或高優(yōu)先級(jí)異常,或者被掩蔽,則中斷不能立即得到響應(yīng)。此時(shí)中斷被掛起。中斷的掛起狀態(tài)可以通過(guò)中斷設(shè)置掛起寄存器(SETPED)”和中斷解掛寄存器(CLRPEND)來(lái)讀取,還可以寫它們來(lái)手工掛起中斷。掛起寄存器和解掛寄存器也可以有8對(duì),其用法與前面介紹的使能、禁止能寄存器完全相同,見表。表掛起與解掛寄存器名稱類型地址復(fù)位值描述SETPEND0R/W0xE000_E2000中斷0-31的使能寄存,共32個(gè)使能位n,中斷#n使能(異常號(hào)16+n)SETPEND1R/W0xE000_E2040中斷32-63

46、使能寄存器,共32個(gè)掛起位,SETPEND7R/W0xE000_E21C0中斷224-239掛起寄存器,16個(gè)掛起位CLRPEND0R/W0xE000_E28000-31解掛,共32個(gè)解掛位,CLRPEND7R/W0xE000_E29C0224-239的解掛寄存器,共16個(gè)解掛3 .活動(dòng)狀態(tài)每個(gè)外部中斷都有一個(gè)活動(dòng)狀態(tài)位。在處理器執(zhí)行了其ISR的第一條指令后,它的活動(dòng)位就被置1,并且直到ISR返回時(shí)才硬件清零。由于支持嵌套,允許高優(yōu)先級(jí)異常搶占某個(gè)ISR然而,哪怕中斷被搶占,其活動(dòng)狀態(tài)也依然為1(請(qǐng)仔細(xì)琢磨前文講到的直到ISR返回時(shí)才清零)。活動(dòng)狀態(tài)寄存器的定義,與前面講的使能、禁止和掛起、解

47、掛寄存器相同,只是不再成對(duì)出現(xiàn)。它們也能按字、半字、字節(jié)訪問(wèn),但他們是只讀的,如表所示。表活動(dòng)狀態(tài)名稱類型地址復(fù)位值描述ACTIVE0RO0xE000_E3000中斷0-31的活動(dòng)狀態(tài)寄存器,共32個(gè)狀態(tài)位n,中斷#n活動(dòng)狀態(tài)(異常號(hào)16+n)ACTIVE1RO0xE000_E3040中斷32-63的活狀態(tài)寄存器,共32個(gè)狀態(tài)位。,ACTIVE7RO0xE000_E31C0中斷224-239的活動(dòng)狀態(tài)寄存器,共16個(gè)狀態(tài)位。4 .優(yōu)先級(jí)使用優(yōu)先級(jí)寄存器將0到255個(gè)優(yōu)先級(jí)分別分配名各個(gè)中斷。0代表最高優(yōu)先級(jí),255則代表最代優(yōu)先級(jí)。優(yōu)先級(jí)寄存器首先存放最高位。當(dāng)優(yōu)先級(jí)值為3位時(shí),存放在字節(jié)的位

48、7:5中。這也意味著某個(gè)應(yīng)用即使不知道可能含有多少個(gè)優(yōu)先級(jí)也可以正常工作。從0xE000_E400開始的地址里,每一個(gè)字節(jié)對(duì)應(yīng)一個(gè)外部中斷,例如:0xE000_E400對(duì)應(yīng)外部中斷GPIOA、這個(gè)字節(jié)可以設(shè)置GPIOA的中斷優(yōu)先級(jí)、0xE000_E401對(duì)應(yīng)外部中斷GPIOR這個(gè)字節(jié)可以設(shè)置GPIOB勺中斷優(yōu)先級(jí),依次類推。如表所示。表優(yōu)先級(jí)表名稱類型地址復(fù)位值描述PRI_0R/W0xE000_E4000GPIOA,8位PRI_1R/W0xE000_E4010GPIOB,8位,PRI_239R/W0xE000_E4EF0外中斷#239的優(yōu)先級(jí)系統(tǒng)部分異常也可以編程實(shí)驗(yàn)優(yōu)先設(shè)置,如表所示。表系統(tǒng)

49、異常優(yōu)先級(jí)寄存器地址名稱類型復(fù)位值描述0xE000_ED18PRI_4存儲(chǔ)器管理fault的優(yōu)先級(jí)0xE000_ED19PRI_5總線fault的優(yōu)先級(jí)0xE000_ED1APRI_6用法fault的優(yōu)先級(jí)0xE000_ED1B-0xE000_ED1C-0xE000_ED1D-0xE000_ED1E-0xE000_ED1FPRI_11SV優(yōu)先級(jí)0xE000_ED20PRI_12調(diào)試監(jiān)視器的優(yōu)先級(jí)0xE000_ED21-0xE000_ED22PRI_14PendSV勺優(yōu)先級(jí)0xE000_ED23PRI_15SysTick勺優(yōu)先級(jí)設(shè)置Luminary處理器外部中斷優(yōu)先級(jí):外部2號(hào)中斷外部12號(hào)中斷

50、外部7號(hào)中斷外部4號(hào)中4號(hào)中斷的優(yōu)先級(jí)為最低,如程序清單所示。程序清單設(shè)置外部中斷優(yōu)先級(jí)#defineHWREGB(x)(*(volatileunsignedchar*)(x)#definePRI20xE000E402常屏蔽寄存器PRIMASKFAULTMASKBASEPRIPRIMASK用于禁止在NMI和硬fault之外的所有異常,它有效地把當(dāng)前優(yōu)先級(jí)改為0(可編程優(yōu)先級(jí)中的最高優(yōu)先級(jí))。該寄存器可以通過(guò)MRS和MSR以下例方式訪問(wèn): .關(guān)中斷MOVR0,#1MSRPRIMASK,R0 .開中斷MOVR0,#0MSRPRIMASK,R0此外,還可以通過(guò)CPSf令快速完成上述功能:CPSIDi關(guān)中斷CPSIEi開中斷FAULTMASKM絕,它把當(dāng)前優(yōu)先級(jí)改為-1。這么一來(lái),連硬fault都被掩蔽了。使用方案與PRIMASK的相似。但要注意的是,F(xiàn)AULTMAS般在異常退出時(shí)自動(dòng)清零。BASEPRfc要屏蔽優(yōu)先級(jí)等于和低于某一個(gè)數(shù)值的異常。6 .其他異常的配置寄存器用法fault,總線fault以及存儲(chǔ)器管理fault都是特殊的異常,因此給它們開了小灶。其中,它們的使能控制是通過(guò)系統(tǒng)Handler控制及狀態(tài)寄存器(SHCSR)(地址:0xE000_ED

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論