記錄一下,方便以後翻閱~
主要內容:
1) nvic中斷優先順序分組;
2) nvic中斷優先順序設定。
官方資料:《stm32中文參考手冊v10》第9章——中斷和事件
1. nvic中斷優先順序分組
1.1 cm3核心支援256個中斷,其中包含16個核心中斷和240個外部中斷,並且具有256級的可程式設計中斷設定;
1.2 stm32並沒有使用cm3核心的全部東西,只用了它的一部分;
1.3 stm32有84個中斷,包括16個核心中斷和68個可遮蔽中斷,具有16級可程式設計的中斷優先順序;
1.4 stm32f103系列上面,又只有60個可遮蔽中斷(在107系列才有68個)。
2. nvic中斷優先順序向量表(stm32f10xx產品(非互聯型))
3. nvic中斷優先順序管理方法
3.1 對stm32中斷進行分組,組0~4。同時,對每個中斷設定乙個搶占優先順序和乙個響應優先順序值;
3.2 分組配置是在暫存器scb->aircr中配置:
3.3 分組配置是在暫存器scb->aircr中配置。
4. 搶占優先順序和響應優先順序區別
4.1 高優先順序(值越小越高)的搶占優先順序是可以打斷正在進行的低搶占優先順序中斷的;
4.2 搶占優先順序相同的中斷,高響應優先順序不可以打斷低響應優先順序的中斷;
4.3 搶占優先順序相同的中斷,當兩個中斷同時發生的情況下,高響應優先順序先執行;
4.4 如果兩個中斷的搶占優先順序和響應優先順序都是一樣的話,則看哪個中斷先發生就先執行。
舉例:
假定設定中斷優先順序組為2,
設定中斷3(rtc中斷)的搶占優先順序為2,響應優先順序為1;
設定中斷6(外部中斷0)的搶占優先順序為3,響應優先順序為0;
設定中斷7(外部中斷1)的搶占優先順序為2,響應優先順序為0。
那麼這3個中斷的優先順序順序為:中斷7>中斷3>中斷6。
**備註:**一般情況下,系統**執行過程中,只設定一次中斷優先順序分組,比如分組2,設定好分組之後一般不會再改變分組。隨意改變分組會導致中斷管理混亂,程式出現意想不到的執行結果。
5. 中斷優先順序分組函式:
void
nvic_prioritygroupconfig
(uint32_t nvic_prioritygroup)
//例如nvic_prioritygroupconfig(nvic_prioritygroup_2);//
6. mdk中nvic暫存器結構體
typedef
struct
nvic_type;
7. 每個中斷的優先順序設定1.1 中斷優先順序控制的暫存器組:ip[240] (全稱:interrupt priority registers)
240個8位暫存器,每個中斷使用乙個暫存器來確定優先順序。stm32f10x系列一共60個可遮蔽中斷,使用ip[59]~ip[0]。每個ip暫存器的高4位用來設定搶占和響應優先順序(根據分組),低4位沒有用到。
相關函式:
void
nvic_init
(nvic_inittypedef* nvic_initstruct)
;
7.2 中斷使能暫存器組:iser[8] (作用:用來使能中斷)
32位暫存器,每個位控制乙個中斷的使能。stm32f10x只有60個可遮蔽中斷,所以只使用了其中的iser[0]和iser[1]。iser[0]的bit0bit31分別對應中斷031。iser[1]的bit027對應中斷3259。
相關函式:
void
nvic_init
(nvic_inittypedef* nvic_initstruct)
;
7.3 中斷失能暫存器組:icer[8] (作用:用來失能中斷)
32位暫存器,每個位控制乙個中斷的失能。stm32f10x只有60個可遮蔽中斷,所以只使用了其中的icer[0]和icer[1]。icer[0]的bit0bit31分別對應中斷031。icer[1]的bit027對應中斷3259。
相關函式:
void
nvic_init
(nvic_inittypedef* nvic_initstruct)
;
7.4 中斷掛起控制暫存器組:ispr[8] (作用:用來掛起中斷)
7.5 中斷解掛控制暫存器組:icpr[8] (作用:用來解掛中斷)
和7.5涉及的部分相關函式//
static __inline void
nvic_setpendingirq
(irqn_type irqn)
;static __inline uint32_t nvic_getpendingirq
(irqn_type irqn)
;static __inline void
nvic_clearpendingirq
(irqn_type irqn)
;//以上函式位於core_cm3.**件中//
static __inline uint32_t nvic_getactive
(irqn_type irqn)
;
8. 中斷引數初始化函式解讀
void
nvic_init
(nvic_inittypedef* nvic_initstruct)
;typedef
struct
nvic_inittypedef;
//位於misc.**件中//
nvic_inittypedef nvic_initstructure;
nvic_initstructure.nvic_irqchannel = usart1_irqn;
//串列埠1中斷,中斷型別參考stm32f10x.h中的irqn_tpye;//
nvic_initstructure.nvic_irqchannelpreemptionpriority=1;
//搶占優先順序為1//
nvic_initstructure.nvic_irqchannelsubpriority=2;
//響應優先順序位2//
nvic_initstructure.nvic_irqchannelcmd= enable;
//irq通道使能//
nvic_init
(&nvic_initstructure)
;//根據上面指定的引數初始化nvic暫存器//
9. 中斷優先順序設定步驟9.1 系統執行後先設定中斷優先順序分組;
void
nvic_prioritygroupconfig
(uint32_t nvic_prioritygroup)
;//整個系統執行過程中,只設定一次中斷分組;//
9.2 針對每個中斷,設定對應的搶占優先順序和響應優先順序;
void
nvic_init
(nvic_inittypedef* nvic_initstruct)
;
1)複習基於庫函式的初始化函式的一般格式,可參考stm32學習心得三:gpio實驗-基於庫函式;
2)複習暫存器位址,可參考stm32學習心得四:gpio實驗-基於暫存器和stm32學習心得五:gpio實驗-基於位操作;
3)複習暫存器位址名稱對映,可參考stm32學習心得六:相關c語言學習及暫存器位址名稱對映解讀。
STM32學習心得(1)
學stm32的目的只是為了可以讓乙個電機轉動起來,哈哈哈是不是感覺沒什麼大目標。但是能讓電機轉起來就覺得很有成就感。我在學之前有的概念就是 pwm,can,輸入輸出啥的,然而卻並不知道是幹什麼的。前一段時間在 上買了一款stmf103的板子,買回來後裝了keil4花了好幾個小時,又花了好幾個小時配置...
stm32學習筆記 NVIC
這部分講的很好。misc.件其實就是stm32f10x nvic.h,nvic的主要操作都在其中,還包括systick的選擇源操作。core cm3檔案裡面是核心外設,當然包括nvic,l裡面包含nvic的暫存器操作。高達81個中斷,實際上是67stm外設中斷 60個settable,由庫函式int...
STM32學習筆記 五 NVIC
三 中斷程式設計 f407在核心水平上搭載了乙個異常響應系統,支援為數眾多的系統異常和中斷,其中系統異常有10個,中斷有82個。nvic是巢狀向量中斷控制器,控制著整個晶元中斷相關的功能,它跟核心緊密耦合,是核心裡面的乙個外設。在配置中斷的時候一般只用iser icer和ip這三個暫存器,iser用...