了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序)。

  由于有了RH850 F1KM bootloader的经验,F1L C语言bootloader的开发比较顺利。由于上位机是HyperTerminal, 这个bootloader 我叫它hyperbootloder_F1L, 下面就简单介绍下,相比较hyperbootloader_F1KM, 它有以下不同

1. hdwinit

2. memory map

3. FCL 宏

首先介绍hdwinit的不同,在boot.asm文件中,代码都是汇编,但是看懂问题不大。比较坑人的是,新建CS+工程时,已经选择了正确的芯片型号,完了,自动生成的boot.asm文件中hdwinit, 既然还有以下提示:

;-----------------------------------------------------------------------------
; hdwinit
; Specify RAM addresses suitable to your system if needed.
;-----------------------------------------------------------------------------

CS+, 太蠢,为什么就不能生成不用调整直接就可以用的呢? 通过查看datasheet后,我的改动如下

RETENTION_RAM_ADDR    .set    0xfee00000
RETENTION_RAM_END .set 0xfee07fff .align 2
_hdwinit:
mov lp, r14 ; save return address mov RETENTION_RAM_ADDR, r6
mov RETENTION_RAM_END, r7
jarl _zeroclr4, lp ; clear Retention RAM mov r14, lp
jmp [lp]

接下来是介绍memory map的不同, F1KM R7F701684 是1M 的code flash, 容量非常大,memory map 随手定义的,bootloader 是 0~0x17FFF, application 是 0x18000 ~ 0xFFFFF。 bootloader 实际上不需要那么大的空间。F1L我用的是 R7F701011, code flash 只有256K的容量,所以我重新规划了memory map, bootloader 区间是0~0x0FFFF, application 区间是 0x10000~0x3FFFF. 其实bootloader区间还可以继续缩小。

接下了就是最大的坑了,在FCL library 里面有个文件 fcl_cfg.h. 在这个文件中一定不能define R_FCL_NO_BFA_SWITCH, 否则调用FCL API时一直会有exception. debug时的现象就是FCL OPEN时会跳到exception handler (中断程序)中去,具体是哪种exception我没有去探究。总之这个一定要注意,在FCL user manual中有提到F1KM 等一些芯片需要得define R_FCL_NO_BFA_SWITCH 这个宏。 F1L 不需要,所以一定不要define.

//#define R_FCL_NO_BFA_SWITCH

hyperbootloder_F1L 和 hyperbootloader_F1KM 一样非常简单好用,不需要写上位机,直接用超级终端hyperTerminal就可以,很适合实验室或开发阶段使用。

05-11 13:34