JZ2440 中斷分析

2021-07-31 15:39:45 字數 3311 閱讀 9533

arm體系結構的7中工作模式

1、使用者模式(usr) :arm處理器正常的程式執行狀態

2、快速中斷模式(fig) :用於高速的資料傳輸或通道處理

3、中斷模式(irq) :用於通用的中斷處理

4、管理模式(svc) :作業系統使用的保護模式

5、資料訪問終止模式(abt) :當資料或指令預取終止時進入該模式,可用於虛擬儲存及儲存保護

6、系統模式(sys) :執行具有特權的作業系統任務

7、未定義指令終止模式(und):當未定義的指令執行時進入該模式,可用於支援硬體協處理器的軟體**

除使用者模式外,其他均為特權模式。

可以通過軟體來進行模式的切換,例如進入svc管理模式,**如下:

mrs r0, cpsr

bic r0, r0, #0x1f

orr r0, r0, #0xd3 //svc模式,cpu狀態為arm工作模式,禁止快速中斷和中斷

msr cpsr, r0

arm體系結構cpu的兩種工作狀態:arm狀態 32位的字對齊的arm指令

thumb狀態 26位的半字對齊的thumb指令

s3c2440/s3c2410一上電便是在arm狀態,所以無需關心cpu的工作狀態

r13:棧指標暫存器

r14:lr暫存器,pc暫存器的備份

r15:pc暫存器,程式計數器

cpu在執行過程中,如何知道各類外設發生了某些不預期的事情,不如串列埠接收到了新資料,usb介面中出入了裝置,按下了某個按鍵等,主要有兩種方法

(1):查詢方式

(2):中斷方式

識別中斷和清除中斷主要是利用兩種暫存器來實現

(1):中斷控制暫存器

在s3c2410/s3c2440中,irq中斷被分為三類

1、request sources(with sub-register) ,即有子中斷的中斷型別,s3c2410有11個,s3c2440有15個

2、request sources(without sub-register),無子中斷的一類中斷

3、eint4_7,eint8_23

首先來說明如何判斷發生的中斷時哪乙個

1、通過讀取intpnd或者intoffset的值可以知道彙總的中斷中哪乙個中斷發生了

2、彙總的中斷中有三種型別的中斷 

(1)直接有intpnd便可判斷的中斷

(2)由子中斷彙總的中斷

(3)eint4_7 和eint8_23

對於情況2:比如關於串列埠方面的中斷int_rxd0,int_txd0,int_err0,此三個中斷只要有乙個發生了,且沒有被遮蔽,則三者在intpnd中的標示

均為int_uart0,光是看intpnd還無法分辨具體哪乙個中斷發生,此時需要用到subsrcpnd暫存器,

subsrcpnd 的位[2]標誌int_err0

subsrcpnd 的位[1]標誌int_txd0

subsrcpnd 的位[0]標誌int_rxd0

同理,其他由子中斷彙總的中斷都能在subsrcpnd找到自己子中斷的標示。這中子中斷在s3c2440中有15個,即在subsrcpnd需要15位標示,彙總到

intpnd中由6位標示,總的對映關係如下

int_uart0 :int_rxd0,int_txd0,int_err0

int_uart1 :int_rxd1,int_txd1,int_err1

int_uart2 :int_rxd2,int_txd2,int_err2

int_adc :int_adc_s, int_tc

int_cam :int_cam_c, int_cam_p

int_wdt_ac97 :int_wdt, int_ac97

對於第三種情況ein4~eint 7和eint8~eint23這幾個外部中斷,在intpnd中的標示為eint4_7 和eint8_23

對映關係如下

eint4_7 :ein4~eint7

eint8_23 :eint8~eint23

故而光是參考intpnd暫存器無法知道具體發生的中斷,這是還需要參考eintpend暫存器,這個暫存器中標示了具體發生的中斷

這裡插放中斷流程圖

使用中斷的步驟:

(1)設定好中斷模式和快速中斷模式下的棧

(2)準備好中斷處理函式,即設定中斷向量表,中斷向量位址0x00000018

_start: b start_code

ldr pc, _undefined_instruction

ldr pc, _software_interrupt

ldr pc, _prefetch_abort

ldr pc, _data_abort

ldr pc, _not_used

ldr pc, _irq

ldr pc, _fiq

然後寫中斷服務程式,即判斷是哪個中斷發生,採取什麼樣的措施

最後清除中斷,清除中斷位置可以在中斷服務程式前,也可以在其後,清中斷是從源頭開始,例如從subsrpnd,到srcpnd到intpnd

注意:srcpnd和intpnd之間的關係,他倆都是中斷的彙總,相應位標誌的中斷一樣,intpnd經由srcpnd遮蔽和優先順序而來,intpnd同一時刻只能

標示一種中斷,因為同一時刻只能相應乙個中斷,而srcpnd可能標示了多個中斷,這表明有多個中斷同時發生了,不過要經過遮蔽和優先順序確定

響應哪個中斷。在前面說過有三類中斷,這裡的遮蔽主要遮蔽第二類中斷,因為第一類和第三類中斷在進入srcpnd標示之前已經被遮蔽了

(3)進入、退出中斷模式或快速中斷模式時,需要儲存、恢復中斷程式的執行環境

對於irq**如下

sub lr ,lr ,#4

s***b sb!,

......

ldmid sp!,^

(4)根據具體中斷,設定相關外設。比如設定觸發條件,設定引腳功能(中斷),設定自己的遮蔽暫存器

(5)對於第一類和第三類中斷,設定遮蔽暫存器

(6)設定主遮蔽暫存器intmask

(7)啟動中斷功能,即設定cpsr暫存器

在uboot的第一階段**中對中斷的處理如下

(1)關閉中斷使能

mrs r0, cpsr

bic r0, r0, #0x1f

orr r0, r0, #0xd3

msr cpsr, r0

(2)遮蔽所有中斷

# define intmsk 0x14400008

mov r1, #0xffffffff

ldr r0, =intmsk

str r1, [r0]

jz2440的時鐘分析

s3c2440有兩個pll phase locked loop 乙個是mpll,乙個是upll。mpll用於cpu及其他外圍器件,upll用於usb。用於產生fclk,hclk,pclk三種頻率,這三種頻率分別有不同的用途 fclk是cpu提供的時鐘訊號。hclk是為ahb匯流排提供的時鐘訊號,ad...

JZ2440學習筆記

1.easyopenjtag工具用於為目標板初次燒寫u boot再合適不過了。2.燒寫核心和檔案系統使用tftp nfs,速度是很快的哦。toc 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下markdown的基...

JZ2440 系統時鐘

jz2440 系統時鐘。時鐘控制邏輯給整個晶元提供了三種時鐘。fclk 用於cpu核心 hclk 用於ahb匯流排上裝置,比如cpu核,儲存控制器,中斷控制器,lcd控制器,dma控制器,和usb主機模組,主要用於高效能模組 pclk 用於apb匯流排上裝置,比如watchdog,iis,i2c,p...