根據您提供的圖片,我們可以看到一個S3C2440微控制器的中斷處理流程圖。這個流程圖展示了從中斷請求源到CPU的整個中斷處理過程。以下是流程圖中各個部分與您提供的寄存器之間的關系:
-
請求源(帶sub寄存器):
-
這些是具體的中斷源,例如UART0-ERR、UART0-RXD、UART0-TXD等。
-
每個請求源可能有一個對應的子中斷源掛起標志(SUBSRCPND),用于指示該請求源下的具體中斷事件。
-
-
子中斷源開關(SUBMASK):
-
這個開關用于使能或禁用子中斷源的中斷請求。
-
例如,如果
SUBMASK
寄存器的某位被清除(即設置為0),則對應的子中斷源的中斷請求將被屏蔽。
-
-
源掛起標志(SRCPND):
-
這個寄存器用于記錄哪些中斷源的中斷請求已經發生但尚未被處理。
-
在流程圖中,
SRCPND
寄存器的值會被傳遞到開關(MASK)和優先級(MODE)模塊。
-
-
開關(MASK):
-
這個模塊用于使能或禁用中斷請求的傳遞。
-
它使用
INTMSK
寄存器的值來決定是否允許中斷請求通過。 -
在代碼中,
INTMSK &= ~(1 << 5);
操作使能了EINT8_23中斷組。
-
-
優先級(MODE):
-
這個模塊用于設置中斷的優先級。
-
它可能涉及到優先級寄存器(例如
INTPR
),但在您提供的代碼中沒有直接使用。
-
-
中斷掛起標志(INTPND):
-
這個寄存器用于記錄哪些中斷已經發生但尚未被處理。
-
在流程圖中,
INTPND
寄存器的值會被傳遞到CPU。 -
在代碼中,
INTPND = INTPND;
操作用于清零中斷掛起寄存器。
-
-
CPSR(I, F):
-
這是當前程序狀態寄存器(CPSR)中的兩個位,用于控制中斷使能和禁止。
-
CPSR
寄存器的I
位用于使能或禁止IRQ中斷,F
位用于使能或禁止FIQ中斷。 -
在代碼中,通過修改CPSR寄存器來使能IRQ中斷。
-
-
CPU(ARM920T):
-
最終,處理完的中斷請求會被傳遞到CPU進行處理。
-
CPU會根據中斷的優先級和當前的中斷使能狀態來決定是否響應中斷。
-
總結來說,流程圖中展示了從中斷請求源到CPU的整個中斷處理過程,而您提供的寄存器在這個過程中起到了關鍵的作用。每個寄存器都有其特定的功能,共同協作以確保中斷能夠被正確地處理。
發生中斷處理
-
mrs r0, cpsr
-
這條指令將當前程序狀態寄存器(CPSR)的值移動到通用寄存器
r0
中。 -
CPSR包含了處理器的狀態信息,如條件標志、中斷使能位等。
-
-
bic r0, r0, #0x1f
-
這條指令對
r0
寄存器進行位清除(Bit Clear)操作,用于清除CPSR中的模式位(最低的5位,即0x1F)。 -
這樣做是為了將當前的處理器模式位清零,為下一步設置新的模式做準備。
-
-
orr r0, r0, #0x12
-
這條指令對
r0
寄存器進行位或(Bit OR)操作,將模式位設置為0x12。 -
在ARM架構中,0x12代表IRQ模式。
-
-
msr cpsr_c, r0
-
這條指令將
r0
寄存器的值移回CPSR。 -
由于使用了
cpsr_c
而不是cpsr
,這條指令僅修改CPSR中的條件碼標志位和模式位,而不會影響其他位(如中斷使能位)。 -
這一步完成了處理器模式從當前模式切換到IRQ模式的操作。
-
-
ldr sp, =0x40000C00
-
這條指令將立即數
0x40000C00
加載到棧指針(SP)寄存器中。 -
這樣做是為了初始化IRQ模式的棧指針,為即將到來的中斷處理程序準備棧空間。
-
0x40000C00
是為IRQ模式預設的棧地址。
-
INTOFFSET為中斷的偏移量,反映的是那種中斷
在S3C2440微控制器中,涉及到中斷處理的寄存器有多個,每個寄存器都有其特定的作用。以下是您提供的代碼中涉及到的寄存器及其作用的詳細說明:
1.?GPGCON
-
作用:配置GPIO端口G的引腳功能。
-
操作:
-
GPGCON &= ~(0x3 << 0);
:清除GPG0引腳的功能設置,確保其不被其他功能占用。 -
GPGCON |= (0x2 << 0);
:將GPG0引腳設置為外部中斷(EINT8)模式。
-
2.?EXTINT1
-
作用:外部中斷控制寄存器,用于設置外部中斷的觸發方式。
-
操作:
-
EXTINT1 &= ~(0x7 << 0);
:清除EINT8的觸發方式設置,確保其不被其他設置影響。 -
EXTINT1 |= (0x2 << 0);
:將EINT8設置為下降沿觸發。
-
3.?EINTMASK
-
作用:外部中斷屏蔽寄存器,用于使能或禁用特定的外部中斷。
-
操作:
-
EINTMASK &= ~(1 << 8);
:使能EINT8中斷,即清除屏蔽位,允許EINT8中斷請求被發送到中斷控制器。
-
4.?INTMSK
-
作用:中斷屏蔽寄存器,用于使能或禁用一組中斷。
-
操作:
-
INTMSK &= ~(1 << 5);
:使能EINT8_23中斷組,即清除屏蔽位,允許EINT8_23組中的中斷請求被發送到中斷控制器。
-
5.?EINTPEND
-
作用:外部中斷掛起寄存器,用于記錄哪些外部中斷已經發生但尚未被處理。
-
操作:
-
EINTPEND |= (1 << 8);
:清零EINT8的掛起位,表示EINT8中斷已經被處理。
-
6.?SRCPND
-
作用:源掛起寄存器,用于記錄哪些中斷源的中斷請求已經發生但尚未被處理。
-
操作:
-
SRCPND |= (1 << irq_num);
:清除特定中斷源的掛起位,表示該中斷已經被處理。
-
7.?INTPND
-
作用:中斷掛起寄存器,用于記錄哪些中斷已經發生但尚未被處理。
-
操作:
-
INTPND = INTPND;
:通過將寄存器的值寫回自身,清零所有掛起的中斷位,表示所有掛起的中斷已經被處理。
-
8.?INTOFFSET
-
作用:中斷偏移量寄存器,用于提供當前發生的中斷的編號。
-
操作:
-
unsigned int irq_num = INTOFFSET;
:讀取當前中斷的編號,用于確定是哪種中斷發生了。
-
這些寄存器共同工作,實現了S3C2440微控制器的中斷處理機制,確保了系統能夠正確響應和處理各種中斷請求。
將value讀取出來計算電壓為3.3/1024*value