[ZLG-ARM] LPC2220给我当头一棒!!!!

[复制链接]
3405|7
 楼主| VisionShow 发表于 2007-3-27 20:14 | 显示全部楼层 |阅读模式
在**中所有菲利普的芯片都是头8字(4字节为一字)累加和为零作为判断用户程序是否有效的标准,于是就这样写了程序:(我用的是GCC,没有用ADS)<br />_start:<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br />&nbsp;&nbsp;.long&nbsp;&nbsp;0x9DDFFFFD<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;[PC,&nbsp;#-0xFF0]<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset<br /><br />Reset:<br />......<br /><br />在LPC2103,2214,2138等有内部FLASH的片子上跑都很正常,用了LPC2220后,这样就不行了,无法启动程序!!!!,&nbsp;就这个问题折腾了近一个礼拜,打了不少电话,最后没有办法只好买了一块开发板,把附带的程序反汇编出来看,一句一句的对,最后却得出这样的结果,真是一个大坑呀!<br />以下是能够启动的代码:<br />_start:<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;Reset<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;Undefine<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;SWI<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;Prefetch<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;DataAbort<br />&nbsp;&nbsp;.long&nbsp;&nbsp;0xB9205F80<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;[PC,&nbsp;#-0xFF0]<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;FIQ<br /><br />Reset:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />Undefine:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />SWI:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />Prefetch:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />DataAbort:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />FIQ:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br /><br />
有意思 发表于 2007-3-27 22:08 | 显示全部楼层

早就晕了

  
hotpower 发表于 2007-3-27 22:20 | 显示全部楼层

不一定都是0xB9205F80~~~

  
 楼主| VisionShow 发表于 2007-3-27 22:40 | 显示全部楼层

奇怪

<br />不一定都是0xB9205F80,的却,因为程序都不是一致的,但所有的资料上都是:&nbsp;头32字节的累加和为0,&nbsp;上面的程序明显违反了这条原则<br />估计在片内ROM中还进行了其他判断,不然第一个启动程序就应该是对的
 楼主| VisionShow 发表于 2007-3-27 23:47 | 显示全部楼层

请周工解释一下这种现象

这样能运行<br />_start:<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;DataAbort<br />&nbsp;&nbsp;.long&nbsp;&nbsp;0xA3400FF2<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;[PC,&nbsp;#-0xFF0]<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br /><br />SystemReset:<br />.......<br /><br />这样不能运行<br />_start:<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br />&nbsp;&nbsp;.long&nbsp;&nbsp;0xA3C00FF3<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;&nbsp;[PC,&nbsp;#-0xFF0]<br />&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;FIQ<br /><br />FIQ:<br />.long&nbsp;&nbsp;&nbsp;&nbsp;SystemReset<br /><br />SystemReset:
high 发表于 2007-3-28 09:05 | 显示全部楼层

这个

只是说自己不熟悉工具了<br /><br />隐约记得isp工具也提供了自动计算功能。
yanhan 发表于 2007-3-28 13:48 | 显示全部楼层

这是相对跳转和绝对跳转的区别,也就是B指令和LDR指令的区

不能启动的代码是因为reset位置不确定,在内部Flash跑时就在启动代码后面,在外部flash跑时,地址就远了。<br />而能启动的代码是因为reset的位置固定,就在异常向量表的后面,而在这个地址上再放SystemReset程序的地址,虽然这个地址也会因为flash位置不同而不同,但是它不在累加和计算范围内。
 楼主| VisionShow 发表于 2007-3-28 15:22 | 显示全部楼层

楼上不要误导人

<br />楼上,你所说的只有“它不在累加和计算范围内”这句话是对的,其他都是错的,<br />&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

28

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部