主题中讨论的其他器件:HALCOGEN、
工具与软件:
您好!
我们希望支持使用 CAN 引导加载程序进行固件升级。 因此、应可以通过引导加载程序和应用程序访问位置0x10000处的固件状态字段。
根据引导加载程序演示、我成功实现了以下功能:
引导加载程序:
-闪存上 ECC 的 halcogen 标志关闭。
- bl_link.cmd 负责 ECC
-位于闪存位置0x10000的固件升级状态标志
应用:
-闪存上 ECC 的 halcogen 标志关闭。
- sys_link.cmd 负责 ECC
-应用程序从0x10020开始
当应用程序代码都从闪存运行时、应用程序会正常运行、但访问固件状态字段会导致应用程序崩溃。
因此、从其他论坛帖子中、我知道我需要将闪存驱动程序移至 RAM。
我仅将 Fapi_Update 70uusProgram 函数复制到单独的 bl_flash.c fil 中、与引导加载程序所做的类似。
然后、我使用以下链接器文件将代码移动到 RAM 中:
--retain="*(.intvecs)"
/*用户代码 begin (1)*/
/*用户代码结束*/
/*------------------ */
/*内存映射 */
小程序
{
VECTORS (X) : origin=0x00010020 length=0x00000020 fill=0xFFFFFFFF
FLASH0 (RX):origin=0x00010040 length=0x0012FFC0 fill=0xFFFFFFFF
堆栈 (RW):origin=0x08000000 length=0x00002000
RAM (RW):origin=0x08002000 length=0x0002D000
/*用户代码 begin (2)*/
#if 1.
ECC_VEC (R):origin=(0xf0400000 +(start (vectors)>> 3))
长度=(大小(矢量)>> 3)
ecc={algoL2R5F021、input_range=vectors}
ECC_FLA0 (R):origin=(0xf0400000 +(start (FLASH0) >> 3))
长度=(SIZE (FLASH0) >> 3)
ECC={ALGORIGGER=Algorithm2R5F021、INPUT_RANGE=FLASH0}
#endif
/*用户代码结束*/
}
/*用户代码 begin (3)*/
ECC
{
algoL2R5F021:address_mask = 0xfffff8 /*地址位31:3 */
Hamming_mask = R4 /*使用 R4/R5构建在掩码中*/
parity_mask = 0x0c /*设置哪些 ECC 位为偶数和奇数奇偶校验*/
镜像 = F021 /* RM57Lx 和 TMS570LCx 是在 F021中构建的*/
}
/*用户代码结束*/
/*------------------ */
/*段配置 */
部分中)
{
.intvecs :{}>向量
#if 1.
闪存 API:
{
.\HALCoGen\source\5280edFunctions.obj Fapi_User (.text、.data)
.\HALCoGen\source\bl_flash.obj (.text、.data)
--library="c:\ti\Hercules\F021 Flash API\02.01.01\F021_API_CortexR4_Be.lib"(.text、.data)
}palign = 8 load = FLASH0、run = RAM、load_start (apiLoadStart)、run_start (apiRunStart)、size (apiLoadSize)
#endif
.text :{}> FLASH0 /*初始化的可执行代码和常量*/
#if 1.
.const:{}palign=8 load=FLASH0、run = RAM、load_start (constLoadStart)、run_start (constRunStart)、size (constLoadSize)
#endif
.cinit :{}> FLASH0 /*初始化的全局和静态变量*/
.pinit :{}> FLASH0
.data :{}>RAM.
bss :{}> RAM /*未初始化的全局变量和静态变量*/
.sysmem :{}> RAM.
FEE_TEXT_SECTION :{}> FLASH0
FEE_CONST_SECTION :{}> FLASH0
FEE_DATA_SECTION :{}>RAM.
/*用户代码 begin (4)*/
/*用户代码结束*/
}
登录到 sys_main 中。 添加了 C I:
extern unsigned int apiLoadStart;
extern unsigned int apiLoadSize;
extern unsigned int apiRunStart;
extern unsigned int constLoadStart;
extern unsigned int constLoadSize;
extern unsigned int constRunStart;
/*将闪存 API 复制到 SRAM*/
//_copyAPI2RAM_(&apiLoadStart、&apiRunStart、&apiLoadSize);
memcpy (&apiRunStart、&apiLoadStart、(UINT32)&apiLoadSize);
/*复制.const 段*/
//_copyAPI2RAM_(&constLoadStart、&constRunStart、&constLoadSize);
memcpy (&constRunStart、&constLoadStart、(UINT32)&constLoadSize);
在 XL2-TLS57012板上、固件升级后红色 LED 会亮起。
对于将代码从闪存移至 RAM 时出现什么问题、有什么想法吗?