- 论坛徽章:
- 0
|
之五搁置了编译器和链接器打架的问题,接下来就要验证能否顺利启动了,验证能否启动的最好方法,就是在程序开头加上闪灯的死循环,于是迫不及待地把这段代码加到initcpu.s的开头:
reset_start:
ldr r0,=0x7f008820
ldr r1,=0x1111
str r1,[r0]
ldr r0,=0x7f008824
ldr r1,[r0]
bic r2,r1,#3
orr r2,r2,#0xc
bic r3,r1,#0xc
orr r3,r3,#3
nn:
str r2,[r0]
ldr r4,=10000000
delay1:
sub r4,r4,#1
cmp r4,#0
bne delay1
str r3,[r0]
ldr r4,=40000000
delay2:
sub r4,r4,#1
cmp r4,#0
bne delay2
b nn
编译,下载,瞪大眼睛看着LED,迫不及待地打开电源,令人失望地,蓝色的LED始终没有发出一丝光线,好不容易“解决”了编译问题,新的问题又出来了。才灭恶狼,又遇猛虎,6410移植之路,命运多舛啊,简直是在考验我的忍耐力。由于没有仿真器,也不知道程序跑到哪里去了。用SD卡启动的话,norflash的物理地址是0x10000000,烧入程序后,写了一个非常简单的SD卡启动的程序,该程序直接跳转到0x10000000处,发现是可以正常闪灯的。于是判断为,要么是启动时从norflash读指令出错,要么根本没从norflash读指令。先找友坚科技的工程师问问吧,结果一样令我失望,他们根本就没有测试过从norflash启动,只好自己啃问题了。又把6410 datasheet中关于启动的部分仔细读了一遍,并且对比idea6410和三星开发板SMDK6410的图纸,还是没有发现错误。
无奈之下,找来示波器,看启动时读norflash的信号是否正常,对比am29lv160db的数据手册,芯片访问的时序也是正确的,难道真的无解了吗?
既然复位后确实读了norflash,且波形正确,就不应该怀疑cpu是否正确地从norflash启动了,google吧,耗费了半天时间,一点线索都没有,无奈之下,还是对比源程序仔细读手册吧,不过这时换成读arm1176jzf-s的文档了。
终于,在inticpu.s中看到这个指令:
ldr r0, =(Peripheral_base+0x13)
mcr p15,0,r0,c15,c2,4
这两条指令是把外设寄存器的地址告诉cpu的,难道是这里出了问题?于是把闪灯程序挪到这两条指令后面,再试,OK,令人激动的蓝色LED,终于像我的脉搏一样,欢快地跳动起来了。
原来,arm1176jzf-s把memory和Peripheral接口分开了,你需要在初始化时告诉cpu,哪些地址范围是属于Peripheral的,否则它就当memory访问,当然就访问不到属于Peripheral 区间的IO口寄存器了,所以灯也就不闪了。
这个问题,看似短短几句话就说完了,却着实为难了我好几天。 |
|