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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32中斷優(yōu)先級(jí)相關(guān)概念與使用筆記

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

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


          關(guān)鍵詞: STM32中斷優(yōu)先

          評(píng)論


          技術(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); })();