|
croiwgf1agw6402675032.gif (1.67 KB, 下載次數(shù): 0)
下載附件
保存到相冊
croiwgf1agw6402675032.gif
2024-8-20 11:40 上傳
8 }" z* A+ t6 h; t+ H0 g
點(diǎn)擊上方名片關(guān)注了解更多% b" f0 F8 ?/ s$ h
3 G) i) F9 [2 l3 _來源 | 技術(shù)社區(qū)
' z8 Y6 \0 L; D+ o, r, E很多同學(xué)都存在這樣的疑惑:如果外部中斷來的頻率足夠快,上一個(gè)中斷沒有處理完成,新來的中斷該如何處理?' D, q' F/ S6 G4 s$ O( [& D
中斷一般是由硬件(例如外設(shè)、外部引腳)產(chǎn)生,當(dāng)某種內(nèi)部或外部事件發(fā)生時(shí),MCU的中斷系統(tǒng)將迫使 CPU 暫停正在執(zhí)行的程序,轉(zhuǎn)而去進(jìn)行中斷事件的處理,中斷處理完畢后,又返回被中斷的程序處,繼續(xù)執(zhí)行下去,所有的Cortex-M 內(nèi)核系統(tǒng)都有一個(gè)用于中斷處理的組件NVIC,主要負(fù)責(zé)處理中斷,還處理其他需要服務(wù)的事件。嵌套向量式中斷控制器(NVIC: Nested Vectored Interrupt Controller)集成在Cortex-M0處理器里,它與處理器內(nèi)核緊密相連,并且提供了中斷控制功能以及對系統(tǒng)異常的支持。0 G" X+ ?& R) K: M3 }% X, s
處理器中的NVIC能夠處理多個(gè)可屏蔽中斷通道和可編程優(yōu)先級(jí),中斷輸入請求可以是電平觸發(fā),也可以是最小的一個(gè)時(shí)鐘周期的脈沖信號(hào)。每一個(gè)外部中斷線都可以獨(dú)立的使能、清除或掛起,并且掛起狀態(tài)也可以手動(dòng)地設(shè)置和清除。
. D! V% ~, t$ H4 {7 z主程序正在執(zhí)行,當(dāng)遇到中斷請求(Interrupt Request)時(shí),暫停主程序的執(zhí)行轉(zhuǎn)而去執(zhí)行中斷服務(wù)例程(Interrupt Service Routine,ISR),稱為響應(yīng),中斷服務(wù)例程執(zhí)行完畢后返回到主程序斷點(diǎn)處并繼續(xù)執(zhí)行主程序。多個(gè)中斷是可以進(jìn)行嵌套的。正在執(zhí)行的較低優(yōu)先級(jí)中斷可以被較高優(yōu)先級(jí)的中斷所打斷,在執(zhí)行完高級(jí)中斷后返回到低級(jí)中斷里繼續(xù)執(zhí)行,采用“咬尾中斷”機(jī)制。 }0 k3 ^0 P0 D1 w, h. G* I
f2d2m1rz5lc6402675132.png (82.75 KB, 下載次數(shù): 0)
下載附件
保存到相冊
f2d2m1rz5lc6402675132.png
2024-8-20 11:40 上傳
9 Y" L! {2 S Q5 H! M
內(nèi)核中斷(異常管理和休眠模式等),其中斷優(yōu)先級(jí)則由SCB寄存器來管理,IRQ的中斷優(yōu)先級(jí)是由NVIC來管理。: `# D+ G6 j* X; w
NVIC的寄存器經(jīng)過了存儲(chǔ)器映射,其寄存器的起始地址為0xE000E100,對其訪問必須是每次32bit。/ O3 A2 u2 S) b7 G3 ~2 L
SCB寄存器的起始地址:0xE000ED00,也是每次32bit訪問,SCB寄存器主要包含SysTick操作、異常管理和休眠模式控制。# Q. `" d; F, [2 r& y1 P
NVIC具有以下特性:
& O b5 X$ I+ b- f+ ?靈活的中斷管理:使能\清除、優(yōu)先級(jí)配置硬件嵌套中斷支持向量化的異常入口中斷屏蔽1. 中斷使能和清除使能' M$ F" M$ Q6 `+ S5 d" j( F2 ^) r
arm將處理器的中斷使能設(shè)置和清除設(shè)置寄存器分在兩個(gè)不同的地址,這種設(shè)計(jì)主要有如下優(yōu)勢:一方面這種方式減少了使能中斷所需要的步驟,使能一個(gè)中斷NVIC只需要訪問一次,同時(shí)也減少了程序代碼并且降低了執(zhí)行時(shí)間,另一方面當(dāng)多個(gè)應(yīng)用程序進(jìn)程同時(shí)訪問寄存器或者在讀寫操作寄存器時(shí)有操作其他的中斷使能位,這樣就有可能導(dǎo)致寄存器丟失,設(shè)置和清除分成兩個(gè)寄存器能夠有效防止控制信號(hào)丟失。" I) f- M* Q/ C7 b) `& B
5w1155daayn6402675232.png (8.11 KB, 下載次數(shù): 0)
下載附件
保存到相冊
5w1155daayn6402675232.png
2024-8-20 11:40 上傳
, g8 K, q( X( }9 {( G& v因此我可以獨(dú)立的操作每一個(gè)中斷的使能和清除設(shè)置。& }/ }3 c. Z$ G7 e, p" c% C+ s1 a `
1.1 C代碼*(volatile unsigned long) (0xE000E100) = 0x4 ; //使能#2中斷& _2 R" K- m* ~* F7 r5 _, J8 @
*(volatile unsigned long) (0xE000E180) = 0x4 ; //清除#2中斷1.2 匯編代碼__asm void Interrupt_Enable()/ Q5 e3 Q0 [8 T- |
{
7 U3 u, U8 d9 u1 \5 ^ LDR R0, =0xE000E100 ; //ISER寄存器的地址
5 B8 v8 ^9 g0 u% Y3 H+ t MOVS R1, #04 ; //設(shè)置#2中斷
$ I @1 ]+ {9 U( I! @ STR R1, [R0] ; //使能中斷#23 X9 p2 K' m5 J# h
}; X; y/ R$ N& K' K1 r4 d
__asm void Interrupt_Disable()) w7 Z" K$ m& ] m0 ]
{) E7 V. w; \7 e1 Z: u+ Y
LDR R0, =0xE000E180 ; //ICER寄存器的地址
* _& j+ H8 q6 z( j& G% W+ K% R MOVS R1, #04 ; //設(shè)置#2中斷6 @2 j( w, `/ m9 N2 T* F
STR R1, [R0] ; //使能中斷#2# a4 E2 }) h5 j
}1.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)//使能中斷#IRQn
) k( @4 w9 O* E: N__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
+ o9 T6 w7 v, E3 V{+ I+ S$ B, ~4 k8 W1 T+ v; G4 V
if ((int32_t)(IRQn) >= 0) {) m/ `# H9 ?! w" ^) k- g
NVIC->ISER[0U] = (uint32_t)(1UL = 0) {
$ u0 D, j- H2 e% d$ e NVIC->ICER[0U] = (uint32_t)(1UL = 0) {
* w" y6 x* i. s8 J4 i return((uint32_t)(((NVIC->ISER[0U] & (1UL 2. 中斷掛起和清除掛起
! m* G/ I5 w5 e5 q( `/ S( W- E- V如果一個(gè)中斷發(fā)生了,卻無法立即處理,這個(gè)中斷請求將會(huì)被掛起。掛起狀態(tài)保存在一個(gè)寄存器中,如果處理器的當(dāng)前優(yōu)先級(jí)還沒有降低到可以處理掛起的請求,并且沒有手動(dòng)清除掛起狀態(tài),該狀態(tài)將會(huì)一直保持。
5 e' o* x1 k5 p0 l5 d" c可以通過操作中斷設(shè)置掛起和中斷清除掛起兩個(gè)獨(dú)立的寄存器來訪問或者修改中斷掛起狀態(tài),中斷掛起寄存器也是通過兩個(gè)地址來實(shí)現(xiàn)設(shè)置和清除相關(guān)位。這使得每一個(gè)位都可以獨(dú)立修改,并且無需擔(dān)心在兩個(gè)應(yīng)用程序進(jìn)程競爭訪問時(shí)出現(xiàn)的數(shù)據(jù)丟失。8 X. d) Z2 t4 c6 Q8 W: W
0odu5vlkhyc6402675332.png (8.7 KB, 下載次數(shù): 0)
下載附件
保存到相冊
0odu5vlkhyc6402675332.png
2024-8-20 11:40 上傳
: _; @2 m7 N/ K" B0 U+ E+ F; E
中斷掛起狀態(tài)寄存器允許使用軟件來觸發(fā)中斷。如果中斷已經(jīng)使能并且沒有被屏蔽掉,當(dāng)前還沒有更高優(yōu)先級(jí)的中斷在運(yùn)行,這時(shí)中斷的服務(wù)程序就會(huì)立即得以執(zhí)行。2.1 C代碼*(volatile unsigned long)(0xE000E100) = 0x4 ; //使能中斷#28 ^+ k D" v- C- X2 q. z
*(volatile unsigned long)(0xE000E200) = 0x4 ; //掛起中斷#27 {1 Z( ?7 o( h0 z) i1 c) J
*(volatile unsigned long)(0xE000E280) = 0x4 ; //清除中斷#2的掛起狀態(tài)2.2 匯編代碼__asm void Interrupt_Set_Pending()9 O- M# @+ j7 E K
{6 c; C @: o" r' P2 G R
LDR R0, =0xE000E100 ; //設(shè)置使能中斷寄存器地址
: z, _8 O7 Y7 f/ l9 d MOVS R1, #0x4 ; //中斷#2
( `5 \& B( N3 x: v STR R1, [R0] ; //使能#2中斷! G( I0 ?: `$ s! ?2 E. @- E0 L
LDR R0, =0xE000E200 ; //設(shè)置掛起中斷寄存器地址- C, O" Z. \2 P. Y7 B. P* S" w: \
MOVS R1, #0x4 ; //中斷#2
" A, \# T7 z9 r6 E STR R1, [R0] ; //掛起#2中斷% b3 t* ]- M$ M: M5 Q% T. [" N
}
. {- A, S- m! ~$ t( ]__asm void Interrupt_Clear_Pending()
6 F8 g8 c5 j% J u/ C9 Y{
: w5 h' Z4 b. @1 v# e LDR R0, =0xE000E100 ; //設(shè)置使能中斷寄存器地址
7 P0 P& }( @7 P) `( c8 i; j1 Z MOVS R1, #0x4 ; //中斷#2" `) w# l1 W7 L- s
STR R1, [R0] ; //使能#2中斷: | g) K6 d- Y @ ^" v& U
LDR R0, =0xE000E280 ; //設(shè)置清除中斷掛起寄存器地址
3 ~! h1 g7 A) I2 _8 H( e3 | MOVS R1, #0x4 ; //中斷#2; @1 c4 p$ N5 a a" G# `" e/ n5 L/ a9 C
STR R1, [R0] ; //清除#2的掛起狀態(tài)
: A0 ~, F0 u! E$ Z5 E F3 x! v8 l% J}2.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)//設(shè)置一個(gè)中斷掛起9 J l% O9 E2 ~+ c
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
$ [+ P* f- T% ]' [# h+ k{
+ L5 _; w/ S+ Y. @, [! y if ((int32_t)(IRQn) >= 0) {
( K0 B, U* ~8 Y" k! e. ? NVIC->ISPR[0U] = (uint32_t)(1UL = 0) {1 p0 ^' R. E- D/ q0 g! r- E
NVIC->ICPR[0U] = (uint32_t)(1UL = 0) {! w; _" V0 n' s5 {0 V% A, U
return((uint32_t)(((NVIC->ISPR[0U] & (1UL NVIC屬于處理器內(nèi)核部分,因此在MM32 MCU芯片的用戶手冊中只有簡單的提及,沒有重點(diǎn)講述,需要深入了解相關(guān)寄存器和功能需要參考《Cortex-M0技術(shù)參考手冊》。
. g$ P4 E" @7 L) X- G
kstcr1bnong6402675432.jpg (281.39 KB, 下載次數(shù): 0)
下載附件
保存到相冊
kstcr1bnong6402675432.jpg
2024-8-20 11:40 上傳
. H. e% P' }' j4 C
0mtna2b22ym6402675532.jpg (168.38 KB, 下載次數(shù): 0)
下載附件
保存到相冊
0mtna2b22ym6402675532.jpg
2024-8-20 11:40 上傳
* f+ ?: F+ A1 b+ J0 K
聲明:5 @/ x3 L0 d; _' @& \, x
聲明:本號(hào)對所有原創(chuàng)、轉(zhuǎn)載文章的陳述與觀點(diǎn)均保持中立,推送文章僅供讀者學(xué)習(xí)和交流。文章、圖片等版權(quán)歸原作者享有,如有侵權(quán),聯(lián)系刪除。投稿/招聘/推廣/宣傳 請加微信:woniu26a推薦閱讀▼
; ] R& Y0 |1 f$ S( `$ b電路設(shè)計(jì)-電路分析
. G9 S. z: O, h' x4 j# [7 qemc相關(guān)文章
, E4 i: a" r$ t6 U( a電子元器件
. z8 Z* a' f D# X4 H后臺(tái)回復(fù)“加群”,管理員拉你加入同行技術(shù)交流群。 |
|