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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32中斷優(yōu)先級相關概念與使用筆記

          STM32中斷優(yōu)先級相關概念與使用筆記

          作者: 時間:2016-11-27 來源:網(wǎng)絡 收藏
          一、基本概念
          1.ARM cortex_m3內(nèi)核支持256個中斷(16個內(nèi)核+240外部)和可編程256級中斷優(yōu)先級的設置,與其相關的中斷控制和中斷優(yōu)先級控制寄存器(NVIC、SYSTICK等)也都屬于cortex_m3內(nèi)核的部分。STM32采用了cortex_m3內(nèi)核,所以這部分仍舊保留使用,但STM32并沒有使用cortex_m3內(nèi)核全部的東西(如內(nèi)存保護單元MPU等),因此它的NVIC是cortex_m3內(nèi)核的NVIC的子集。
          2.STM32目前支持的中斷共為84個(16個內(nèi)核+68個外部),和16級可編程中斷優(yōu)先級的設置(僅使用中斷優(yōu)先級設置8bit中的高4位,見后面解釋)?!秴⒖甲钚?01xx-107xx STM32 Reference manual, RM0008》。
          3.以下主要對“外部中斷通道”進行說明。
          對于cortex_m3內(nèi)核所支持的240個外部中斷,我在這里使用了“中斷通道”這個概念,因為盡管每個中斷對應一個外圍設備,但該外圍設備通常具備若干個可以引起中斷的中斷源或中斷事件。而該設備的所有的中斷都只能通過該指定的“中斷通道”向內(nèi)核申請中斷。因此,下面關于中斷優(yōu)先級的概念都是針對“中斷通道”的。當該中斷通道的優(yōu)先級確定后,也就確定了該外圍設備的中斷優(yōu)先級,并且該設備所能產(chǎn)生的所有類型的中斷,都享有相同的通道中斷優(yōu)先級。至于該設備本身產(chǎn)生的多個中斷的執(zhí)行順序,則取決于用戶的中斷服務程序。
          4. STM32可以支持的68個外部中斷通道,已經(jīng)固定的分配給相應的外部設備。每個中斷通道都具備自己的中斷優(yōu)先級控制字節(jié)PRI_n(8位,但在STM32中只使用4位,高4位有效),每4個通道的8位中斷優(yōu)先級控制字(PRI_n)構成一個32位的優(yōu)先級寄存器(Priority Register)。68個通道的優(yōu)先級控制字至少構成17個32位的優(yōu)先級寄存器,它們是NVIC寄存器中的一個重要部分。
          5.對于這4bit的中斷優(yōu)先級控制位還必須分成2組看:從高位開始,前面是定義搶先式優(yōu)先級的位,后面用于定義子優(yōu)先級。4bit的分組組合可以有以下幾種形式:
          編 號
          分配情況
          7
          0:4
          無搶先式優(yōu)先級,16個子優(yōu)先級
          6
          1:3
          2個搶先式優(yōu)先級,8個子優(yōu)先級
          5
          2:2
          4個搶先式優(yōu)先級,4個子優(yōu)先級
          4
          3:1
          8個搶先式優(yōu)先級,2個子優(yōu)先級
          3/2/1/0
          4:0
          16個搶先式優(yōu)先級,無子優(yōu)先級
          6.在一個系統(tǒng)中,通常只使用上面5種分配情況的一種,具體采用哪一種,需要在初始化時寫入到一個32位寄存器AIRC(Application Interrupt and Reset Control Register)
          的第[10:8]這3個位中。這3個bit位有專門的稱呼:PRIGROUP(具體寫操作后面介紹)。比如你將0x05(即上表中的編號)寫到AIRC的[10:8]中,那么也就規(guī)定了你的系統(tǒng)中只有4個搶先式優(yōu)先級,相同的搶先式優(yōu)先級下還可以有4個不同級別的子優(yōu)先級。
          7.AIRC中PRIGROUP的值規(guī)定了設置和確定每個外部中斷通道優(yōu)先級的格式。例如,在上面將0x05寫入了AIRC中PRIGROUP,也就規(guī)定了當前系統(tǒng)中只能有4個搶先式優(yōu)先級,相同的搶先式優(yōu)先級下還可以有4個不同級別的子優(yōu)先級,他們分別為:
          位[7:6]
          位[5:4]
          位[3:0]
          00
          0號搶先優(yōu)先級
          00
          0號子優(yōu)先級
          無效
          01
          1號搶先優(yōu)先級
          01
          1號子優(yōu)先級
          無效
          10
          2號搶先優(yōu)先級
          10
          2號子優(yōu)先級
          無效
          11
          3號搶先優(yōu)先級
          11
          3號子優(yōu)先級
          無效
          8.如果在你的系統(tǒng)中使用了TIME2(中斷通道28)和EXTI0(中斷通道6)兩個中斷,而TIME2中斷必須優(yōu)先響應,而且當系統(tǒng)在執(zhí)行EXIT0中斷服務時也必須打斷(搶先、嵌套),就必須設置TIME2的搶先優(yōu)先級比EXTI0的搶先優(yōu)先級要高(數(shù)目小)。假定EXTI0為2號搶先優(yōu)先級,那么TIME2就必須設置成0或1號搶先優(yōu)先級。這些工作需要在AIRC中的PRIGROUP設置完成,確定了整個系統(tǒng)所具有的優(yōu)先級個數(shù)后,再分別對每個中斷通道(設備)進行設置。
          9.具體優(yōu)先級的確定和嵌套規(guī)則。ARM cortex_m3(STM32)規(guī)定
          a/ 只能高搶先優(yōu)先級的中斷可以打斷低搶先優(yōu)先級的中斷服務,構成中斷嵌套。
          b/ 當2(n)個相同搶先優(yōu)先級的中斷出現(xiàn),它們之間不能構成中斷嵌套,但STM32首先響應子優(yōu)先級高的中斷。
          c/ 當2(n)個相同搶先優(yōu)先級和相同子優(yōu)先級的中斷出現(xiàn),STM32首先響應中斷通道所對應的中斷向量地址低的那個中斷(見ROM0008,表52)。
          具體一點:
          0號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為非0號的中斷;1號搶先優(yōu)先級的中斷,可以打斷任何中斷搶先優(yōu)先級為2、3、4號的中斷;……;構成中斷嵌套。
          如果兩個中斷的搶先優(yōu)先級相同,誰先出現(xiàn),就先響應誰,不構成嵌套。如果一起出現(xiàn)(或掛在那里等待),就看它們2個誰的子優(yōu)先級高了,如果子優(yōu)先級也相同,就看它們的中斷向量位置了。
          10.上電Reset后,寄存器AIRC中PRIGROUP[10:8]的值為0(編號0),因此此時系統(tǒng)使用16個搶先優(yōu)先級,無子優(yōu)先級。另外由于所有外部中斷通道的優(yōu)先級控制字PRI_n也都是0,所以根據(jù)上面的定義可以得出,此時68個外部中斷通道的搶先優(yōu)先級都是0號,沒有子優(yōu)先級的區(qū)分。故此時不會發(fā)生任何的中斷嵌套行為,誰也不能打斷當前正在執(zhí)行的中斷服務。當多個中斷出現(xiàn)后,則看它們的中斷向量地址:地址越低,中斷級別越高,STM32優(yōu)先響應。
          注意:此時內(nèi)部中斷的搶先優(yōu)先級也都是0號,由于它們的中斷向量地址比外部中斷向量地址都低,所以它們的優(yōu)先級比外部中斷通道高,但如果此時正在執(zhí)行一個外部中斷服務,它們也必須排隊等待,只是可以插隊,當正在執(zhí)行的中斷完成后,它們可以優(yōu)先得到執(zhí)行。
          了解以上基本概念還是不夠的,還要了解具體中斷的控制有那些途徑,中斷服務程序如何正確的編寫。下面的描述主要以TIME2通道為例。
          二、中斷控制
          1.對于STM32講,外部中斷通道位置28(35號優(yōu)先級)是給外部設備TIME2的,但TIME2本身能夠引起中斷的中斷源或事件有好多個,比如更新事件(上溢/下溢)、輸入捕獲、輸出匹配、DMA申請等。所有TIME2的中斷事件都是通過一個TIME2的中斷通道向STM32內(nèi)核提出中斷申請,那么STM32中如何處理和控制TIME2和它眾多的、不同的、中斷申請呢?
          (題外話:STM32中的一個通用定時計數(shù)器,就比8位控制器(如AVR,MCS-51就更不必說了)中TIME要復雜多了。學過AVR的,可能對輸入捕獲、輸出匹配等還有概念,但如果你學的標準架構的MCS-51,那么上手32位可能困難就更多了。所以我一直推薦學習8位機應該認真的從AVR開始。盡管51有很大的市場,價格也相對便宜,但從長遠的眼光看問題,從后續(xù)掌握32位的使用,考慮到學生的可持續(xù)發(fā)展,AVR應該是比較好的選擇。)
          2.cortex_m3內(nèi)核對于每一個外部中斷通道都有相應的控制字和控制位,用于單獨的和總的控制該中斷通道。它們包括有:


          評論


          技術專區(qū)

          關閉
          看屁屁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); })();