flying1011 发表于 2005-12-8 10:07:33

使用Atmega88进行BootLoader自编程时碰到的一个令人困惑的问题,请马老师和各位高手赐

我在使用Atmega88进行BootLoader自编程时,从BootLoad区向应用Flash区跳转时,一切OK!但反过来从应用Flash区向BootLoad区跳转时,虽然能跳转过去,但跳转过程中串口总会发送一些莫名的数据。

    我的应用Flash区串口采用的是中断方式接收和发送数据,碰到上述问题后我采用了一些改进措施,同时也碰到了一些另人困惑的问题。我在跳转之前加了等待语句,发现无效;然后在跳转之前关了中断(因为串口是中断发送数据的),也无效;我甚至在跳转之前把所有IO口都设置为输入(我想输入IO口总不会输出数据吧),发现仍然无效,串口在跳转过程中还是会发送一些莫名的数据。还尝试过其他很多办法,问题始终没发解决,请马老师和各位高手不吝赐教!

machao 发表于 2005-12-10 00:55:27

在bootload中尽量不要使用中断,如果使用中断的话,需要进行中断向量的迁移,并且中断服务程序也应该放在BOOTLOAD区中。这样做比较复杂。



我在〈M128〉书中的BOOTLOAD程序不使用中断。

flying1011 发表于 2005-12-10 13:00:23

不好意思,可能我在上面的帖子里没有表述清楚。实际上我的BootLoad区程序并没有使用中断,只是应用Flash区程序使用了中断。

    而且还有一点奇怪的是,尽管我的BootLoad区程序没有使用中断,但我发现,当我从应用Flash区向BootLoad区跳转前,如果没有迁移中断向量,跳转居然不能成功;迁移了中断向量,跳转就能成功。

machao 发表于 2005-12-11 19:55:32

那么在你跳入BOOTLOAD前,先把全局中断禁止,进入BOOTLOAD后,先进行芯片的初始化.

flying1011 发表于 2005-12-12 22:01:25

我从应用Flash区向BootLoad区跳转前,做了如下工作(按先后顺序):禁止全局中断;关串口;初始化IO口(全部置为输入);迁移中断向量;最后执行跳转指令。

    进入BootLoad区后,我先初始化IO口;再初始化串口。

    这样反复实验过,发现串口在跳转过程中还是会发送一些莫名的数据。

machao 发表于 2005-12-13 09:48:40

过程是正确的,如果你的BOOTLOAD中不使用中断,那么中断向量迁移就不需要了.



你在串口TXD的外部上拉一个10K的电阻试一下,这样在I/O口初始化过程中将保持TXD为高,不会由于初始化I/O口时引起TXD的变化.

flying1011 发表于 2005-12-13 22:30:33

非常感谢马老师的耐心指导。上拉10K的电阻也试过了,而且用示波器抓了波形,跳转过程中的莫名的数据仍然存在。

    在这个问题上确实花了不少时间,都感觉有点郁闷了,有时甚至怀疑是不是Atmega88本身固有的BUG。庆幸的是这些乱码数据对我解析串口命令影响不大,不至于造成误判,所以我现在先绕过了这个问题,继续写完后面的程序。

    我想等这个项目做完,我还是会专门花一段时间来查找这个问题的原因。再次感谢马老师的宝贵意见。

johnny_dxj 发表于 2011-3-17 21:11:01

回复【6楼】flying1011
-----------------------------------------------------------------------

你好:flying1011,请问你后来有研究出问题的根源吗,我现在用这个芯片也是出现同样的问题,当从flash 跳向bootloaer 时,串口会发送:0x58,0xe6,并且死机,我的看门狗是关的,但我用其它的芯片如:at90scan64测试一切正常
页: [1]
查看完整版本: 使用Atmega88进行BootLoader自编程时碰到的一个令人困惑的问题,请马老师和各位高手赐