新闻中心

EEPW首页>嵌入式系统>设计应用> TQ2440启动代码分析(一)

TQ2440启动代码分析(一)

作者: 时间:2016-11-26 来源:网络 收藏

IsrIRQ

sub sp,sp,#4 ;reserved for PC,给PC寄存器保留

stmfd sp!,{r8-r9};工作寄存器入栈保护

ldr r9,=INTOFFSET;INTOFFSET在2440addr.inc中定义

ldr r9,[r9]

ldr r8,=HandleEINT0;HandleEINT0 的地址就是中断的入口地址

add r8,r8,r9,lsl #2;逻辑左移就相当于乘以4

ldr r8,[r8]

str r8,[sp,#8]

ldmfd sp!,{r8-r9,pc},将地址从堆栈中弹出给PC

LTORG

;用于声明一个数据缓冲池

;=======

上电和复位后,程序开始从位于0x0 执行b ResetHandler 程序跳转到这里执行,将看门

狗,中断之类的程序关掉,以免打扰初始化程序的进行。

; ENTRY

;=======

ResetHandler

ldr r0,=WTCON ;watch dog disable

ldr r1,=0x0

str r1,[r0]

WTCON 为看门狗控制寄存器,此处将其写入0x0,就是禁止它的所有功能,包括定时

器定时,溢出中断及溢出复位。

ldr r0,=INTMSK

ldr r1,=0xffffffff ;all interrupt disable

str r1,[r0]

INTMSK 为中断屏蔽寄存器,写入0xffffffff,就是禁止所有的中断产生,因为中断

向量表还未初始化,如果此时产生中断会使程序进入未知的状态而跑飞。因为外设的中断太

多,INTMSK 不够用,还需要INTSUBMSK 来将剩余的中断源也禁止掉。

ldr r0,=INTSUBMSK

ldr r1,=0x7fff ;all sub interrupt disable

str r1,[r0]

[ {FALSE} ;亮灯用的,可以用来调试用

;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);

; Led_Display

ldr r0,=GPBCON

ldr r1,=0x155500

str r1,[r0]

ldr r0,=GPBDAT

ldr r1,=0x0

str r1,[r0]

]

;To reduce PLL lock time, adjust the LOCKTIME register.

ldr r0,=LOCKTIME;设置pll 锁定时间

ldr r1,=0xffffff

str r1,[r0]

LOCKTIME 为PLL 锁定时间计数寄存器,重新设定分频值时,PLL 进入锁定,输出稳

定频率的时钟需要一定的时间。这里设置成默认的值,以满足锁定的要求。

[ PLL_ON_START

; Added for confirm clock divide. for 2440.

; Setting value Fclk:Hclk:Pclk

ldr r0,=CLKDIVN;用于设定FCLK,HCLK和PCLK的比例

ldr r1,=CLKDIV_VAL ; 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6.,在option.inc中有定义

str r1,[r0]

;program has not been copied, so use these directly

[ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1.

mrc p15,0,r0,c1,c0,0

orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA

mcr p15,0,r0,c1,c0,0

|

mrc p15,0,r0,c1,c0,0

bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF

mcr p15,0,r0,c1,c0,0

]

;Configure UPLL

ldr r0,=UPLLCON

ldr r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV) ;Fin = 12.0MHz, UCLK = 48MHz

str r1,[r0]

nop ; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed. ;在UPP 设定之后,必须等待7 个时钟的延迟,设定才会有效

nop

nop

nop

nop

nop

nop

;Configure MPLL,设置MPLL

ldr r0,=MPLLCON

ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ;Fin = 12.0MHz, FCLK = 400MHz

str r1,[r0]

]

;查看是否是由睡眠状态启动,如果是则跳转到WAKEUP_SLEEP状态

;Check if the boot is caused by the wake-up from SLEEP mode.

ldr r1,=GSTATUS2

ldr r0,[r1]

tst r0,#0x2

;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.

bne WAKEUP_SLEEP

EXPORTStartPointAfterSleepWakeUp

StartPointAfterSleepWakeUp

初始化内存控制器其实就是对S3C2440 的memory bank 进行设置,使其扩展的存储器

或外部设备能够被处理器通过内存控制器正确读写。由于S3C2440 的最终应用程序是在

SDRAM(bank6)中运行,并与C 语言变量等的用户数据,各种模式的堆栈,中断向量表,

都被定位在SDRAM 的空间,所以它必须在涉及这些处理之前完成初始化工作。

;Set memory control registers

;ldr r0,=SMRDATA

adrl r0, SMRDATA ;be careful!

ldr r1,=BWSCON ;BWSCON Address

add r2, r0, #52 ;End address of SMRDATA

0

ldr r3, [r0], #4

str r3, [r1], #4

cmp r2, r0

bne %B0

这段是功能寄存器初始化,把13 个存储控制器的内容批量的读取到了对应的特殊功能

寄存器中,首先是下面有一个数据区SMRDATA,在程序的后面有定义,这个数据区给13 个寄存器分配52 字节的地址空间。在上面的代码中,r0 是这个数据区的起始地址,r2 是数据区的结束地址,r1 是寄存器的起始地址。这样,用一个判断语句就可以把内存中的数据赋给这13 个存储控制寄存器了。


上一页 1 2 3 下一页

关键词:TQ2440启动代

评论


技术专区

关闭