STM32學習 異常與中斷

2021-07-24 06:08:17 字數 3124 閱讀 6235

cortex-m3 有16個異常(實際只用15個,也叫核心中斷),並提供240個外部中斷(針對核心來講),有3個優先順序最高的不可遮蔽異常,即1~3號異常。

f1中最多持68個可遮蔽中斷(即核心中在外部中斷),對應68個中斷源。如usart1對應37#中斷,但有多種條個可以觸發該中斷,如讀完成、寫完成、溢位等等都可以觸發同乙個中斷源,進入中斷函式後需根據狀態位再判斷具體中斷原因。

stm32中斷設定中,我們常用6組暫存器。

分別為:

iser[8]:中斷使能暫存器組,8個32位的暫存器對應stm32中支援的256個中斷源,雖然f1沒有使用這麼多,但也把位址空間留出來以備後續器件擴充套件,以下暫存器組相同。你要使能某個中斷,必須設定相應的 iser 位為 1,使該中斷被使能(這裡僅僅是使能,後續還需中斷分組、遮蔽、優先組設定、 io 口對映等設定才算是乙個完整的中斷設定)。

icer[8]:中斷除能暫存器組。該暫存器組與 iser 的作用恰好相反,是用來清除某個中斷的使能的。專門設定乙個 icer 來清除中斷位,而不是向 iser 寫 0 來清除,是因為 nvic 的這些寄

存器都是寫 1 有效的,寫 0 是無效的。這是因為通過這種方式,使能/除能中斷時只需把「當事位」寫成1,其它的位可以全部為零。再也不用像以前那樣,害怕有些位被寫入 0 而破壞其對應的中斷設定(寫 0 沒有效果),從而實現每個中斷都可以自顧地設定,而互不侵犯——只需單一的寫指令,不再需要讀‐改‐寫。

ispr[8]:中斷掛起控制暫存器組,可以將正在進行的中斷掛起,而執行同級或更高階別的中斷。寫 0 無效。

icpr[8]:中斷解掛控制暫存器組。其作用與 ispr 相反,對應位也和 iser 是一樣的。通過設定 1,可以將掛起的中斷接掛。寫 0 無效。

iabr[8]:中斷啟用標誌位暫存器組。如果為 1,則表示該位所對應的中斷正在被執行。它是唯讀暫存器,通過它可以知道當前在執行的中斷是哪乙個。在中斷執行完了由硬體自動清零。

ip[240]:中斷優先順序控制的暫存器組。ip 暫存器組由 240 個 8bit 的暫存器組成,每個可遮蔽中斷占用 8bit(只用到高4位), 同樣總共可以表示 240 個可遮蔽中斷f1中只用到68個。

cortex-m3 的中斷管理將優先順序分為搶占優先順序和子優先順序。

搶占優先順序高的中斷可以打斷搶占優先順序低的中斷,子優先順序不具備這個能力,但若搶占優先順序相同的兩個中斷同時掛起時,會先響應子優先順序的中斷。

cortex-m3在實現這兩種優先順序時,提供一種分組機制來分配搶占優先順序和子優先順序的數量。在stm32f1中,通過scb->aircr 中的中斷分組設定來決定。

stm32 將中斷分為 5 個組,組 0~4。該分組的設定是由 scb->aircr 暫存器的 bit10~8 來定義的。具體的分配關係如下表。

stm32使用4位分配優先組,表示最大支援16級中斷巢狀。

設定中斷優先順序步驟:

1. 設定中斷分組在需操作scb->aircr暫存器,按上表進行分組。在操作scb->aircr時應寫入鑰匙在scb->aircr高4位寫入鑰匙,0x05fa。也可直接使用庫函式進行操作。

2. 中斷分組完成後,可操作iser和ip暫存器組,使能中斷源,分配優先順序即可。

在庫檔案stm32f10x.s中可看到中斷向量表。

area reset, data, readonly ; 定義唯讀資料段,實際上是在code區(假設stm32從flash啟動,則此中斷向量表起始位址即為0x8000000)

export  __vectors

import os_cpu_systickhandler

import os_cpu_pendsvhandler

__vectors dcd __initial_sp ; top of stack

dcd reset_handler ; reset handler

dcd nmi_handler ; nmi handler

dcd hardfault_handler ; hard fault handler

dcd memmanage_handler ; mpu fault handler

dcd busfault_handler ; bus fault handler

dcd usagefault_handler ; usage fault handler

……………………………………………………………

表中順序與中斷號一一對應。

器件上電後根據boot引腳來決定pc位置,如果boot設定為flash啟動,則啟動後pc跳到0x08000000。此時cpu會先取2個位址,第乙個是棧頂位址,第二個是復位異常位址,跳到reset_handler。這些位址與keil裡面設定的target->flash起始位址相關,由編譯器確定,其中引數不能隨意改動。

預設情況下,從flash啟動,中斷向量表從flash的起始位址(0x08000000)開始存放。同時對映到0x00000000處。向量表偏移暫存器(vtor)的值為0x00000000(實際對映到0x08000000)。

若從sram啟動,中斷向量表還是存放在flash中(flash才能固化儲存,sram只能加電才有效),只不過拷貝到sram的首位址0x20000000處。此時向量表偏移暫存器(vtor)的值也是0x00000000(實際對映到0x20000000)。而啟動過程結束後,這個特殊的對映不復存在了(據參考手冊推測的),所以,需要修改向量表偏移暫存器(vtor)的值為0x20000000以後的值(其中tbloff位域要是0x200的倍數,這個是字對齊的要求(見《cortex-m3程式設計手冊》),由於stm32的中斷向量一共有68+16=84個,應該把這個數增加到下乙個2的整數倍即128,然後換算成位址範圍128*4=512,就得到了0x200),以便處理中斷。因此,無論用哪種模式啟動,復位時棧頂指標總能在0x00000000(或0x08000000)處找到,而復位向量總能在0x00000004(或0x08000004)處找到。

STM32之中斷和異常

1 stm32的所有gpio都可以用作外部中斷源的輸入端,用來捕捉外部訊號,可以配置為下降沿中斷 上公升沿中斷和上公升下降沿中斷三種模式。2 cortex核心具有很強大的異常響應系統,它把能夠打斷當前 執行流程的時間分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,...

STM32學習 外部中斷

先聊聊題外話,學習stm32,我大多從了解功能 框圖到暫存器定義,然後在使用方法 配置步驟。其實配置時使用庫函式是相當方便的,甚至可以不用看暫存器,但為深入了解一下,有時還是會多看看,而了解其方法脈絡後再使用庫函式更方便,只需查相應的庫函式手冊即可。stm32的外部中斷資源豐富 使用靈活。在f1系統...

STM32外部中斷

一 基本概念 arm coetex m3核心共支援256個中斷,其中16個內部中斷,240個外部中斷和可程式設計的256級中斷優先順序的設定。stm32目前支援的中斷共84個 16個內部 68個外部 還有16級可程式設計的中斷優先順序的設定,僅使用中斷優先順序設定8bit中的高4位。stm32可支援...