stm32中斷


子優先級至少是1個位。因此搶占優先級最多是7個位,這就造成了最多只有128級搶占的現象(stm32只有4位)。

向量表:當發生了異常並且要響應它時,CM3 需要定位其服務例程的入口地址。這些入口地址存儲在所 謂的“(異常)向量表”中。缺省情況下,CM3認為該表位於零地址處,且各向量占用4字節。因此 每個表項占用4字節。 NVIC 的訪問地址是0xE000_E000,NVIC 中有一個寄存器,稱為“向量表偏移量寄存器”(在地 址0xE000_ED08處),通過修改它的值就能重定位向量表。但必須注意的是:向量表的起始地址是 有要求的:必須先求出系統中共有多少個向量,再把這個數字向上“圓整”到2 的整次冪,而起始 地址必須對齊到后者的邊界上。例如,如果一共有32 個中斷,則共有32+16 (系統異常)=48 個 向量,向上圓整到2 的整次冪后值為64,因此向量表重定位的地址必須能被64*4=256整除,從而 合法的起始地址可以是:0x0, 0x100, 0x200等。

表7.7   向量表偏移量寄存器(VTOR) (地址:0xE000_ED08 )

位段 名稱               類型 復位值           描述

7-28  TBLOFF        RW    0          向量表的起始地址
29    TBLBASE       R     -          向量表是在Code 區(0),還是在RAM區(1)


    每個外部中斷都在NVIC 的下列寄存器中“掛號”:
     使能與除能寄存器
     懸起與“解懸”寄存器
     優先級寄存器
     活動狀態寄存器
另外,下列寄存器也對中斷處理有重大影響
     異常掩蔽寄存器(PRIMASK, FAULTMASK 以及BASEPRI)
     向量表偏移量寄存器
     軟件觸發中斷寄存器
     優先級分組位段

cortex_m3 內核對於每一個外部中斷通道都有相應的控制字和控制位,用於單獨的和總
的控制該中斷通道。它們包括有:
z    中斷優先級控制字:PRI_n(上面提到的)
z    中斷允許設置位:在 ISER 寄存器中
z    中斷允許清除位:在 ICER 寄存器中
z    中斷懸掛 Pending(排隊等待)位置位:在 ISPR 寄存器中(類似於置中斷通道標志位)
z    中斷懸掛 Pending(排隊等待)位清除:在 ICPR 寄存器中(用於清除中斷通道標志位)
z    正在被服務(活動)的中斷(Active)標志位:在 IABR 寄存器中,(只讀,可以知道當
前內核正在處理哪個中斷通道)

中斷系統設置全過程的演示

    下面給出一個簡單的例子,以演示如何建立一個外部中斷。
    1.  當系統啟動后,先設置優先級組寄存器。缺省情況下使用組0 (7位搶占優先級,1位亞優
先級)。
    2. 如果需要重定位向量表,先把硬fault和NMI服務例程的入口地址寫到新表項所在的地址中。
    3.  配置向量表偏移量寄存器,使之指向新的向量表(如果有重定位的話)
    4.  為該中斷建立中斷向量。因為向量表可能已經重定位了,保險起見需要先讀取向量表偏移
量寄存器的值,再根據該中斷在表中的位置,計算出對應的表項,再把服務例程的入口地址填寫進

去。如果一直使用ROM中的向量表,則無需此步驟。
    5.  為該中斷設置優先級。
    6.  使能該中斷

    如果應用程序儲存在ROM中,並且不需要改變異常服務程序,則我們可以把整個向量表編碼到
ROM的起始區域(從0地址開始的那段)。在這種情況下,向量表的偏移量將一直為0,並且中斷向量
一直在ROM中,因此上例可以大大簡化,只需3步:
    1.  建立優先級組
    2.  為該中斷指定優先級
    3.  使能該中斷
    如果在I/O密集型系統中,軟件需要控制大量的硬件設備,則可能必須要考慮如下因素:
     該芯片支持的中斷數
     該芯片中表達優先級的位數

對於stm32,實現了16個異常(其中6個保留),實現了60個中斷,所以就有兩個中斷設置使能寄存器ISER0和ISER1,每個可以控制32個中斷的使能,也有兩個中斷清除寄存器ICER0和ICER1.例如RTC中斷,向量位置為3,即RTC向量地址為4*(16+3)= 0x4C位置.要實現RTC中斷處理,首先在啟動文件中0x4C位置放入RTC_IRQHandler()函數的首地址,(keil編譯器自動生成)然后ISER0 |= (0x01 << 3);即可.

      如果要產生中斷,必須事先配置好並使能中斷線。根據需要的邊沿檢測設置2個觸發寄存器,同
       時在中斷屏蔽寄存器的相應位寫’1’  允許中斷請求。當外部中斷線上發生了需要的邊沿時,將產
       生一個中斷請求,對應的掛起位也隨之被置’1’。在掛起寄存器的對應位寫’1’,可以清除該中斷
       請求。

       如果要為產生事件,必須事先配置好並使能事件線。根據需要的邊沿檢測通過設置2個觸發寄存
       器,同時在事件屏蔽寄存器的相應位寫’1’允許事件請求。當事件線上發生了需要的邊沿時,將
       產生一個事件請求脈沖,對應的掛起位不被置’1’。

       通過在軟件中斷/事件寄存器寫’1’,也可以通過軟件產生中斷/事件請求。

       硬件中斷選擇

       通過下面的過程來配置19個線路做為中斷源:

       ●  配置19個中斷線的屏蔽位(EXTI_IMR)

       ●  配置所選中斷線的觸發選擇位(EXTI_RTSR和EXTI_FTSR);

       ●  配置那些控制映像到外部中斷控制器(EXTI)的NVIC中斷通道的使能和屏蔽位,使得19個中
          斷線中的請求可以被正確地響應。

       硬件事件選擇

       通過下面的過程,可以配置19個線路為事件源

       ●  配置19個事件線的屏蔽位(EXTI_EMR)

       ●  配置事件線的觸發選擇位(EXTI_RTSR和EXTI_FTSR)

       軟件中斷/事件的選擇

       19個線路可以被配置成軟件中斷/事件線。下面是產生軟件中斷的過程:

       ●  配置19個中斷/事件線屏蔽位(EXTI_IMR, EXTI_EMR)

       ●  設置軟件中斷寄存器的請求位(EXTI_SWIER)

 

具體配置步驟:配置向量表(在時鍾初始化里面)

                    使能端口(A—G時鍾)

                    設置端口方向,上拉下拉

       使能IO復位時鍾RCC->APB2ENR

              配置外部中斷輸入源AFIO->EXTICR

              開啟line BITx上的中斷EXTI->IMR

              EXTI->FTSR或EXTI->RTSR上升沿或下降沿觸發

              設置分組SCB->AIRCR

              使能中斷位NVIC->ISER

              搶占優先級和響應優先級NVIC->IPR(不完全手冊68頁)
              最后中斷服務函數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM