160 ;=======
161 ; ENTRY
162 ;=======
163 ResetHandler
164 ldr r0,=WTCON ;watch dog disable
165 ldr r1,=0x0
166 str r1,[r0]
167
第164-166行watchdog也是个定时器,一般是用来监控系统有没有”跑飞”,正常情况下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-190行LOCKTIME寄存器用来指定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_VAL=5,查看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-226行7个nop(空指令)指令,用来延迟时间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个寄存器的值,每个寄存器中的值下面会介绍,
第245行SMRDATA的值放R0中,adrl汇编指令是小范围的跳转,是基于PC指针的。
第246行把BWSCON的地址放到R1寄存器中
第247行R2做为计数,值为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行初始化堆栈