avr bootloader
我的升级思路是:从应用程序区接到升级命令后,通过跳转指令跳转到boot区执行升级.升级成功后,从boot区退出跳到应用区的开始处执行应用程序。请问在这个过程中,应用区和boot区的变量是否会互相影响到呢?avr是怎样处理这种事情的呢?还请各位爱玩单片机的朋友出来讨论讨论!指教指教! 应用程序中,可以做个复位命令,复位后进入BootLoader区。两个区的程序完全是独立的啊,没有什么影响,程序开始的时候,都需要初始化RAM的。
新来的,不懂规矩啊,注意不要重复发贴哦。 哦 不好意思啊
上次我发的贴也是您回复的吧很感谢! 1楼的高手,请问,那个复位命令怎么写啊?复位时,是不是也要把熔丝位改变,即从bootloader启动,升级完成,又要把熔丝位改回来?谢谢拉 熔丝位可以用BootLoader区程序通过SPM指令修改,但是一般不建议这样用,很危险。一般熔丝位设置为从BootLoader区启动,系统复位就会从BootLoader区开始执行,如果升级完毕或者升级等待延迟,可以使用跳转指令跳转到工作区:
asm("JMP 0x0000"); // 在Flash大于等于16K的AVR中,支持JMP指令
或者:
asm("RJMP 0x0000");// 在Flash小于等于8K的AVR中,一般只支持RJMP指令
另外,如果需要从工作区进入BootLoader区,我一般使用饿死看门狗的方式,复位进入,而不是使用直接的跳转,因为一般来说BootLoader区的其实地址不是绝对不便的,这个跟芯片以及熔丝位设置有关,用饿死看门狗复位的方式比较保险。 【3楼】 wuliwa
1楼的高手,请问,那个复位命令怎么写啊?复位时,是不是也要把熔丝位改变,即从bootloader启动,升级完成,又要把熔丝位改回来?谢谢拉
--------------------------------------------------------
哦,开始每看清楚你的问题,复位命令是自己协议定义的。任何的通信数据,或者事件,你都可以把它当着复位命令,一旦数据或事件发生,调用一段看门狗饿死程序,就可以复位进入BootLoader区了(前提:熔丝位以设置从BootLoader区启动)。下面给一个饿死看门狗复位系统的宏,芯片为Mega168,步骤如下:
1. 关中断
2. 设置看门狗益处时间最短
3. 死循环,知道看门狗益处复位
// 注意,WDTSCR 地址为 0x60,在插入的汇编指令中,直接使用其地址
#define SYSTEM_RESET() do { \
asm("NOP"); \
asm("CLI"); \
asm("WDR"); \
asm("LDI R16, 0x18"); \
asm("STS 0x60, R16"); \
asm("LDI R16, 0x08"); \
asm("STS 0x60, R16"); \
asm("WDR"); \
asm("system_reset_loop:"); \
asm("NOP"); \
asm("RJMP system_reset_loop");\
}while(0) mark,很好,学习了 受教了,谢谢! 受益匪浅!谢一楼! 刚刚开始学习,有点消化不下 学习了 mark mark windy__xp 发表于 2009-9-26 15:54 static/image/common/back.gif
熔丝位可以用BootLoader区程序通过SPM指令修改,但是一般不建议这样用,很危险。一般熔丝位设置为从BootLoa ...
高手,加下QQ937928439,有问题请教下
页:
[1]