goodcode 发表于 2012-11-4 23:33:56

从 0 地址执行LFU

LFU放flash的尾端, 执行LFU时如果擦除了第0页又没写回去那就悲剧了, 很有可能再也跑不到LFU部分了

修改了一下LGT官方的LFU 让他从0地址启动, 其实就是增加了个中断向量表通过rjmp跳到应用部分
进中断的效率比LGT芯片正常程序会慢一个时钟,与AVR相同
RJMP        K        相对跳转        PC ← PC + K + 1        None        1         2        2
JMP        K        直接跳转        PC ← K        None        2         3        4

目前只是测试一下能用了, 不过长度已经超过512字节了{:sweat:}

普通工程支持这个LFU需要增加编译选项
-Wl,-section-start=.text=0x400

LFU_Tool 修改, 跳过装入的二进制文件前1024字节再写入
LFU 增加了中断向量表和进入LFU的检测
testprj 测试工程







logicgreen 发表于 2012-11-5 22:17:45

进入Bootloader升级条件的代码要放在和Bootloader一起,以免被擦除。

方法:1,如果是硬件跳线,复位后就要立刻检测跳线条件。
      2,如果是在应用程序当中检测进入Bootloader条件(比如SPI,USRAT,自定义协议跳转),在主程序要跳回Bootloader区去检测进入
         Bootloader的条件。

这个做法的目的是在升级过程当中主程序升级失败时,还可以重新复位后还可以有进入Bootloader的代码,以致不会变砖。

xwkm 发表于 2012-11-6 10:47:47

我个人比较喜欢用LFU直接改掉第一条指令。然后把真正的第一条指令放在LFU上

xwkm 发表于 2013-1-30 08:30:06

我的USB HID LFU已经搞定。用LFU自动改掉第一条第二条指令,然后你懂的
页: [1]
查看完整版本: 从 0 地址执行LFU