電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 169|回復(fù): 0
收起左側(cè)

單片機(jī)中斷程序,如何被中斷?

[復(fù)制鏈接]

531

主題

531

帖子

3817

積分

四級會員

Rank: 4

積分
3817
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-8-19 07:42:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

% K; f* N- H& x' }7 @( n7 w, |& \! R點(diǎn)擊上方名片關(guān)注了解更多
/ z5 Y  |0 s& f6 p7 S
6 A2 S5 v0 Q: X6 o來源 | 技術(shù)社區(qū)9 J0 ]* ~$ N" M/ M& b  q- p& r& |- M
很多同學(xué)都存在這樣的疑惑:如果外部中斷來的頻率足夠快,上一個(gè)中斷沒有處理完成,新來的中斷該如何處理?+ v1 {" v& ^( B3 F
中斷一般是由硬件(例如外設(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)異常的支持。
, o5 `! v( V0 }: D& ^, Q處理器中的NVIC能夠處理多個(gè)可屏蔽中斷通道和可編程優(yōu)先級,中斷輸入請求可以是電平觸發(fā),也可以是最小的一個(gè)時(shí)鐘周期的脈沖信號。每一個(gè)外部中斷線都可以獨(dú)立的使能、清除或掛起,并且掛起狀態(tài)也可以手動(dòng)地設(shè)置和清除。$ E3 b% U) S4 D& @+ G; I+ B& t( e7 p
主程序正在執(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)先級中斷可以被較高優(yōu)先級的中斷所打斷,在執(zhí)行完高級中斷后返回到低級中斷里繼續(xù)執(zhí)行,采用“咬尾中斷”機(jī)制。
  I) b$ w2 |- q2 e/ Y# W
4 D8 |% W1 f" b* [/ V5 d內(nèi)核中斷(異常管理和休眠模式等),其中斷優(yōu)先級則由SCB寄存器來管理,IRQ的中斷優(yōu)先級是由NVIC來管理。: ^6 w/ I% `, R! |- C! o2 `
NVIC的寄存器經(jīng)過了存儲器映射,其寄存器的起始地址為0xE000E100,對其訪問必須是每次32bit。
" h8 [8 q" H8 h; @SCB寄存器的起始地址:0xE000ED00,也是每次32bit訪問,SCB寄存器主要包含SysTick操作、異常管理和休眠模式控制。
* E+ q: |" x1 J* r7 `- bNVIC具有以下特性:; Q" q$ v8 C8 ~! b; |
靈活的中斷管理:使能\清除、優(yōu)先級配置硬件嵌套中斷支持向量化的異常入口中斷屏蔽1. 中斷使能和清除使能2 h6 x, ~6 X: J* Z7 I& x
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è)寄存器能夠有效防止控制信號丟失。
, B) a& D9 W1 Q- ^9 a
- W% j8 c; x6 T" P! [. ~因此我可以獨(dú)立的操作每一個(gè)中斷的使能和清除設(shè)置。2 ~+ M4 }, {& B* K# @  O" X2 B
1.1 C代碼*(volatile unsigned long) (0xE000E100) = 0x4 ; //使能#2中斷
  i" @2 `3 D9 e6 w*(volatile unsigned long) (0xE000E180) = 0x4 ; //清除#2中斷1.2 匯編代碼__asm void Interrupt_Enable()
$ j5 a8 v$ K/ `- M1 d+ m8 j: p{+ s! A* J! L, N* c, P+ ?
LDR R0, =0xE000E100  ;  //ISER寄存器的地址9 h% l( r  P5 U5 f1 `( g
MOVS R1, #04         ;  //設(shè)置#2中斷
' ^- }; ]1 V7 C1 ?7 T. I- ], E STR R1, [R0]         ;  //使能中斷#2
' q9 F2 M0 m6 [}4 T6 U, U2 E& R. e; R
__asm void Interrupt_Disable()$ [0 s0 l# Z4 j7 i/ V
{" {5 `, o6 ~8 B$ l0 r; _/ A& J
LDR R0, =0xE000E180  ;  //ICER寄存器的地址
' Z  l6 C# [# \; G% c$ `5 | MOVS R1, #04         ;  //設(shè)置#2中斷! k) V6 K3 A  s6 q5 Y- {
STR R1, [R0]         ;  //使能中斷#23 U% S7 e) E4 x. {+ I! x% m: T
}1.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)//使能中斷#IRQn
% ]+ s1 `8 y' W2 e) u/ c& e- ~3 u# D__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
7 z/ d2 m7 f  G: L{
* B" j4 s* c: [  p: _0 a4 b' ]. K/ g( b    if ((int32_t)(IRQn) >= 0) {
# ]9 T) ?8 }( X8 X        NVIC->ISER[0U] = (uint32_t)(1UL = 0) {
* I. [; @: [6 Q$ p$ T7 p. e6 E$ r( z        NVIC->ICER[0U] = (uint32_t)(1UL = 0) {
/ g! C- U) m' x' Z+ B6 M) W# }        return((uint32_t)(((NVIC->ISER[0U] & (1UL 2. 中斷掛起和清除掛起; e* e0 D: _9 t
如果一個(gè)中斷發(fā)生了,卻無法立即處理,這個(gè)中斷請求將會被掛起。掛起狀態(tài)保存在一個(gè)寄存器中,如果處理器的當(dāng)前優(yōu)先級還沒有降低到可以處理掛起的請求,并且沒有手動(dòng)清除掛起狀態(tài),該狀態(tài)將會一直保持。
, r- ~( l( D" f' C* O可以通過操作中斷設(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ù)丟失。# ~7 J! q: W4 ~6 X" h! S! ?* U, D1 N

* P8 m! v, P2 j8 T中斷掛起狀態(tài)寄存器允許使用軟件來觸發(fā)中斷。如果中斷已經(jīng)使能并且沒有被屏蔽掉,當(dāng)前還沒有更高優(yōu)先級的中斷在運(yùn)行,這時(shí)中斷的服務(wù)程序就會立即得以執(zhí)行。2.1 C代碼*(volatile unsigned long)(0xE000E100) = 0x4 ; //使能中斷#2
0 o0 q- R5 d+ h4 A9 p, Y*(volatile unsigned long)(0xE000E200) = 0x4 ; //掛起中斷#2" k5 V& f; D2 y/ F# v/ y- l
*(volatile unsigned long)(0xE000E280) = 0x4 ; //清除中斷#2的掛起狀態(tài)2.2 匯編代碼__asm void Interrupt_Set_Pending()
; s$ k1 E) _& b2 N  i  V$ j  L8 G# H{
6 }  j+ p! n# R& x1 S- f LDR R0, =0xE000E100   ;  //設(shè)置使能中斷寄存器地址
3 u- M7 L8 u  v5 X) o9 v0 ~ MOVS R1, #0x4         ;  //中斷#2
6 W% M3 b% U% h' H" Z3 Z STR R1, [R0]          ;  //使能#2中斷
* s3 m' p/ h/ _0 g& V+ u: B* H LDR R0, =0xE000E200   ; //設(shè)置掛起中斷寄存器地址+ f4 g0 k- J8 [" I
MOVS R1, #0x4         ;  //中斷#2
- [$ U) {% A, x6 x3 a5 e5 N2 x STR R1, [R0]          ;  //掛起#2中斷, d! Q6 ^9 T% e  H% m
}
# x7 }' N3 \; M7 T9 `$ R__asm void Interrupt_Clear_Pending()
9 q8 M1 r' f. j8 z' p{
) P1 i& `5 \& [) X! O5 w LDR R0, =0xE000E100   ;  //設(shè)置使能中斷寄存器地址
2 a" K( p3 L0 N( f+ C MOVS R1, #0x4         ;  //中斷#2
( ^1 M  J; g$ I) s STR R1, [R0]          ;  //使能#2中斷
2 k$ E* }1 L# x) M# y6 `1 F LDR R0, =0xE000E280   ; //設(shè)置清除中斷掛起寄存器地址( s/ t" m7 F$ Q. e$ p! G' ^
MOVS R1, #0x4         ;  //中斷#2
0 z- T0 x! {/ m STR R1, [R0]          ;  //清除#2的掛起狀態(tài)
* Z2 q/ L; p$ N2 ]}2.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)//設(shè)置一個(gè)中斷掛起8 H$ R# y! j! s* g( ]* q
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) " ^; c" y% M; \
{5 Y7 `# k. P4 X: X& Y/ T
    if ((int32_t)(IRQn) >= 0) {
/ |9 B9 J; l. C  g- [        NVIC->ISPR[0U] = (uint32_t)(1UL = 0) {
: V2 d. K3 w$ v        NVIC->ICPR[0U] = (uint32_t)(1UL = 0) {
$ [9 _6 s) P5 ~' E        return((uint32_t)(((NVIC->ISPR[0U] & (1UL NVIC屬于處理器內(nèi)核部分,因此在MM32 MCU芯片的用戶手冊中只有簡單的提及,沒有重點(diǎn)講述,需要深入了解相關(guān)寄存器和功能需要參考《Cortex-M0技術(shù)參考手冊》。* E" Y" d1 l  s+ I. H9 n5 t, ^  P
, D4 g4 W% p; u; L# n# c* l

9 V) X% Q/ ?, W+ m" r聲明:
' ]( o1 J7 b# _1 `# H& J聲明:本號對所有原創(chuàng)、轉(zhuǎn)載文章的陳述與觀點(diǎn)均保持中立,推送文章僅供讀者學(xué)習(xí)和交流。文章、圖片等版權(quán)歸原作者享有,如有侵權(quán),聯(lián)系刪除。投稿/招聘/推廣/宣傳 請加微信:woniu26a推薦閱讀▼4 @5 U8 G- q/ z7 K; h) s! |
電路設(shè)計(jì)-電路分析/ H( Q/ h0 ?+ i7 t( o
emc相關(guān)文章
9 e; r7 F% b) G電子元器件; ~  ?* E* y6 F+ p7 A8 ~
后臺回復(fù)“加群”,管理員拉你加入同行技術(shù)交流群。

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表