STM32中斷管理函數(shù)_第1頁
STM32中斷管理函數(shù)_第2頁
STM32中斷管理函數(shù)_第3頁
STM32中斷管理函數(shù)_第4頁
STM32中斷管理函數(shù)_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、STM32中斷管理函數(shù)CM3 內(nèi)核支持256 個中斷,其中包含了16 個內(nèi)核中斷和240 個外部中斷,并且具有256級的可編程中斷設(shè)置。但STM32 并沒有使用CM3 內(nèi)核的全部東西,而是只用了它的一部分。STM32 有76 個中斷,包括16 個內(nèi)核中斷和60 個可屏蔽中斷,具有16 級可編程的中斷優(yōu)先級。而我們常用的就是這60 個可屏蔽中斷,所以我們就只針對這60 個可屏蔽中斷進行介紹。在 MDK 內(nèi),與NVIC 相關(guān)的寄存器,MDK 為其定義了如下的結(jié)構(gòu)體:typedef structvu32 ISER2;u32 RESERVED030;vu32 ICER2;u32 RSERVED130;

2、vu32 ISPR2;u32 RESERVED230;vu32 ICPR2;u32 RESERVED330;vu32 IABR2;u32 RESERVED462;vu32 IPR15; NVIC_TypeDef;STM32 的中斷在這些寄存器的控制下有序的執(zhí)行的。了解這些中斷寄存器,你才能方便的使用STM32 的中斷。下面重點介紹這幾個寄存器:ISER2:ISER 全稱是:Interrupt Set-Enable Registers,這是一個中斷使能寄存器組。上面說了STM32 的可屏蔽中斷只有60 個,這里用了2 個32 位的寄存器,總共可以表示64 個中斷。而STM32 只用了其中的前60

3、 位。ISER0的bit0bit31 分別對應(yīng)中斷031。ISER1的bit027對應(yīng)中斷3259;這樣總共60 個中斷就分別對應(yīng)上了。你要使能某個中斷,必須設(shè)置相應(yīng)的ISER位為1,使該中斷被使能(這里僅僅是使能,還要配合中斷分組、屏蔽、IO 口映射等設(shè)置才算是一個完整的中斷設(shè)置)。具體每一位對應(yīng)哪個中斷,請參考stm32f10x_nvic.h 里面的第36 行處。ICER2:全稱是:Interrupt Clear-Enable Registers,是一個中斷除能寄存器組。該寄存器組與ISER 的作用恰好相反,是用來清除某個中斷的使能的。其對應(yīng)位的功能,也和ICER 一樣。這里要專門設(shè)置一個

4、ICER 來清除中斷位,而不是向ISER 寫0 來清除,是因為NVIC 的這些寄存器都是寫1 有效的,寫0 是無效的。具體為什么這么設(shè)計,請看CM3 權(quán)威指南第125 頁,NVIC 概覽一章。ISPR2:全稱是:Interrupt Set-Pending Registers,是一個中斷掛起控制寄存器組。每個位對應(yīng)的中斷和ISER 是一樣的。通過置1,可以將正在進行的中斷掛起,而執(zhí)行同級或更高級別的中斷。寫0 是無效的。ICPR2:全稱是:Interrupt Clear-Pending Registers,是一個中斷解掛控制寄存器組。其作用與ISPR 相反,對應(yīng)位也和ISER 是一樣的。通過設(shè)置

5、1,可以將掛起的中斷接掛。寫0 無效。IABR2:全稱是:Active Bit Registers,是一個中斷激活標(biāo)志位寄存器組。對應(yīng)位所代表的中斷和ISER 一樣,如果為1,則表示該位所對應(yīng)的中斷正在被執(zhí)行。這是一個只讀寄存器,通過它可以知道當(dāng)前在執(zhí)行的中斷是哪一個。在中斷執(zhí)行完了由硬件自動清零。IPR15:全稱是:Interrupt Priority Registers,是一個中斷優(yōu)先級控制的寄存器組。這個寄存器組相當(dāng)重要!STM32 的中斷分組與這個寄存器組密切相關(guān)。IPR 寄存器組由15 個32bit 的寄存器組成,每個可屏蔽中斷占用8bit,這樣總共可以表示15*4=60 個可屏蔽中

6、斷。剛好和STM32 的可屏蔽中斷數(shù)相等。IPR0的3124,2316,158,70分別對應(yīng)中中斷30,依次類推,總共對應(yīng)60 個外部中斷。而每個可屏蔽中斷占用的8bit 并沒有全部使用,而是只用了高4 位。這4 位,又分為搶占優(yōu)先級和子優(yōu)先級。搶占優(yōu)先級在前,子優(yōu)先級在后。而這兩個優(yōu)先級各占幾個位又要根據(jù)SCB-AIRCR 中中斷分組的設(shè)置來決定。這里簡單介紹一下 STM32 的中斷分組:STM32 將中斷分為5 個組,組04。該分組的設(shè)置是由SCB-AIRCR 寄存器的bit108 來定義的。具體的分配關(guān)系如下表所示:通過這個表,我們就可以清楚的看到組 04 對應(yīng)的配置關(guān)系,例如組設(shè)置為3

7、,那么此時所有的60 個中斷,每個中斷的中斷優(yōu)先寄存器的高四位中的最高3 位是搶占優(yōu)先級,低1 位是響應(yīng)優(yōu)先級。每個中斷,你可以設(shè)置搶占優(yōu)先級為07,響應(yīng)優(yōu)先級為1 或0。搶占優(yōu)先級的級別高于響應(yīng)優(yōu)先級。而數(shù)值越小所代表的優(yōu)先級就越高。結(jié)合實例說明一下:假定設(shè)置中斷優(yōu)先級組為2,然后設(shè)置中斷3(RTC 中斷)的搶占優(yōu)先級為3,響應(yīng)優(yōu)先級為1。中斷6(外部中斷0)的搶占優(yōu)先級為4,響應(yīng)優(yōu)先級為0。中斷7(外部中斷1)的搶占優(yōu)先級為3,響應(yīng)優(yōu)先級為0。那么這3 個中斷的優(yōu)先級順序為:中斷7中斷3中斷6。這里需要注意 2 點:如果兩個中斷的響應(yīng)優(yōu)先級和響應(yīng)優(yōu)先級都是一樣的話,則看哪個中斷先發(fā)生就先執(zhí)

8、行。高優(yōu)先級的搶占優(yōu)先級是可以打斷正在進行的低搶占優(yōu)先級中斷的。而搶占優(yōu)先級相同的中斷,高優(yōu)先級的響應(yīng)優(yōu)先級不可以打斷低響應(yīng)優(yōu)先級的中斷。上面例子中的中斷3 和中斷7都可以打斷中斷6 的中斷。而中斷7 和中斷3 卻不可以相互打斷!通過以上介紹,我們熟悉了 STM32 中斷設(shè)置的大致過程。接下來我們介紹如何使用函數(shù)實現(xiàn)以上中斷設(shè)置,使得我們以后的中斷設(shè)置簡單化。第一個介紹的是NVIC 的分組函數(shù)MY_NVIC_PriorityGroupConfig,該函數(shù)的參數(shù)NVIC_Group 為要設(shè)置的分組號,可選范圍為04,總共5 組。如果參數(shù)非法,將可能導(dǎo)致不可預(yù)料的結(jié)果。MY_NVIC_Priori

9、tyGroupConfig 函數(shù)代碼如下:/設(shè)置NVIC 分組/NVIC_Group:NVIC 分組 04 總共5 組void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)u32 temp,temp1;temp1=(NVIC_Group)&0x07;/取后三位temp1AIRCR; /讀取先前的設(shè)置temp&=0X0000F8FF; /清空先前分組temp|=0X05FA0000; /寫入鑰匙temp|=temp1;SCB-AIRCR=temp; /設(shè)置分組通過前面的介紹,我們知道STM32 的5 個分組是通過設(shè)置SCB-AIRCR 的BIT10:8來實

10、現(xiàn)的,而通過2.7.2.1 的介紹我們知道SCB-AIRCR 的修改需要通過在高16 位寫入0X05FA 這個密鑰才能修改的,故在設(shè)置AIRCR 之前,應(yīng)該把密鑰加入到要寫入的內(nèi)容的高16 位,以保證能正常的寫入AIRCR。在修改AIRCR 的時候,我們一般采用讀-改-寫的步驟,來實現(xiàn)不改變AIRCR 原來的其他設(shè)置。以上就是MY_NVIC_PriorityGroupConfig 函數(shù)設(shè)置中斷優(yōu)先級分組的思路。第 二 個 函 數(shù) 是NVIC 設(shè)置函數(shù)MY_NVIC_Init , 該函數(shù)有4 個參數(shù), 分別為:NVIC_PreemptionPriority 、NVIC_SubPriority 、

11、NVIC_Channel 、NVIC_Group 。第一個參數(shù)NVIC_PreemptionPriority 為中斷搶占優(yōu)先級數(shù)值,第二個參數(shù)NVIC_SubPriority 為中斷子優(yōu)先級數(shù)值,前兩個參數(shù)的值必須在規(guī)定范圍內(nèi),否則也可能產(chǎn)生意想不到的錯誤。第三個參數(shù)NVIC_Channel 為中斷的編號(范圍為059),最后一個參數(shù)NVIC_Group 為中斷分組設(shè)置(范圍為04)。該函數(shù)代碼如下:/設(shè)置NVIC/NVIC_PreemptionPriority:搶占優(yōu)先級/NVIC_SubPriority :響應(yīng)優(yōu)先級/NVIC_Channel :中斷編號/NVIC_Group :中斷分組

12、04/注意優(yōu)先級不能超過設(shè)定的組的范圍!否則會有意想不到的錯誤/組劃分:/組0:0 位搶占優(yōu)先級,4 位響應(yīng)優(yōu)先級/組1:1 位搶占優(yōu)先級,3 位響應(yīng)優(yōu)先級/組2:2 位搶占優(yōu)先級,2 位響應(yīng)優(yōu)先級/組3:3 位搶占優(yōu)先級,1 位響應(yīng)優(yōu)先級/組4:4 位搶占優(yōu)先級,0 位響應(yīng)優(yōu)先級/NVIC_SubPriority 和NVIC_PreemptionPriority 的原則是,數(shù)值越小,越優(yōu)先void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)u32 temp

13、;u8 IPRADDR=NVIC_Channel/4; /每組只能存4 個,得到組地址u8 IPROFFSET=NVIC_Channel%4;/在組內(nèi)的偏移IPROFFSET=IPROFFSET*8+4; /得到偏移的確切位置MY_NVIC_PriorityGroupConfig(NVIC_Group);/設(shè)置分組temp=NVIC_PreemptionPriorityNVIC_Group);temp&=0xf;/取低四位if(NVIC_ChannelISER0|=1ISER1|=1IPRIPRADDR|=tempAPB2ENR|=0x01;/使能io 復(fù)用時鐘AFIO-EXTICREXTADDR|=GPIOxIMR|=1EMR|=1FTSR|=1RTSR|=1BITx;/line BITx 上事件上升降沿觸發(fā)Ex_NVIC_Config 完全是按照我們之前的分析來編寫的,首先根據(jù)GPIOx 的位得到中斷寄存器組的編號,即EXTICR 的編號

溫馨提示

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

評論

0/150

提交評論