设计F280049的CAN在线升级代码,设计思路如下:
步骤1、28004x_generic_flash_ink.cmd文件定义
MEMORY
{
PAGE 0 :
/* BEGIN is used for the "boot to Flash" bootloader mode */
BEGIN : origin = 0x080000, length = 0x000002
FLASH_UPDATE_CODE : origin = 0x098000, length = 0x008000
FLASH_APP_CODE: origin = 0x081000, length = 0x016FFC
FLASH_APP_LB_POINT : origin = 0x097FFC, length = 0x000002
FLASH_UPDATE_FLAG : origin = 0x097FFF, length = 0x000001
RESET : origin = 0x3FFFC0, length = 0x000002
}
SECTIONS
{
codestart : > BEGIN, PAGE = 0, ALIGN(4)
UPDATE_CODE : > FLASH_UPDATE_CODE PAGE = 0
LB_APP : > FLASH_APP_LB_POINT PAGE = 0
flashflag : > FLASH_UPDATE_FLAG PAGE = 0
}
说明:BEGIN为BOOT-TO-FLASH入口地址,存放跳转到升级选择函数_SwitchFunction指令;FLASH_UPDATE_CODE为升级程序存放地址;FLASH_APP_CODE为应用程序存放地址;FLASH_APP_LB_POINT为应用程序入口地址,存放跳转到 _c_int00指令;FLASH_UPDATE_FLAG地址存放是否升级标志位,初始值为0x55FF。
步骤2、f28004x_codestartbranch.asm编写
.sect "flashflag"
.WORD 55FFH
.ref _c_int00
.global code_start
.global _SwitchFunction
.sect "codestart"
code_start:
LB _SwitchFunction
.sect "LB_APP"
LB _c_int00
.text
.end
步骤3、DSP上电后,首先会跳到一个固定的中断向量,成为RESET,其地址是0x3F FFC0,RESET指向存在于boot ROM里的InitBoot函数,在Boot 到Flash模式下,会到0x08 0000所在的位置(BEGIN)开始取指令,BEGIN存放的是跳转到升级选择函数_SwitchFunction指令,在f28004x_codestartbranch.asm中执行跳转到_SwitchFunction()函数。
步骤4、在_SwitchFunction()函数中,判断升级标志位,此时FLAG = 0x55FF,则跳转到0x09 7FFC(FLASH_APP_LB_POINT),此处存放的是存放跳转到 _c_int00指令,在f28004x_codestartbranch.asm中执行跳转到 _c_int00,_c_int00是C语言运行环境的设置函数,经过_c_int00后,跳转到用C语言编写应用程序的main函数入口。
步骤5、在应用程序中,用CAN接收上位机下发的升级标志位,如果FLAG = 0x5500,则跳转到0x08 0000(BEGIN),BEGIN存放的是跳转到升级选择函数_SwitchFunction指令,在f28004x_codestartbranch.asm中执行跳转到_SwitchFunction()函数。
步骤6、在_SwitchFunction()函数中,判断升级标志位,此时FLAG = 0x5500,则执行升级程序,同时将FLASH_UPDATE_FLAG写入数据为0x55FF。升级完成后,则跳转到0x09 7FFC(FLASH_APP_LB_POINT),再次进入步骤4或者停止喂狗,DSP重启,再次进入步骤3。
现在有2个疑问:
1、步骤5,如果DSP不重启,在主函数中还能再次进入f28004x_codestartbranch.asm吗?
2、步骤6,升级完成后两种方案,跳转和重启,是否都可行?