2440init代码分析(3)

160 ;=======
161 ; ENTRY
162 ;=======
163 ResetHandler
164 	ldr	r0,=WTCON       ;watch dog disable
165 	ldr	r1,=0x0
166 	str	r1,[r0]
167 

164-166watchdog也是个定时器,一般是用来监控系统有没有跑飞,正常情况下watchdog会正常计数,到了一定的时间,系统会清watchdog中的值,如果没有清,系统就会复位。在这里,关闭watchdog

168 	ldr	r0,=INTMSK
169 	ldr	r1,=0xffffffff  ;all interrupt disable
170 	str	r1,[r0]
171 
172 	ldr	r0,=INTSUBMSK
173 	ldr	r1,=0x7fff		;all sub interrupt disable
174 	str	r1,[r0]
175

168-174行禁止掉所有的中断。

176 	[ {TRUE}
177 	;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);
178 	; Led_Display
179 	ldr	r0,=GPBCON
180 	ldr	r1,=0x00555555
181 	str	r1,[r0]
182 	ldr	r0,=GPBDAT
183 	ldr	r1,=0x07fe
184 	str	r1,[r0]
185 	]
186

178-184行点亮灯小程序,通过设置GPBCON寄存器中相应的位(这个和你开发板上的电路图要一致,看你的LED灯接到哪几个PIN)及相应的值写到GPBDAT中,来控制LED灯的亮和灭。

187 	;To reduce PLL lock time, adjust the LOCKTIME register.
188 	ldr	r0,=LOCKTIME
189 	ldr	r1,=0xffffff
190 	str	r1,[r0]
191

188-190LOCKTIME寄存器用来指定MPLL UPLL的锁定时间(这个没有细看,看到文章的同学要细看哦)

192     [ PLL_ON_START
193 	; Added for confirm clock divide. for 2440.
194 	; Setting value Fclk:Hclk:Pclk
195 	ldr	r0,=CLKDIVN
196 	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.
197 	str	r1,[r0]
198 ;	MMU_SetAsyncBusMode and MMU_SetFastBusMode over 4K, so do not call here
199 ;	call it after copy
200 ;	[ CLKDIV_VAL>1 		; means Fclk:Hclk is not 1:1.
201 ;	bl MMU_SetAsyncBusMode
202 ;	|
203 ;	bl MMU_SetFastBusMode	; default value.
204 ;	]

195-203行设置几个时钟的比例,这里面设置的CLKDIV_VAL5,查看datasheet 258面,可以得到fclk:hclk:pclk=1:2:4(FCLK=400M HCLK=100M PCLK=50M)

205 	;program has not been copied, so use these directly
206 	[ CLKDIV_VAL>1 		; means Fclk:Hclk is not 1:1.
207 	mrc p15,0,r0,c1,c0,0
208 	orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA
209 	mcr p15,0,r0,c1,c0,0
210 	|
211 	mrc p15,0,r0,c1,c0,0
212 	bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF
213 	mcr p15,0,r0,c1,c0,0
214 	]
215 

206-213行是通过CLKDIV_VAL的值来判断是设置异步总线或快速总线总线(参考datasheet page243)

216 	;Configure UPLL
217 	ldr	r0,=UPLLCON
218 	ldr	r1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)  
219 	str	r1,[r0]

217-219行用来配置USB控制器的时钟,如果你碰巧没用到做USB的实验,只是下载的代码的时候用到了,可以不用管这个设置,如果你和笔者一样不碰巧,哪没有办法你还是要设置,设置多少,看需要吧。

220 	nop	; Caution: After UPLL setting, at least 7-clocks delay must be inserted for setting hardware be completed.
221 	nop
222 	nop
223 	nop
224 	nop
225 	nop
226 	nop

220-2267nop(空指令)指令,用来延迟时间7个时钟周期

227 	;Configure MPLL
228 	ldr	r0,=MPLLCON
229 	ldr	r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz
230 	str	r1,[r0]
231     ]

228-230行用来设置MPLLCON寄存器,MPLLCON寄存器配置输出的FCLK,HCLK,PCLK的值。

233 	;Check if the boot is caused by the wake-up from SLEEP mode.
234 	ldr	r1,=GSTATUS2
235 	ldr	r0,[r1]
236 	tst	r0,#0x2
237 	;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.
238 	bne	WAKEUP_SLEEP
239 
240 	EXPORT StartPointAfterSleepWakeUp
241 StartPointAfterSleepWakeUp
242 

234-238Power Mananger的知识,没有实验,不做介绍

244  	;ldr	r0,=SMRDATA
245  	adrl	r0, SMRDATA	;be careful!
246 	ldr	r1,=BWSCON	;BWSCON Address
247 	add	r2, r0, #52	;End address of SMRDATA
248 
249 0
250 	ldr	r3, [r0], #4
251 	str	r3, [r1], #4
252 	cmp	r2, r0
253 	bne	%B0
254  

244-253行设置memory control中的13个寄存器的值,每个寄存器中的值下面会介绍,

245SMRDATA的值放R0中,adrl汇编指令是小范围的跳转,是基于PC指针的。

246行把BWSCON的地址放到R1寄存器中

247R2做为计数,值为52

250-253行借助R3寄存器,把值写到MEMORY CONTROL中的13个寄存器中,每次递增4,所以52/4=13.

255 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
256 ;;;;;;;;;;;;;       When EINT0 is pressed,  Clear SDRAM 
257 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
258 ; check if EIN0 button is pressed
259 
260        ldr	r0,=GPFCON
261 	ldr	r1,=0x0
262 	str	r1,[r0]
263 	ldr	r0,=GPFUP
264 	ldr	r1,=0xff
265 	str	r1,[r0]
266 
267 	ldr	r1,=GPFDAT
268 	ldr	r0,[r1]
269        bic	r0,r0,#(0x1e<<1)  ; bit clear
270 	tst	r0,#0x1
271 	bne %F1
272 	
273 	
274 
275 ; Clear SDRAM Start
276   
277 	ldr	r0,=GPFCON
278 	ldr	r1,=0x55aa
279 	str	r1,[r0]
280 ;	ldr	r0,=GPFUP
281 ;	ldr	r1,=0xff
282 ;	str	r1,[r0]
283 	ldr	r0,=GPFDAT
284 	ldr	r1,=0x0
285 	str	r1,[r0]	;LED=****
286 
287 	mov r1,#0
288 	mov r2,#0
289 	mov r3,#0
290 	mov r4,#0
291 	mov r5,#0
292 	mov r6,#0
293 	mov r7,#0
294 	mov r8,#0
295 	
296 	ldr	r9,=0x4000000   ;64MB
297 	ldr	r0,=0x30000000
298 0	
299 	stmia	r0!,{r1-r8}
300 	subs	r9,r9,#32 
301 	bne	%B0
302 
303 ;Clear SDRAM End
304 
305 1
306 

258-303Power Mananger的知识,没有做实验,不做介绍

307  		;Initialize stacks
308 	bl	InitStacks 
309 

308行初始化堆栈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值