我們的stm32中斷支援巢狀中斷,比如正在執行優先順序為2的中斷的中斷服務程式,然後現在來了乙個優先順序為1的中斷,那麼會跳到優先順序為1的中斷的中斷服務程式中去執行,執行完再返回優先順序為2的中斷的中斷服務程式,根據中斷型別可以分為系統異常(比如systick)和外部中斷,見下圖,灰色部分為系統異常,白色部分為外部中斷,數字越低優先順序越高
看到上面這麼多複雜的中斷,總得有乙個控制器來管理它們,這個控制器就叫做nvic,nvic全名叫巢狀向量中斷控制器,屬於核心外設,管理著包括核心和片上所有外設的中斷相關的功能,涉及的兩個檔案有core_cm3.h和misc.h
在core_cm3.h對nvic_type的定義
typedef
struct
nvic_type;
中斷優先順序的設定
中斷優先順序由nvic->iprx來設定,它的高4位用來設定優先順序,低4位不用,高4位的優先還包括主優先順序和子優先順序,看乙個中斷優先順序的大小順序為主優先順序》子優先順序》硬體中斷編號(中斷向量表的位置)
除此之外我們的優先順序還分組,見下圖是組別在misc.h中的預處理,
當我們設定某個組時,後面對應的數值會寫到scb->aircr暫存器的prigroup位中
scb->aircr暫存器
中斷程式設計的要點
1 使能中斷請求
首先要使能外設暫存器中的中斷請求,還要使能nvic中的中斷(nvic_type->iser),要是你nvic在的中斷不使能,cpu是無法相應你的外設中斷的
2 配置中斷優先順序分組
呼叫msic.c裡面的nvic_prioritygroupconfig函式設定中斷優先順序分組,將中斷優先順序分組寫到 scb->aircr的prigroup位中
3 配置nvic暫存器,初始化nvic_inittypedef;
看到misc.h對這個nvic_inittypedef的定義
nvic_irqchannel:表示中斷觸發源,在stm32f103x.h裡面irqn_type列舉體有定義,中斷小門,對於列舉型別的用法可參考以下的連線
nvic_irqchannelpreemptionpriority:主優先順序
nvic_irqchannelsubpriority:子優先順序
nvic_irqchannelcmd:使能nvic中斷,才能通知cpu進入中斷,中斷大門,
最後呼叫misc.c中的nvic_init(nvic_inittypedef* nvic_initstruct)註冊
4 程式設計中斷服務程式
中斷服務函式的名字應該與中斷向量表中的中斷入口函式名字一致,寫錯也不會報錯但是不能滿足我們需求,為了更好的管理中斷服務我們把中端服務函式寫在stm32f10x_it.c裡面,
stm32中斷優先順序 STM32中斷系統
stm32 中斷非常強大,幾乎每個外設都可以產生中斷,因此這裡我們單獨使用一章來介紹它,為後面介紹外設中斷做鋪墊。學習本章可以參考 stm32f10x中文參考手冊 9 中斷和事件章節,cortex m3 權威指南 中文 chpt08 nvic與中斷控制章節。中斷概念 在學習 51 微控制器時,我們就...
STM32中斷巢狀
cortex m3核心支援256個中斷,其中包括16個核心中斷和240個外部中斷,且具有256級的可程式設計中斷設定,而stm32只用了其中一部分。stm32有84個中斷,包括16個核心中斷和68個可遮蔽中斷,具有16級可程式設計中斷優先順序。而我所使用的103系列只有60個可遮蔽中斷。優先順序的判...
STM32 中斷使用
stm32中斷有時候用多了容易亂,特此記錄一下,因為之前一直是m3 m0交叉用,韌體庫有些區別容易弄混,這裡說一下m3外部中斷的配置 步驟 1.將對應的io配置為輸入 2.將io對應的中斷的優先等級用nvic配置好 3.設定好對應io的中斷模式和觸發方式 4.將io所屬的中斷線設為中斷輸入源 1 以...