基于ARM7TDMI內核的芯片里多數硬件模塊都是可配置的_第1頁
基于ARM7TDMI內核的芯片里多數硬件模塊都是可配置的_第2頁
基于ARM7TDMI內核的芯片里多數硬件模塊都是可配置的_第3頁
基于ARM7TDMI內核的芯片里多數硬件模塊都是可配置的_第4頁
基于ARM7TDMI內核的芯片里多數硬件模塊都是可配置的_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、基于ARM7TDMI內核的芯片里多數硬件模塊都是可配置的,需要由軟件來設置其需要的工作狀態(tài)。因此在用戶的應用程序之前,需要由專門的一段代碼來完成對系統的初始化。由于這類代碼直接面對處理器內核和硬件控制器進行編程,一般都是用匯編語言。一般通用的內容包括:中斷向量表初始化存儲器系統初始化堆棧初始化有特殊要求的斷口,設備初始化用戶程序執(zhí)行環(huán)境改變處理器模式呼叫主應用程一.中斷向量表   ARM要求中斷向量表必須放置在從0地址開始,連續(xù)8X4字節(jié)的空間內。每當一個中斷發(fā)生以后,ARM處理器便強制把PC指針置為向量表中對應中斷類型的地址值。因為每個中斷只占據向量表中1個字的存儲空間,

2、只能放置一條ARM指令,使程序跳轉到存儲器的其他地方,再執(zhí)行中斷處理。中斷向量表的程序實現通常如下表示:AREA Boot ,CODE, READONLYENTRYB ResetHandlerB UndefHandlerB SWIHandlerB PreAbortHandlerB DataAbortHandlerBB IRQHandlerB FIQHandler其中關鍵字ENTRY是指定編譯器保留這段代碼,因為編譯器可能會認為這是一段亢余代碼而加以優(yōu)化。鏈接的時候要確保這段代碼被鏈接在0地址處,并且作為整個程序的入口。放在0地址處的中斷向量表的ResetHandler一般放在FLASH內,其他

3、中斷向量的入口地址可以是FLASH內的,也可以是SDRAM內的,但是在為操作系統初始化時應該為SDRAM的地址。例如作為uClinux的啟動代碼,此處應該為內存地址。一般有兩種實現方式:1.1               1第一種實現方式b    reset       add  pc, pc, #0x0c000000   &#

4、160;   add  pc, pc, #0x0c000000       add  pc, pc, #0x0c000000       add  pc, pc, #0x0c000000       add  pc, pc, #0x0c000000       add  pc, pc, #

5、0x0c000000       add  pc, pc, #0x0c000000  0x0c000000為內存起始地址,uClinux將中斷向量放入地址0x0c000008,因為cpu發(fā)生中斷時仍然會跳轉到0地址處的中斷向量表中去,所以此處要修改中斷向量表的地址,使程序能正確跳轉到uClinux實現的中斷向量處。此處需要注意,由于ARM系統的三級流水線技術,當程序執(zhí)行到x地址處,pc指針的值其實等于x+8.在uClinux中實現如下:#ifdef CONFIG_ARCH_S3C44B0#undef ve

6、ctors_base()#define vectors_base()  (0x0c000008)#endif所以add  pc, pc, #0x0c000000這條語句將會有8的偏移量。  1.2               2第二種實現方式:b restldr pc,= 0x0c000004ldr pc,= 0x0c000008ldr pc,= 0x0c00000cldr pc,= 0x0c000010b .ldr

7、 pc,= 0x0c000018  /irq中斷l(xiāng)dr pc,= 0x0c00001c但相應的linux源代碼應作修改,這時uClinux中實現如下:#ifdef CONFIG_ARCH_S3C44B0#undef vectors_base()#define vectors_base()  (0x0c000000)#endif即只要當發(fā)生中斷時,cpu發(fā)生中斷時跳轉到0地址處的中斷向量表中去,再這里能跳轉到uClinux的vectors_base()地址處。 ARM7有兩種IRQ中斷模式(1).向量中斷時0地址代碼如下:其中從0x20開始處一定要按順序放入ENTR

8、Yb ResetHandler ; 0x00b HandlerUndef ; 0x04b HandlerSWI ; 0x08b HandlerPabort ; 0x0cb HandlerDabort ; 0x10b . ; 0x14b HandlerIRQ ; 0x18b HandlerFIQ ; 0x1cldr pc,=HandlerEINT0 ; 0x20ldr pc,=HandlerEINT1ldr pc,=HandlerEINT2ldr pc,=HandlerEINT3ldr pc,=HandlerEINT4567ldr pc,=HandlerTICK ; 0x34b .b .ldr

9、pc,=HandlerZDMA0 ; 0x40ldr pc,=HandlerZDMA1ldr pc,=HandlerBDMA0ldr pc,=HandlerBDMA1ldr pc,=HandlerWDTldr pc,=HandlerUERR01 ; 0x54b .b .ldr pc,=HandlerTIMER0 ; 0x60ldr pc,=HandlerTIMER1ldr pc,=HandlerTIMER2ldr pc,=HandlerTIMER3ldr pc,=HandlerTIMER4ldr pc,=HandlerTIMER5 ; 0x74b .b .ldr pc,=HandlerURXD

10、0 ; 0x80ldr pc,=HandlerURXD1ldr pc,=HandlerIICldr pc,=HandlerSIOldr pc,=HandlerUTXD0ldr pc,=HandlerUTXD1 ; 0x94b .b .ldr pc,=HandlerRTC ; 0xa0b .b .b .b .b .b .ldr pc,=HandlerADC ; 0xb4    2非向量IRQ中斷模式ENTRYb ResetHandler ; for debugb HandlerUndef ; handlerUndefb HandlerSWI ; SWI i

11、nterrupt handlerb HandlerPabort ; handlerPAbortb HandlerDabort ; handlerDAbortb . ; handlerReservedb IsrIRQb HandlerFIQ. . . . . .IsrIRQsub sp,sp,#4 ; reserved for PCstmfd sp!,r8-r9ldr r9,=I_ISPRldr r9,r9mov r8,#0x00 movs r9,r9,lsr #1bcs %F1add r8,r8,#4b %B01 ldr r9,=HandleADCadd r9,r9,r8ldr r9,r9st

12、r r9,sp,#8ldmfd sp!,r8-r9,pc. . . . . .HandleADC # 4HandleRTC # 4HandleUTXD1 # 4HandleUTXD0 # 4. . . . . .HandleEINT3 # 4HandleEINT2 # 4HandleEINT1 # 4HandleEINT0 # 4 ;  此處通過判斷I_ISPR的值可以跳到相應的中斷處理函數處。此處的Bootloader采用非向量IRQ中斷方式,通過以下頭文件的定義可以方便的把中斷向量處理函數的地址傳入:/* ISR */#define pISR_RESET  &

13、#160; (*(unsigned *)(_ISR_STARTADDRESS+0x0)#define pISR_UNDEF    (*(unsigned *)(_ISR_STARTADDRESS+0x4)#define pISR_SWI  (*(unsigned *)(_ISR_STARTADDRESS+0x8)#define pISR_PABORT  (*(unsigned *)(_ISR_STARTADDRESS+0xc)#define pISR_DABORT  (*(unsigned *)(_ISR_STARTADDRESS+0

14、x10)#define pISR_RESERVED    (*(unsigned *)(_ISR_STARTADDRESS+0x14)#define pISR_IRQ   (*(unsigned *)(_ISR_STARTADDRESS+0x18)#define pISR_FIQ   (*(unsigned *)(_ISR_STARTADDRESS+0x1c) #define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x20)#define pISR_RTC 

15、(*(unsigned *)(_ISR_STARTADDRESS+0x24)#define pISR_UTXD1     (*(unsigned *)(_ISR_STARTADDRESS+0x28)#define pISR_UTXD0     (*(unsigned *)(_ISR_STARTADDRESS+0x2c)#define pISR_SIO   (*(unsigned *)(_ISR_STARTADDRESS+0x30)#define pISR_IIC   

16、; (*(unsigned *)(_ISR_STARTADDRESS+0x34)#define pISR_URXD1     (*(unsigned *)(_ISR_STARTADDRESS+0x38)#define pISR_URXD0     (*(unsigned *)(_ISR_STARTADDRESS+0x3c)#define pISR_TIMER5    (*(unsigned *)(_ISR_STARTADDRESS+0x40)#define pISR_TIMER4

17、60;   (*(unsigned *)(_ISR_STARTADDRESS+0x44)#define pISR_TIMER3    (*(unsigned *)(_ISR_STARTADDRESS+0x48)#define pISR_TIMER2    (*(unsigned *)(_ISR_STARTADDRESS+0x4c)#define pISR_TIMER1    (*(unsigned *)(_ISR_STARTADDRESS+0x50)#define pISR_TIMER

18、0    (*(unsigned *)(_ISR_STARTADDRESS+0x54)#define pISR_UERR01   (*(unsigned *)(_ISR_STARTADDRESS+0x58)#define pISR_WDT (*(unsigned *)(_ISR_STARTADDRESS+0x5c)#define pISR_BDMA1    (*(unsigned *)(_ISR_STARTADDRESS+0x60)#define pISR_BDMA0    (*(un

19、signed *)(_ISR_STARTADDRESS+0x64)#define pISR_ZDMA1    (*(unsigned *)(_ISR_STARTADDRESS+0x68)#define pISR_ZDMA0    (*(unsigned *)(_ISR_STARTADDRESS+0x6c)#define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x70)#define pISR_EINT4567 (*(unsigned *)(_ISR_STARTADDRESS+0x74)#

20、define pISR_EINT3      (*(unsigned *)(_ISR_STARTADDRESS+0x78)#define pISR_EINT2      (*(unsigned *)(_ISR_STARTADDRESS+0x7c)#define pISR_EINT1      (*(unsigned *)(_ISR_STARTADDRESS+0x80)#define pISR_EINT0   

21、0;  (*(unsigned *)(_ISR_STARTADDRESS+0x84) 通過如下代碼就可以實現UART0口的中斷處理了:rINTCON=0x5;    /Non-vectored,IRQ enable,FIQ disable     rINTMOD=0x0;    /All=IRQ mode    pISR_URXD0=(unsigned)Uart0_RxInt; 當在地址0處將中斷向量跳到內存后,相應的中斷向量就應該拷貝到內存地址

22、處。把以下代碼從FLASH拷貝到SDRAM中:real_vectors:       b     reset       b     undefined_instruction       b     software_interrupt     &

23、#160; b     prefetch_abort       b     data_abort       b     not_used       b     irq       b 

24、    fiqundefined_instruction:       mov r6, #3       b     endless_blinksoftware_interrupt:       mov r6, #4       b     endl

25、ess_blinkprefetch_abort:       mov r6, #5       b     endless_blinkdata_abort:       mov r6, #6       b     endless_blinknot_used: 

26、0;     /* we *should* never reach this */       mov r6, #7       b     endless_blinkirq:sub sp,sp,#4 ; reserved for PCstmfd sp!,r8-r9ldr r9,=I_ISPRldr r9,r9mov r8,#0x00 movs r9,r9,lsr #1bcs %F1add r8,

27、r8,#4b %B01 ldr r9,=HandleADCadd r9,r9,r8ldr r9,r9str r9,sp,#8ldmfd sp!,r8-r9,pc. . . . . .fiq:       mov r6, #9       b     endless_blink有了如上步驟就可以在bootloader中實現中斷處理了。    1.3    &#

28、160;          二Reset中斷處理如下內容1 初始化存儲器系統存儲器地址分布一種典型的情況是啟動ROM的地址重映射。初始化堆棧因為ARM有7種執(zhí)行狀態(tài),每一種狀態(tài)的堆棧指針寄存器(SP)都是獨立的。因此,對程序中需要用到的每一種模式都要給SP定義一個堆棧地址。方法是改變狀態(tài)寄存器內的狀態(tài)位,使處理器切換到不同的狀態(tài),讓后給SP賦值。注意:不要切換到User模式進行User模式的堆棧設置,因為進入User模式后就不能再操作CPSR回到別的模式了,可能會對接下去的程序執(zhí)行造成影響。這是一段堆棧初

29、始化的代碼示例,其中只定義了三種模式的SP指針:MRS R0,CPSRBIC R0,R0,#MODEMASK ;安全起見,屏蔽模式位以外的其他位ORR R1,R0,#IRQMODEMSR CPSR_cxfs,R1LDR SP,=UndefStackORR R1,R0,#FIQMODEMSR CPSR_cxsf,R1LDR SP,=FIQStackORR R1,R0,#SVCMODEMSR CPSR_cxsf,R1LDR SP,=SVCStack2初始化有特殊要求的端口,設備   這里視不同的硬件設計而不同。 3  初始化應用程序執(zhí)行環(huán)境映像一開始總是存儲在ROMFlash里面的,其RO部分即可以在ROMFlash里面執(zhí)行,也可以轉移到速度更快的RAM中執(zhí)行;而RW和ZI這兩部分是必須轉移到可寫的RAM里去。所謂應用程序執(zhí)行環(huán)境的初始化,就是完成必要的從ROM到RAM的數據傳

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論