第5章 向量中斷控制器_第1頁
第5章 向量中斷控制器_第2頁
第5章 向量中斷控制器_第3頁
第5章 向量中斷控制器_第4頁
第5章 向量中斷控制器_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章

向量中斷控制器5.1異常類型、優(yōu)先級5.1.1異常類型

Cortex-M3的每一個異常都有一個編號,編號0對應(yīng)正常工作模式,編號1~255對應(yīng)各種異常;每一個異常都可分配一個優(yōu)先級,優(yōu)先級值越小,優(yōu)先級別越高,優(yōu)先級可以為負(fù)。其中1~15號異常為系統(tǒng)異常,16~255都是外部中斷異常;在大部分情況下,開發(fā)應(yīng)用中很少涉及到1-15號異常的編程處理,我們更關(guān)注的是16-255號的外部異常。編號類型優(yōu)先級描述1復(fù)位-3復(fù)位,具有最高優(yōu)先級2NMI-2不可屏蔽中斷(來自外部NMI輸入腳)3硬件出錯-1如果相應(yīng)的異常沒有被啟用,那么都將觸發(fā)該異常4存儲管理異??删幊檀鎯ζ鞴芾懋惓#琈PU訪問違規(guī)或訪問位置出錯均會觸發(fā)5總線異??删幊炭偩€系統(tǒng)出錯,如取指,或取數(shù)據(jù)異常6使用異??删幊坛绦蝈e誤導(dǎo)致的異常7-10保留N/AN/A11SVCall可編程執(zhí)行系統(tǒng)服務(wù)調(diào)用指令引發(fā)的異常12調(diào)試監(jiān)視器可編程調(diào)試監(jiān)控器異常,如斷點,數(shù)據(jù)觀察點,外部調(diào)試請求等13保留N/AN/A14PendSV可編程為系統(tǒng)設(shè)備開發(fā)的可懸掛請求15SysTick可編程系統(tǒng)時基定時器16~255IRQ0~239可編程外部中斷0~239對于編程開發(fā)來說,我們涉及最多的異常就是IRQ,0~15號異常是系統(tǒng)級的異常,比較少用;另外,每一種異常都有一個編號和一個異常優(yōu)先級,異常的編號是固定的,但是異常的優(yōu)先級是可以編程的,當(dāng)然優(yōu)先級為負(fù)的例外。優(yōu)先級數(shù)值越小,優(yōu)先級別越高。5.1.2異常優(yōu)先級及優(yōu)先級分組寄存器Cortex-M3的優(yōu)先級包括搶占優(yōu)先級和子優(yōu)先級。搶占優(yōu)先級高的中斷可以打斷搶占優(yōu)先級低的中斷,搶占優(yōu)先級相同時,優(yōu)先執(zhí)行子優(yōu)先級高的中斷,但是不會打斷正在執(zhí)行的同級別搶占優(yōu)先級中斷。優(yōu)先級的數(shù)值越小,優(yōu)先級別越高。應(yīng)用程序中斷及復(fù)位控制寄存器SCB_AIRCR中PRIGROUP位段用來控制優(yōu)先級的分組;應(yīng)用程序中斷及復(fù)位控制寄存器SCB_AIRCR:位段名稱類型復(fù)位值描述31:16VECTKEYR/W-訪問鑰匙:任何對該寄存器的寫操作,都必須同時把0x05FA寫入此段,否則寫操作被忽略。若讀取此半字,則0xFA0515ENDIANESSR-端模式設(shè)置。1=大端(BE8),0=小端。此值是在復(fù)位時確定的,不能更改。10:8PRIGROUPR/W0優(yōu)先級分組2SYSRESETREQW-請求芯片控制邏輯產(chǎn)生一次復(fù)位1VECTCLRACTIVEW-清零所有異常的活動狀態(tài)信息。通常只在調(diào)試時用,或者在OS從錯誤中恢復(fù)時用。0VECTRESETW-復(fù)位CM3處理器內(nèi)核(調(diào)試邏輯除外),但是此復(fù)位不影響芯片上在內(nèi)核以外的電路PRIGROUP共占3位,值的范圍是0-7,假如PRIGROUP值為5,則每一個中斷對應(yīng)的優(yōu)先級寄存器的6、7三位表示對應(yīng)中斷的搶占優(yōu)先級,其他位表示子優(yōu)先級;每一個中斷優(yōu)先級寄存器占8位。Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0搶占優(yōu)先級子優(yōu)先級以16級優(yōu)先級為例,優(yōu)先級之所以會只有16級,是因為在M3單片機設(shè)計時,只使用了優(yōu)先級寄存器NVIC_IPRx的高4位;如果此時PRIGROUP值為5,則優(yōu)先級分組如下:此時0-3位雖然沒有使用,但是PRIGROUP的值可以設(shè)為0-3之間的值,如果PRIGROUP設(shè)為1,則優(yōu)先級分組如下:此時16級優(yōu)先級都是搶占優(yōu)先級,高優(yōu)先級能打斷所有低優(yōu)先級。Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0搶占優(yōu)先級子優(yōu)先級未使用子優(yōu)先級Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0實際使用搶占優(yōu)先級[7:4]未使用搶占優(yōu)先級未使用子優(yōu)先級5.2中斷向量表當(dāng)有異常發(fā)生時,處理器需要確定對應(yīng)異常的函數(shù)起始地址,各個異常的函數(shù)起始地址都存儲在一個向量表中,每個地址占4字節(jié),系統(tǒng)找到函數(shù)入口地址后就可調(diào)到異常代碼處執(zhí)行對應(yīng)中斷函數(shù);為了可以動態(tài)重新分配中斷,CM3允許可編程設(shè)置向量表基址,通過設(shè)置向量表偏移寄存器存器VTOR即可設(shè)置向量表起始地址,當(dāng)設(shè)置在RAM范圍內(nèi)時,即可實現(xiàn)動態(tài)修改中斷函數(shù)地址。VTOR寄存器:在應(yīng)用開發(fā)中,每一個工程都有一個匯編的啟動代碼,這個啟動代碼里面已經(jīng)包含了向量表,我們需要做的就是把自己用到的中斷函數(shù)寫出實現(xiàn)即可;中斷函數(shù)的名字必須和匯編里面的名字一致;匯編內(nèi)的中斷函數(shù)入口順序不能隨意修改或者刪除。位段名稱類型復(fù)位值描述29TBLBASER/W0向量表所在區(qū)域標(biāo)志0:ROM1:RAM28:7TBLOFFR/W0相對ROM或者RAM起始地址的偏移量5.3NVIC寄存器描述5.3.1中斷使能寄存器NVIC_ISER0/1STM32F103系列小、中、大容量單片機有60個可屏蔽中斷,NVIC_ISER[0]和NVIC_ISER[1]兩個32位寄存器,可控制64個可屏蔽中斷的使能,NVIC_ISER[0]的0~31位對應(yīng)0~31號中斷,NVIC_ISER[1]的0~31位對應(yīng)32~63號中斷;1使能中斷,0失能中斷。NVIC_ISER寄存器只能寫1,寫0無效;若要清除指定位為0,需要使用NVIC_ICER寄存器;STM32F103系列小、中、大容量單片機0~59號IRQ可屏蔽中斷如下表:中斷位置可屏蔽中斷描述中斷位置可屏蔽中斷描述0WWDG_IRQChannel30TIM4_IRQChannel1PVD_IRQChannel31I2C1_EV_IRQChannel2TAMPER_IRQChannel32I2C1_ER_IRQChannel3RTC_IRQChannel33I2C2_EV_IRQChannel4FLASH_IRQChannel34I2C2_ER_IRQChannel5RCC_IRQChannel35SPI1_IRQChannel6EXTI0_IRQChannel36SPI2_IRQChannel7EXTI1_IRQChannel37USART1_IRQChannel8EXTI2_IRQChannel38USART2_IRQChannel9EXTI3_IRQChannel39USART3_IRQChannel10EXTI4_IRQChannel40EXTI15_10_IRQChannel11DMA1_Channel1_IRQChannel41RTCAlarm_IRQChannel12DMA1_Channel2_IRQChannel42USBWakeUp_IRQChannel13DMA1_Channel3_IRQChannel43TIM8_BRK_IRQChannel14DMA1_Channel4_IRQChannel44TIM8_UP_IRQChannel15DMA1_Channel5_IRQChannel45TIM8_TRG_COM_IRQChannel16DMA1_Channel6_IRQChannel46TIM8_CC_IRQChannel17DMA1_Channel7_IRQChannel47ADC3_IRQChannel18ADC1_2_IRQChannel48FSMC_IRQChannel19USB_HP_CAN_TX_IRQChannel49SDIO_IRQChannel20USB_LP_CAN_RX0_IRQChannel50TIM5_IRQChannel21CAN_RX1_IRQChannel51SPI3_IRQChannel22CAN_SCE_IRQChannel52UART4_IRQChannel23EXTI9_5_IRQChannel53UART5_IRQChannel24TIM1_BRK_IRQChannel54TIM6_IRQChannel25TIM1_UP_IRQChannel55TIM7_IRQChannel26TIM1_TRG_COM_IRQChannel56DMA2_Channel1_IRQChannel27TIM1_CC_IRQChannel57DMA2_Channel2_IRQChannel28TIM2_IRQChannel58DMA2_Channel3_IRQChannel29TIM3_IRQChannel59DMA2_Channel4_5_IRQChannel5.3.2中斷清除寄存器NVIC_ICER0/1在NVIC_ICER[0]和NVIC_ICER[1]寄存器中的位寫入1,則NVIC_ISER[0]和NVIC_ISER[1]的對應(yīng)的位被清除為0,從而屏蔽中斷。NVIC_ICER[0]和NVIC_ICER[1]各位寫1有效,寫0無效。5.3.3中斷掛起寄存器NVIC_ISPR0/1NVIC_ISPR[0]的0~31位對應(yīng)0~31號中斷,NVIC_ISPR[1]的0~31位對應(yīng)32~63號中斷;當(dāng)設(shè)置NVIC_ISPR的位為1時,對應(yīng)中斷被掛起,CPU不執(zhí)行中斷處理任務(wù),當(dāng)用NVIC_ICPR清除對應(yīng)位時,CPU恢復(fù)執(zhí)行中斷處理任務(wù);寫1有效,寫0無效。5.3.4中斷掛起清除寄存器NVIC_ICPR0/1在NVIC_ICPR[0]和NVIC_ICPR[1]寄存器的位寫入1,則NVIC_ISPR[0]和NVIC_ISPR[1]的對應(yīng)位被清除為0,從而取消中斷掛起,恢復(fù)中斷任務(wù);寫1有效,寫0無效。5.3.5中斷激活標(biāo)志寄存器NVIC_IABR0/1NVIC_IABR[0]的0~31位對應(yīng)0~31號中斷,NVIC_IABR[1]的0~31位對應(yīng)32~63號中斷;NVIC_IABR[0]和NVIC_IABR[1]標(biāo)記當(dāng)前正在執(zhí)行的中斷,當(dāng)中斷執(zhí)行完畢后,對應(yīng)位由硬件自動清0;5.3.6中斷優(yōu)先級控制寄存器組NVIC_IPRx(x=0...14)NVIC_IPR[x](x=0...14)是一個32位寄存器,每一個寄存器分4個8位寄存器,每一個8位寄存器標(biāo)記一個對應(yīng)編號的可屏蔽中斷的優(yōu)先級,STM32F103系列單片機有60個可屏蔽中斷;NVIC_IPR[0]按地址由低到高的順序,內(nèi)部4個字節(jié)依次對應(yīng)0~3號可屏蔽中斷的優(yōu)先級,依次類推,NVIC_IPR[14]按地址由低到高的順序,內(nèi)部4個字節(jié)依次對應(yīng)56~59號可屏蔽中斷的優(yōu)先級。5.4NVIC庫函數(shù)NVIC寄存器結(jié)構(gòu),NVIC_TypeDeff,在文件“stm32f10x_map.h”中定義如下:typedefstruct{vu32Enable[2];u32RESERVED0[30];vu32Disable[2];u32RSERVED1[30];vu32Set[2];u32RESERVED2[30];vu32Clear[2];u32RESERVED3[30];vu32Active[2];u32RESERVED4[62];vu32Priority[11];}NVIC_TypeDef;/*NVICStructure*/typedefstruct{vu32CPUID;vu32IRQControlState;vu32ExceptionTableOffset;vu32AIRC;vu32SysCtrl;vu32ConfigCtrl;vu32SystemPriority[3];vu32SysHandlerCtrl;vu32ConfigFaultStatus;vu32HardFaultStatus;vu32DebugFaultStatus;vu32MemoryManageFaultAddr;vu32BusFaultAddr;}SCB_TypeDef;/*SystemControlBlockStructure*/主要NVIC庫函數(shù),如下:1函數(shù)NVIC_DeInit功能描述:將外設(shè)NVIC寄存器重設(shè)為缺省值例:NVIC_DeInit();2函數(shù)NVIC_SCBDeInit功能描述:將外設(shè)SCB寄存器重設(shè)為缺省值例:NVIC_SCBDeInit();3函數(shù)NVIC_PriorityGroupConfig功能描述:設(shè)置優(yōu)先級分組:先占優(yōu)先級和從優(yōu)先級例:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_PriorityGroup該參數(shù)設(shè)置優(yōu)先級分組位長度NVIC_PriorityGroup描述NVIC_PriorityGroup_0先占優(yōu)先級0位,從優(yōu)先級4位NVIC_PriorityGroup_1先占優(yōu)先級1位,從優(yōu)先級3位NVIC_PriorityGroup_2先占優(yōu)先級2位,從優(yōu)先級2位NVIC_PriorityGroup_3先占優(yōu)先級3位,從優(yōu)先級1位NVIC_PriorityGroup_4先占優(yōu)先級4位,從優(yōu)先級0位4函數(shù)NVIC_Init功能描述:根據(jù)NVIC_InitStruct中指定的參數(shù)初始化外設(shè)NVIC寄存器NVIC_InitStruct:指向結(jié)構(gòu)NVIC_InitTypeDef的指針,包含了外設(shè)GPIO的配置信息NVIC_InitTypeDefstructureNVIC_InitTypeDef定義于文件“stm32f10x_nvic.h”:typedefstruct{u8NVIC_IRQChannel;u8NVIC_IRQChannelPreemptionPriority;u8NVIC_IRQChannelSubPriority;FunctionalStateNVIC_IRQChannelCmd;}NVIC_InitTypeDef;NVIC_IRQChannel該參數(shù)用以使能或者失能指定的IRQ通道。NVIC_IRQChannel描述1WWDG_IRQChannel窗口看門狗中斷23CAN_SCE_IRQChannel2PVD_IRQChannelPVD通過EXTI探測中斷24EXTI9_5_IRQChannel3TAMPER_IRQChannel篡改中斷25TIM1_BRK_IRQChannel4RTC_IRQChannelRTC全局中斷26TIM1_UP_IRQChannel5Flash_IRQChannelFLASH全局中斷27TIM1_TRG_COM_IRQChannel6RCC_IRQChannelRCC全局中斷28TIM1_CC_IRQChannel7EXTI0_IRQChannel外部中斷線0中斷29TIM2_IRQChannel8EXTI1_IRQChannel外部中斷線1中斷30TIM3_IRQChannel9EXTI2_IRQChannel外部中斷線2中斷31TIM4_IRQChannel10EXTI3_IRQChannel外部中斷線3中斷32I2C1_EV_IRQChannel11EXTI4_IRQChannel外部中斷線4中斷33I2C1_ER_IRQChannel12DMA1_Channel1_IRQChannelDMA通道1中斷34I2C2_EV_IRQChannel13DMA1_Channel2_IRQChannelDMA通道2中斷35I2C2_ER_IRQChannel14DMA1_Channel3_IRQChannelDMA通道3中斷36SPI1_IRQChannel15DMA1_Channel4_IRQChannelDMA通道4中斷37SPI2_IRQChannel16DMA1_Channel5_IRQChannelDMA通道5中斷38USART1_IRQChannel17DMA1_Channel6_IRQChannelDMA通道6中斷39USART2_IRQChannel18DMA1_Channel7_IRQChannelDMA通道7中斷40USART3_IRQChannel19ADC1_2_IRQChannelADC全局中斷41EXTI15_10_IRQChannel20USB_HP_CANTX_IRQChannelUSB高優(yōu)先級或者CAN發(fā)送中斷42RTCAlarm_IRQChannel21USB_LP_CAN_RX0_IRQChannelUSB低優(yōu)先級或者CAN接收0中斷43USBWakeUp_IRQChannel22CAN_RX1_IRQChannelCAN接收1中斷NVIC_IRQChannelPreemptionPriority該參數(shù)設(shè)置了成員NVIC_IRQChannel中的先占優(yōu)先級NVIC_IRQChannelSubPriority該參數(shù)設(shè)置了成員NVIC_IRQChannel中的從優(yōu)先級5函數(shù)NVIC_StructInit功能描述:把NVIC_InitStruct中的每一個參數(shù)按缺省值填入NVIC_InitStruct:指向結(jié)構(gòu)NVIC_InitTypeDef的指針,待初始化,例:NVIC_InitTypeDefNVIC_InitStructure;NVIC_StructInit(&NVIC_InitStructure);NVIC_InitStruct缺省值NVIC_IRQChannel:0x0NVIC_IRQChannelPreemptionPriority:0NVIC_IRQChannelSubPriority:0NVIC_IRQChannelCmd:DISABLE6函數(shù)NVIC_SETPRIMASK功能描述:使能PRIMASK優(yōu)先級:提升執(zhí)行優(yōu)先級至01).該函數(shù)由匯編語言書寫。2).該函數(shù)只影響組優(yōu)先級,不影響從優(yōu)先級。3).在設(shè)置PRIMASK寄存器前,建議在從為了使能一個例外中另一個例外返回時,清除該寄存器例:NVIC_SETPRIMASK();7函數(shù)NVIC_RESETPRIMASK功能描述:失能PRIMASK優(yōu)先級例:NVIC_RESETPRIMASK();8函數(shù)NVIC_SETFAULTMASK功能描述:使能FAULTMASK優(yōu)先級:提升執(zhí)行優(yōu)先級至-11).該函數(shù)由匯編語言書寫。2).該函數(shù)只影響組優(yōu)先級,不影響從優(yōu)先級。3).FAULTMASK只有在執(zhí)行優(yōu)先級值小于-1的情況下才能被設(shè)置,設(shè)置FAULTMASK將它的執(zhí)行優(yōu)先級提升到HardFAULT的級別。每當(dāng)從除NMI之外的例外中返回,F(xiàn)AULTMASK會被自動清除。9函數(shù)NVIC_RESETFAULTMASK功能描述:失能FAULTMASK優(yōu)先級1).該函數(shù)由匯編語言書寫。例:NVIC_RESETPRIMASK();10函數(shù)NVIC_BASEPRICONFIG功能描述:改變執(zhí)行優(yōu)先級從N(最低可設(shè)置優(yōu)先級)提升至11).該函數(shù)由匯編語言書寫。2).該函數(shù)只影響組優(yōu)先級,不影響從優(yōu)先級。3).可以改變執(zhí)行優(yōu)先級,從N(最低可設(shè)置優(yōu)先級)提升至1。將該寄存器清除至0不會影響當(dāng)前的優(yōu)先級,它的非零值起到優(yōu)先級屏蔽的作用,執(zhí)行后當(dāng)BASEPRI定義的優(yōu)先級高于當(dāng)前優(yōu)先級時,該操作將起作用。例:NVIC__BASEPRICONFIG(10);11函數(shù)NVIC_GetBASEPRI功能描述:返回BASEPRI屏蔽值,例:u32BASEPRI_Mask=0;BASEPRI_Mask=NVIC_GetBASEPRI();12函數(shù)NVIC_GetCurrentPendingIRQChannel功能描述:返回當(dāng)前待處理IRQ標(biāo)識符,例:u16CurrentPendingIRQChannel;CurrentPendingIRQChannel=NVIC_GetCurrentPendingIRQChannel();13函數(shù)NVIC_GetIRQChannelPendingBitStatus功能描述:檢查指定的IRQ通道待處理位設(shè)置與否,例:ITStatusIRQChannelPendingBitStatus;IRQChannelPendingBitStatus=NVIC_GetIRQChannelPendingBitStatus(ADC_IRQChannel);14函數(shù)NVIC_SetIRQChannelPendingBit功能描述:設(shè)置指定的IRQ通道待處理位,例:NVIC_SetI

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論