<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > STM32中斷管理函數(shù)

          STM32中斷管理函數(shù)

          作者: 時間:2016-11-28 來源:網(wǎng)絡(luò) 收藏
          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 個可屏蔽中斷進(jìn)行介紹。
          在 MDK 內(nèi),與NVIC相關(guān)的寄存器,MDK 為其定義了如下的結(jié)構(gòu)體:
          typedef struct
          {
          vu32 ISER[2];
          u32 RESERVED0[30];
          vu32 ICER[2];
          u32 RSERVED1[30];
          vu32 ISPR[2];
          u32 RESERVED2[30];
          vu32 ICPR[2];
          u32 RESERVED3[30];
          vu32 IABR[2];
          u32 RESERVED4[62];
          vu32 IPR[15];
          } NVIC_TypeDef;
          STM32 的中斷在這些寄存器的控制下有序的執(zhí)行的。了解這些中斷寄存器,你才能方便的
          使用STM32 的中斷。下面重點介紹這幾個寄存器:
          ISER[2]:ISER 全稱是:Interrupt Set-Enable Registers,這是一個中斷使能寄存器組。上面
          說了STM32 的可屏蔽中斷只有60 個,這里用了2 個32 位的寄存器,總共可以表示64 個中斷。
          而STM32 只用了其中的前60 位。ISER[0]的bit0~bit31 分別對應(yīng)中斷0~31。ISER[1]的bit0~27
          對應(yīng)中斷32~59;這樣總共60 個中斷就分別對應(yīng)上了。你要使能某個中斷,必須設(shè)置相應(yīng)的ISER
          位為1,使該中斷被使能(這里僅僅是使能,還要配合中斷分組、屏蔽、IO 口映射等設(shè)置才算是
          一個完整的中斷設(shè)置)。具體每一位對應(yīng)哪個中斷,請參考stm32f10x_nvic..h 里面的第36 行處。
          ICER[2]:全稱是:Interrupt Clear-Enable Registers,是一個中斷除能寄存器組。該寄存器組
          與ISER 的作用恰好相反,是用來清除某個中斷的使能的。其對應(yīng)位的功能,也和ICER 一樣。
          這里要專門設(shè)置一個ICER 來清除中斷位,而不是向ISER 寫0 來清除,是因為NVIC 的這些寄
          存器都是寫1 有效的,寫0 是無效的。具體為什么這么設(shè)計,請看《CM3 權(quán)威指南》第125 頁,
          NVIC 概覽一章。
          ISPR[2]:全稱是:Interrupt Set-Pending Registers,是一個中斷掛起控制寄存器組。每個位
          對應(yīng)的中斷和ISER 是一樣的。通過置1,可以將正在進(jìn)行的中斷掛起,而執(zhí)行同級或更高級別
          的中斷。寫0 是無效的。
          ICPR[2]:全稱是:Interrupt Clear-Pending Registers,是一個中斷解掛控制寄存器組。其作
          用與ISPR 相反,對應(yīng)位也和ISER 是一樣的。通過設(shè)置1,可以將掛起的中斷接掛。寫0 無效。
          IABR[2]:全稱是:Active Bit Registers,是一個中斷激活標(biāo)志位寄存器組。對應(yīng)位所代表

          本文引用地址:http://www.ex-cimer.com/article/201611/322721.htm

          的中斷和ISER 一樣,如果為1,則表示該位所對應(yīng)的中斷正在被執(zhí)行。這是一個只讀寄存器,
          通過它可以知道當(dāng)前在執(zhí)行的中斷是哪一個。在中斷執(zhí)行完了由硬件自動清零。
          IPR[15]:全稱是:Interrupt Priority Registers,是一個中斷優(yōu)先級控制的寄存器組。這個寄
          存器組相當(dāng)重要!STM32 的中斷分組與這個寄存器組密切相關(guān)。IPR 寄存器組由15 個32bit 的
          寄存器組成,每個可屏蔽中斷占用8bit,這樣總共可以表示15*4=60 個可屏蔽中斷。剛好和
          STM32 的可屏蔽中斷數(shù)相等。IPR[0]的[31~24],[23~16],[15~8],[7~0]分別對應(yīng)中中斷3~0,
          依次類推,總共對應(yīng)60 個外部中斷。而每個可屏蔽中斷占用的8bit 并沒有全部使用,而是只
          用了高4 位。這4 位,又分為搶占優(yōu)先級和子優(yōu)先級。搶占優(yōu)先級在前,子優(yōu)先級在后。而這
          兩個優(yōu)先級各占幾個位又要根據(jù)SCB->AIRCR 中中斷分組的設(shè)置來決定。
          這里簡單介紹一下 STM32 的中斷分組:STM32 將中斷分為5 個組,組0~4。該分組的設(shè)
          置是由SCB->AIRCR 寄存器的bit10~8 來定義的。具體的分配關(guān)系如下表所示:

          通過這個表,我們就可以清楚的看到組 0~4 對應(yīng)的配置關(guān)系,例如組設(shè)置為3,那么此時
          所有的60 個中斷,每個中斷的中斷優(yōu)先寄存器的高四位中的最高3 位是搶占優(yōu)先級,低1 位是
          響應(yīng)優(yōu)先級。每個中斷,你可以設(shè)置搶占優(yōu)先級為0~7,響應(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í)行。
          高優(yōu)先級的搶占優(yōu)先級是可以打斷正在進(jìn)行的低搶占優(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è)置的分組號,可選范圍為0~4,總共5 組。如果參數(shù)非法,將可能導(dǎo)致不
          可預(yù)料的結(jié)果。MY_NVIC_PriorityGroupConfig 函數(shù)代碼如下:
          //設(shè)置NVIC 分組
          //NVIC_Group:NVIC 分組 0~4 總共5 組
          void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
          {
          u32 temp,temp1;
          temp1=(~NVIC_Group)&0x07;//取后三位
          temp1<<=8;
          temp=SCB->AIRCR; //讀取先前的設(shè)置
          temp&=0X0000F8FF; //清空先前分組
          temp|=0X05FA0000; //寫入鑰匙
          temp|=temp1;
          SCB->AIRCR=temp; //設(shè)置分組
          }
          通過前面的介紹,我們知道STM32 的5 個分組是通過設(shè)置SCB->AIRCR 的BIT[10:8]來實
          現(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 、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 為中斷的編號(范圍為0~59),最后一個參數(shù)NVIC_Group 為中斷分組設(shè)置(范
          圍為0~4)。該函數(shù)代碼如下:
          //設(shè)置NVIC
          //NVIC_PreemptionPriority:搶占優(yōu)先級
          //NVIC_SubPriority :響應(yīng)優(yōu)先級
          //NVIC_Channel :中斷編號
          //NVIC_Group :中斷分組 0~4
          //注意優(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;
          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_PreemptionPriority<<(4-NVIC_Group);
          temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
          temp&=0xf;//取低四位
          if(NVIC_Channel<32)NVIC->ISER[0]|=1<相反操作就OK)
          else NVIC->ISER[1]|=1<<(NVIC_Channel-32);
          NVIC->IPR[IPRADDR]|=temp<}
          通過前面的介紹,我們知道每個可屏蔽中斷的優(yōu)先級的設(shè)置是在IPR 寄存器組里面的,每
          個中斷占8 位,但只用了其中的4 個位,以上代碼就是根據(jù)中斷分組情況,來設(shè)置每個中斷對
          應(yīng)的高4 位的數(shù)值的。當(dāng)然在該函數(shù)里面還引用了MY_NVIC_PriorityGroupConfig 這個函數(shù)來
          設(shè)置分組。其實這個分組函數(shù)在每個系統(tǒng)里面只要設(shè)置一次就夠了,設(shè)置多次,則是以最后的
          那一次為準(zhǔn)。但是只要多次設(shè)置的組號都是一樣,就沒事。否則前面設(shè)置的中斷會因為后面組
          的變化優(yōu)先級會發(fā)生改變,這點在使用的時候要特別注意!一個系統(tǒng)代碼里面,所有的中斷分
          組都要統(tǒng)一?。?,以上代碼對要配置的中斷號默認(rèn)是開啟中斷的。也就是ISER 中的值設(shè)置為1
          了。
          上一頁 1 2 下一頁

          關(guān)鍵詞: STM32中斷管理函

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();