下面是他吹的:
● 高達68中斷
●一個0-15的可編程每個中斷的優先級。一個更高的層次對應一個
低優先級的,所以0級是最高的中斷優先級
●等級和脈沖中斷信號的檢測
●動態的優先次序加以重訂的中斷
●成組的優先級和次優先領域的優先級值分組
●中斷尾部鏈接
●外部非屏蔽中斷(NMI)
處理器自動進入異常堆棧其狀態和unstacks這種狀態上
異常退出,無需額外指令開銷。這提供了低延遲的異常處理。
說別的沒用底下這個表的重要程度在于不看他都很難理解寄存器啥意思,記住Table34
使用中要用這個表和底下的寄存器進行對比,佐照。才會發現要的東西
看了這個表請不要問這些寄存器都是那個中斷的。
就相當于你看了一個坑你還向里跳一樣愚蠢!
上面的這個表非常重要。。。。。。。。。。。。!
1.
中斷設置啟用寄存器(NVIC_ISERx)
SETENA[31:0]:中斷使能位
Write:
0: No effect
1: Enable interrupt
Read:
0: Interrupt disabled
1: Interrupt enabled.
如果待處理的中斷使能,NVIC激活基于其優先級的中斷。如果一個
中斷被禁止,聲稱其中斷信號改變中斷狀態為掛起,
但從未激活了NVIC中斷,無論其優先級
這才明白啥叫掛起,原來如此
2.
中斷關閉使能寄存器(NVIC_ICERx)
Bits 31:0 CLRENA[31:0]: Interrupt clear-enable bits.
Write:
0: No effect
1: Disable interrupt
Read:
0: Interrupt disabled
1: Interrupt enabled.
3.
中斷掛起開啟寄存器(NVIC_ISPRx)
Bits 31:0 SETPEND[31:0]: Interrupt set-pending bits
Write:
0: No effect
1: Changes interrupt state to pending
Read:
0: Interrupt is not pending
1: Interrupt is pending
4.
中斷掛起關閉寄存器 (NVIC_ICPRx)
Bits 31:0 CLRPEND[31:0]: Interrupt clear-pending bits
Write:
0: No effect
1: Removes the pending state of an interrupt
Read:
0: Interrupt is not pending
1: Interrupt is pending
5.
中斷標志寄存器(NVIC_IABRx)
Bits 31:0 ACTIVE[31:0]: Interrupt active flags
0: Interrupt not active
1: Interrupt active
6.
中斷優先級寄存器(NVIC_IPRx)
這個圖表示17個字,每個字32位,每8位表示一個中斷的優先級代碼,共68個中斷。
每個中斷的優先級的值范圍是0~255,值越低,相應的優先級越高,值得注意的的是CORTEX-M3 只有16個優先級,所以當設置優先級時只有位【7:4】有效,而【3:0】保持為0.以此類推。
總結:中斷優先級寄存器通俗的說就是:
Cortex-m3不是有68個中斷嗎,那么把這68個中斷分成17組,一組是4個中斷,然后再把一個中斷賦予8位數據值,就是4*8=32位,正好一個“字”,也就是說4個中斷要一個字,那么68個中斷要68/4=17個字,然后看下圖18,正好是IPR0~IPR16,17個字。
你分組為了啥?不就是要設置中斷優先級嗎!那么他的值有多大?0~255,8bit嗎!但是問題是這個處理器他沒有這么多的優先級,他有多少?只有0~15個,咋辦?他是采取了表35的做法,一個中斷優先級的值是8位,我屏蔽低4位,保留高4位,哎!正好,4位可以表示0~15之間的數據,正好和我們要的不沖突,真好吻合。就是這個結果。我的理解是這樣的!!!
7.
軟件觸發中斷寄存器(NVIC_STIR)
INTID【8-0】:這個就是說你可以設置軟件中斷的中斷號,比如說你向里面寫入“000000011”就產生一個IRQ3的軟件中斷,但是這個中斷值是0~239之間的!!
附表:
完
于天津第四項目部 //