LPC2200系列bootloader实现过程:


  • 空间

LPC2200系列bootloader实现过程:

网上也有类似的实现办法,有NXP官方提供的,这个容易获得,在LPCware网站上就可以下载最新的版本,相对来说,这个也是比较完整 的工程。还有ZLG的,AN070701,我看了一下,好象是BOOT,与应用在一个工程里,这个对我来说,不太合适,我要做的是两个独立的工 程,一个BOOT,一个APP,不过以上来种办法原理都是一样的;另外网上还有很多网友自己做的移植,我也下载一些看了,大多都直接或 是间接用了NXP,或是ZLG的方案。经过比较,我决定使用NXP的例子。

bootloader原理是boot启动之后,首先判断是否有固件需要从串口升级,如果有则通过串口下载固件,下载完成了,把固件通过IAP烧 写在0x00010000FLASH地址去,然后跳转到0x00010000地址,执行应用程序。

基本原理都是这样,明白了原理,可以轻易的改为从网口,从SD卡,启动应用程序,整个移植的过程还算顺利,意想不到的顺利,我把 串门底层收发函数移植过之后,很快就能用了,不过我不满意的是“官方BOOT”的串口收发是一种阻塞方式,好象很落后了,我在 LPC1788上使用的是非阻塞的收发方式。不过官方的BOOT功能比较完善,还有几个命令,用着不错。

用了半个月之后,突然发现了一个很隐蔽的问题,当我在LPC2294上加第二个网口的时候,不定时死机,单位跟踪也跟了,但是依然找 不到问题所在。在网上搜索了一下,发现有几个人遇到了类似的问题,“通过自定义的BOOTLOADER启动应用程序之后,不定时死机”, 现象都差不多,表现有的是printf()死机,我的这个是加第二个网口驱动死机;但有一个共同点“都使用了自定义的BOOTLOADER”,定 位问题的过程“痛苦而又漫长”,首先我确定我的应用程序没有问题:我直接把我的应用程序烧写在0X00000000地址,启动板子,没有 死机,从这基本断定我的应用程序没有问题。

但基本把问题锁定在BOOT上,但是BOOT是官方给的,应该没有问题吧,既然用了,我是很少怀疑网上官方给的程序的,象NXP这样的公 司,我只有学习的份。于是我按网上某同学的方案,把0X00000000-0X00010000这范围内的FLASH空间填充0x00,重新把应用烧在 0X00010000处,(注:中断向量表也要复制到SRAM(0x40000000)处),很长一段时间,我都在怀疑是中断向量表出问题了。这样板子上 电之后,先执行64k的NOP指令,一直到0X00010000的应用程序,这样测试,还是没有问题,这就说明我的中断向量表重映射到SRAM是没 有问题的,这样就可以基本判断是BOOT出的问题了,以上的思路基本都是网友的思路,网上也就到此为止,我做到这里,突然有了灵感 ,是不是boot往app跳转的时候出了问题了呢,马上测试,果然发现了问题所在,在上电复位的时候LPC2294是内核是处于SVC状态,而 BOOT跳转到APP的时候,在处于USR状态,这USR状态下,对很多寄存器操作都是是无效的,比较设计堆放等等操作无效,最终导致了APP 刚开始的一段汇编代码是没有正确执行的,这就为后面的不定时死机埋下了伏笔!!

找到这个如此隐蔽隐蔽的错误,真的很高兴,感谢网友做了那么多的研究,

再一次认证了,老天总是我在快要放弃时,眷顾了我一下!!


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值