一、做IAP程序在这里提醒大家主要的几点再配合本帖子的源码估计大家就能够设计出自己完美的在线升级程序。
1、本人使用开发环境是IAR for avr5.11版本,使用的仿真器是JTAGICE mkII,单片机ATMEGA168PA。
2、原理:整个思路,单片机上电通过配置熔丝使单片机从BOOT区复位,当进入主程序的时候需要通过指令设置单片机中断向量到BOOT区,这样在BOOT程序里就可以使用中断服务程序,否则中断服务程序会跳到应用程序中中断服务程序,这就不对了。当然当你运行完BOOT区程序的时候还需通过指令设置单片机中断向量到应用程序区(也就是flash 0x04开始 ,这里复位中断向量是由熔丝位配置的,当配置成从BOOT区启动时每次上电都从BOOT启动,跟中断向量映射成BOOT区还是应用程序区没关系)。本例程判断3s如果没有收到升级命令就直接跳转到应用程序中去。当然在运行应用程序的时候也可以通过发送指令跳到BOOT区,这里我一般没有直接跳转而是用AVR单片机的看门狗让单片机复位后再运行BOOT区,这样就可以升级了。
3、在我的例程里有个地址判断在EEPROM中,用于RS485地址的识别只有收到相对应的地址才能够升级,否则不升级。
4、还有一个很关键的东西一定要提醒一下大家,就是在编写好程序后如何把BOOT程序烧写到BOOT区,这是IAP一个重点。这里我使用了IAR的xcl连接文件,需要对这个文件配置自己烧写代码在flash中的位置,以及RAM的配置等等,详细修改可以参考源码给出的XCL文件。当然应用程序就没有必要修改xcl文件使用默认的就可以。当你烧写BOOT程序后,在第一次烧写应用程序时候可以在单片机上电3S(这里可以优化一下,在没有应用程序时候一直处于等待烧录而不跳到应用区)内启动烧写。
好了到此估计大家对于IAP程序的编程编写不再陌生了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>