2440init代码分析(3)
来源:互联网 发布:李兴华java百度网盘 编辑:程序博客网 时间:2024/06/01 23:21
160 ;=======161 ; ENTRY162 ;=======163 ResetHandler164 ldrr0,=WTCON ;watch dog disable165 ldrr1,=0x0166 strr1,[r0]167
第164-166行watchdog也是个定时器,一般是用来监控系统有没有”跑飞”,正常情况下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-190行LOCKTIME寄存器用来指定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_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 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-226行7个nop(空指令)指令,用来延迟时间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个寄存器的值,每个寄存器中的值下面会介绍,
第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 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行初始化堆栈
- 2440init代码分析(3)
- 2440init代码分析(1)
- 2440init代码分析(2)
- 2440init代码分析(4)
- 2440init代码分析(5)
- 2440init.s 汇编代码分析
- 2440init.s 汇编代码分析
- 2440init.s 汇编代码分析
- Android init代码分析
- android init 代码分析
- Android init代码分析
- Android init代码分析
- ARM启动代码分析(2440init.c)
- mini2440开发板中启动代码2440INIT.S分析
- TQ2440裸奔程序>>2440init.s启动代码分析
- mini2440(5) 2440init.s代码分段分析
- 【ARM】2440init.s文件分析(3)
- 2440init.s分析
- 如何用10只实验鼠检验出1000个药瓶中哪个有毒药?
- 第一题解法二
- 兄弟单词 — 两种算法实现
- 与angularsjs兼容的html编辑器
- Ubuntu软件安装与卸载方法汇总
- 2440init代码分析(3)
- 会话跟踪
- DOS命令传送门
- VirtualBox VM下安装CentOS6.4 (高手略)
- 初学C++常遇到的问题
- matlab中的伪随机数原理
- 初学者学Java(二十)
- 深入浅出工厂模式
- 语音技术现状:四千万突破语音产业的技术壁垒?