2440init代码分析(3)

来源:互联网 发布:李兴华java百度网盘 编辑:程序博客网 时间:2024/06/01 23:21
160 ;=======161 ; ENTRY162 ;=======163 ResetHandler164 ldrr0,=WTCON       ;watch dog disable165 ldrr1,=0x0166 strr1,[r0]167 

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

168 ldrr0,=INTMSK169 ldrr1,=0xffffffff  ;all interrupt disable170 strr1,[r0]171 172 ldrr0,=INTSUBMSK173 ldrr1,=0x7fff;all sub interrupt disable174 strr1,[r0]175

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

176 [ {TRUE}177 ;rGPFDAT = (rGPFDAT & ~(0xf<<4)) | ((~data & 0xf)<<4);178 ; Led_Display179 ldrr0,=GPBCON180 ldrr1,=0x00555555181 strr1,[r0]182 ldrr0,=GPBDAT183 ldrr1,=0x07fe184 strr1,[r0]185 ]186

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

187 ;To reduce PLL lock time, adjust the LOCKTIME register.188 ldrr0,=LOCKTIME189 ldrr1,=0xffffff190 strr1,[r0]191

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

192     [ PLL_ON_START193 ; Added for confirm clock divide. for 2440.194 ; Setting value Fclk:Hclk:Pclk195 ldrr0,=CLKDIVN196 ldrr1,=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 strr1,[r0]198 ;MMU_SetAsyncBusMode and MMU_SetFastBusMode over 4K, so do not call here199 ;call it after copy200 ;[ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1.201 ;bl MMU_SetAsyncBusMode202 ;|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 directly206 [ CLKDIV_VAL>1 ; means Fclk:Hclk is not 1:1.207 mrc p15,0,r0,c1,c0,0208 orr r0,r0,#0xc0000000;R1_nF:OR:R1_iA209 mcr p15,0,r0,c1,c0,0210 |211 mrc p15,0,r0,c1,c0,0212 bic r0,r0,#0xc0000000;R1_iA:OR:R1_nF213 mcr p15,0,r0,c1,c0,0214 ]215 

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

216 ;Configure UPLL217 ldrr0,=UPLLCON218 ldrr1,=((U_MDIV<<12)+(U_PDIV<<4)+U_SDIV)  219 strr1,[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 nop222 nop223 nop224 nop225 nop226 nop

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

227 ;Configure MPLL228 ldrr0,=MPLLCON229 ldrr1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ;Fin=16.9344MHz230 strr1,[r0]231     ]

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

233 ;Check if the boot is caused by the wake-up from SLEEP mode.234 ldrr1,=GSTATUS2235 ldrr0,[r1]236 tstr0,#0x2237 ;In case of the wake-up from SLEEP mode, go to SLEEP_WAKEUP handler.238 bneWAKEUP_SLEEP239 240 EXPORT StartPointAfterSleepWakeUp241 StartPointAfterSleepWakeUp242 

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

244  ;ldrr0,=SMRDATA245  adrlr0, SMRDATA;be careful!246 ldrr1,=BWSCON;BWSCON Address247 addr2, r0, #52;End address of SMRDATA248 249 0250 ldrr3, [r0], #4251 strr3, [r1], #4252 cmpr2, r0253 bne%B0254  

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 pressed259 260        ldrr0,=GPFCON261 ldrr1,=0x0262 strr1,[r0]263 ldrr0,=GPFUP264 ldrr1,=0xff265 strr1,[r0]266 267 ldrr1,=GPFDAT268 ldrr0,[r1]269        bicr0,r0,#(0x1e<<1)  ; bit clear270 tstr0,#0x1271 bne %F1272 273 274 275 ; Clear SDRAM Start276   277 ldrr0,=GPFCON278 ldrr1,=0x55aa279 strr1,[r0]280 ;ldrr0,=GPFUP281 ;ldrr1,=0xff282 ;strr1,[r0]283 ldrr0,=GPFDAT284 ldrr1,=0x0285 strr1,[r0];LED=****286 287 mov r1,#0288 mov r2,#0289 mov r3,#0290 mov r4,#0291 mov r5,#0292 mov r6,#0293 mov r7,#0294 mov r8,#0295 296 ldrr9,=0x4000000   ;64MB297 ldrr0,=0x30000000298 0299 stmiar0!,{r1-r8}300 subsr9,r9,#32 301 bne%B0302 303 ;Clear SDRAM End304 305 1306 

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

307  ;Initialize stacks308 blInitStacks 309 

308行初始化堆栈

原创粉丝点击