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

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

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

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

[復(fù)制鏈接]

478

主題

478

帖子

2427

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

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

; z* y! t- o7 i1 u點(diǎn)擊上方名片關(guān)注了解更多
$ C. f( v* b( E! F8 q
7 ^0 h) L, C- o" g% N: k來源 | 技術(shù)社區(qū)
# o- I' z- @' F很多同學(xué)都存在這樣的疑惑:如果外部中斷來的頻率足夠快,上一個(gè)中斷沒有處理完成,新來的中斷該如何處理?/ n' H/ F0 ^+ o5 y- |) x
中斷一般是由硬件(例如外設(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)核緊密相連,并且提供了中斷控制功能以及對(duì)系統(tǒng)異常的支持。
  c  A, Q  J3 k7 h1 {( X處理器中的NVIC能夠處理多個(gè)可屏蔽中斷通道和可編程優(yōu)先級(jí),中斷輸入請(qǐng)求可以是電平觸發(fā),也可以是最小的一個(gè)時(shí)鐘周期的脈沖信號(hào)。每一個(gè)外部中斷線都可以獨(dú)立的使能、清除或掛起,并且掛起狀態(tài)也可以手動(dòng)地設(shè)置和清除。
& t1 a( _& \* e( C4 l7 T主程序正在執(zhí)行,當(dāng)遇到中斷請(qǐ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ī)制。
4 Z( o  v+ c  |6 h1 ~
: u/ _1 }- W( W1 `: t& E$ i內(nèi)核中斷(異常管理和休眠模式等),其中斷優(yōu)先級(jí)則由SCB寄存器來管理,IRQ的中斷優(yōu)先級(jí)是由NVIC來管理。
1 W% z( m! u3 c3 E/ q" L- J. WNVIC的寄存器經(jīng)過了存儲(chǔ)器映射,其寄存器的起始地址為0xE000E100,對(duì)其訪問必須是每次32bit。2 H' c0 @8 Q8 {2 A/ h4 T6 h
SCB寄存器的起始地址:0xE000ED00,也是每次32bit訪問,SCB寄存器主要包含SysTick操作、異常管理和休眠模式控制。
6 R: m& {- m3 Z3 hNVIC具有以下特性:" P4 K# i1 B- m& P* ?9 A. @
靈活的中斷管理:使能\清除、優(yōu)先級(jí)配置硬件嵌套中斷支持向量化的異常入口中斷屏蔽1. 中斷使能和清除使能0 d4 Z; q6 l8 _( K
arm將處理器的中斷使能設(shè)置和清除設(shè)置寄存器分在兩個(gè)不同的地址,這種設(shè)計(jì)主要有如下優(yōu)勢(shì):一方面這種方式減少了使能中斷所需要的步驟,使能一個(gè)中斷NVIC只需要訪問一次,同時(shí)也減少了程序代碼并且降低了執(zhí)行時(shí)間,另一方面當(dāng)多個(gè)應(yīng)用程序進(jìn)程同時(shí)訪問寄存器或者在讀寫操作寄存器時(shí)有操作其他的中斷使能位,這樣就有可能導(dǎo)致寄存器丟失,設(shè)置和清除分成兩個(gè)寄存器能夠有效防止控制信號(hào)丟失。% C" U% C! {# a' h9 J
: N# L& |3 a4 ~7 t
因此我可以獨(dú)立的操作每一個(gè)中斷的使能和清除設(shè)置。
$ M; E9 S9 ?, z2 h$ O2 X8 c1.1 C代碼*(volatile unsigned long) (0xE000E100) = 0x4 ; //使能#2中斷
* d( V, x7 u" W# u$ S*(volatile unsigned long) (0xE000E180) = 0x4 ; //清除#2中斷1.2 匯編代碼__asm void Interrupt_Enable()* E4 l% {* b5 h
{
. r6 e9 c" x1 o; _% m0 X4 { LDR R0, =0xE000E100  ;  //ISER寄存器的地址
0 o4 @) B7 p* e- X MOVS R1, #04         ;  //設(shè)置#2中斷
4 ~1 M3 I7 K+ @& Q2 {9 U STR R1, [R0]         ;  //使能中斷#2' V6 ~0 \/ N( m; b8 n8 ^# ?" |1 e
}
& i% |& q( ?7 i/ y__asm void Interrupt_Disable()5 D! n. k0 `, S
{
# A2 \, r$ K: u5 Q. l/ F3 T8 \ LDR R0, =0xE000E180  ;  //ICER寄存器的地址; M# I- D" j. x! G; a. q. Y9 B( K
MOVS R1, #04         ;  //設(shè)置#2中斷
% A: b! X9 d- K' K3 T! ^ STR R1, [R0]         ;  //使能中斷#2
1 g" l3 r/ G  e}1.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)//使能中斷#IRQn
4 r8 H; M3 b% p+ N+ h1 V__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
5 s0 {' j+ y* I- @. J" A{1 \4 W. R9 d4 n1 V5 H
    if ((int32_t)(IRQn) >= 0) {
- g. _% |- ]2 W8 N, ?2 h8 P        NVIC->ISER[0U] = (uint32_t)(1UL = 0) {" q2 v6 w9 h/ n* i( v) v' B
        NVIC->ICER[0U] = (uint32_t)(1UL = 0) {
$ |- h5 |% x& D( }0 v        return((uint32_t)(((NVIC->ISER[0U] & (1UL 2. 中斷掛起和清除掛起
! f3 O* W* y/ D" J3 x6 z如果一個(gè)中斷發(fā)生了,卻無法立即處理,這個(gè)中斷請(qǐng)求將會(huì)被掛起。掛起狀態(tài)保存在一個(gè)寄存器中,如果處理器的當(dāng)前優(yōu)先級(jí)還沒有降低到可以處理掛起的請(qǐng)求,并且沒有手動(dòng)清除掛起狀態(tài),該狀態(tài)將會(huì)一直保持。2 E  S; u4 q6 I9 q; t
可以通過操作中斷設(shè)置掛起和中斷清除掛起兩個(gè)獨(dú)立的寄存器來訪問或者修改中斷掛起狀態(tài),中斷掛起寄存器也是通過兩個(gè)地址來實(shí)現(xiàn)設(shè)置和清除相關(guān)位。這使得每一個(gè)位都可以獨(dú)立修改,并且無需擔(dān)心在兩個(gè)應(yīng)用程序進(jìn)程競(jìng)爭(zhēng)訪問時(shí)出現(xiàn)的數(shù)據(jù)丟失。
  N2 b$ V3 m3 P" W- s! k( k
* h! t9 X1 W/ Z6 _4 P& u8 {/ 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 ; //使能中斷#2
- x: u- Y& t5 j1 Z*(volatile unsigned long)(0xE000E200) = 0x4 ; //掛起中斷#28 U0 f1 r! g+ l3 f# J3 e
*(volatile unsigned long)(0xE000E280) = 0x4 ; //清除中斷#2的掛起狀態(tài)2.2 匯編代碼__asm void Interrupt_Set_Pending()9 I% s) N: Y7 `$ n$ l- _2 |
{
' W! ?* X5 f0 o% j; Q LDR R0, =0xE000E100   ;  //設(shè)置使能中斷寄存器地址+ ~, {! B1 W* B
MOVS R1, #0x4         ;  //中斷#2, A  ~+ R# T# Z* G4 L% \' r, v  b
STR R1, [R0]          ;  //使能#2中斷
" ^% u! |8 o! D+ q: t! g LDR R0, =0xE000E200   ; //設(shè)置掛起中斷寄存器地址0 ~2 D- D: u$ q4 z6 J+ x
MOVS R1, #0x4         ;  //中斷#2% a, _: q, a# w4 P. v2 ?- y% Y
STR R1, [R0]          ;  //掛起#2中斷
, }5 P4 l5 W* h) k. G; J}
4 X' S! G  T# F9 O" g__asm void Interrupt_Clear_Pending()
9 q; |. ~7 I  t) ?# M{& A+ E* l3 M- ^. T4 E2 `3 y
LDR R0, =0xE000E100   ;  //設(shè)置使能中斷寄存器地址
5 D% w' F' [$ Q- ]9 A, b, v: g) L; ]1 f MOVS R1, #0x4         ;  //中斷#2
% G6 G+ T1 e. n; M: D$ N& V STR R1, [R0]          ;  //使能#2中斷
# Q5 Y5 }9 |6 ?# a% ]% S: a% R LDR R0, =0xE000E280   ; //設(shè)置清除中斷掛起寄存器地址3 p3 X) q8 |" \- ]
MOVS R1, #0x4         ;  //中斷#2+ g" @5 q2 @5 r( B, d, [: O
STR R1, [R0]          ;  //清除#2的掛起狀態(tài)
5 x3 d4 E& p+ d. B6 b- l}2.3 CMSIS標(biāo)準(zhǔn)設(shè)備驅(qū)動(dòng)函數(shù)//設(shè)置一個(gè)中斷掛起
: m+ }8 D9 l8 e: Q" A2 H__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
7 w5 @0 O9 M  r& d{2 H) _. A. I8 d/ V9 x) e% O' ~
    if ((int32_t)(IRQn) >= 0) {  E% K5 q5 e, x
        NVIC->ISPR[0U] = (uint32_t)(1UL = 0) {
7 l% K) k2 y" j- d2 Y6 f        NVIC->ICPR[0U] = (uint32_t)(1UL = 0) {
- Q! l& x6 ]% p$ E/ i        return((uint32_t)(((NVIC->ISPR[0U] & (1UL NVIC屬于處理器內(nèi)核部分,因此在MM32 MCU芯片的用戶手冊(cè)中只有簡(jiǎn)單的提及,沒有重點(diǎn)講述,需要深入了解相關(guān)寄存器和功能需要參考《Cortex-M0技術(shù)參考手冊(cè)》。
; i' Z, p" d3 A! ?& ?   Q5 m; ^; [" d- p
1 |2 K* C: Z8 `& ~7 {4 F4 @9 D
聲明:
; ^2 ?; D3 M: j聲明:本號(hào)對(duì)所有原創(chuàng)、轉(zhuǎn)載文章的陳述與觀點(diǎn)均保持中立,推送文章僅供讀者學(xué)習(xí)和交流。文章、圖片等版權(quán)歸原作者享有,如有侵權(quán),聯(lián)系刪除。投稿/招聘/推廣/宣傳 請(qǐng)加微信:woniu26a推薦閱讀▼
- U0 F0 G0 C2 ]& J5 @電路設(shè)計(jì)-電路分析: k  W, `* f' h# U3 S/ Q
emc相關(guān)文章0 h8 {  @$ W9 b1 b
電子元器件
8 }0 p2 Z6 @7 E" m  T0 p
后臺(tái)回復(fù)“加群”,管理員拉你加入同行技術(shù)交流群。

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

本版積分規(guī)則


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