看到网上各种CCS生成bin文件方法,尝试后发现输出的bin文件长度和内容不正确,为帮助大家开发,特将此教程写给网友,帮助解决bin文件生成(BIN文件不对升级可头疼了)。
生成bin文件有两种方案,下面对两种方法介绍如下:
一、方案一:
步骤1:添加一个txt文件,如下:
ROMS {
all_mem: o = 0x10c000, l = 0x16000,fill=0xffff
}
说明:
1.o=0x10C000,为bin的起始地址,单位byte,因为dsp内存是双字节格式,再此处应该换算成单byte值,例如:280013x_generic_flash_lnk.cmd描述如下:FALSH_APP0_AREA起始地址为0x86000,那么ROMS里面需要填写的0=0x10c000;
2.l=0x16000,为bin文件的长度,对于280013x_generic_flash_lnk.cmd文件中的APP区域长度,也需要换算成单字节长度,即length =0xAFEE,由于BEGIN的起始需要留2bytew,即对应片子4字节空间,因此完整的APP程序空间等于0xAFEE+2=0xB000,因此换算成长度等于0x16000,
3.fill=0xffff,由于仿真器下载后的固件导出,发现无效数据场都是0xffff,因此此处填写0xffff,用于填充无效数据场,如果不指定该参数,那么系统默认填充0x00,目前对系统工作是否有影响不可知,建议指定fill=0xffff,
注:bytew,表示宽字节,即1个bytew=2byte.
MEMORY
{
BEGIN : origin = 0x00086000, length = 0x00000002
BOOT_RSVD : origin = 0x00000002, length = 0x00000126
RAMM0 : origin = 0x00000128, length = 0x000002D8
RAMM1 : origin = 0x00000400, length = 0x000003F8
// RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RAMLS0 : origin = 0x00008000, length = 0x00002000
RAMLS1 : origin = 0x0000A000, length = 0x00001FF8
// RAMLS1_RSVD : origin = 0x0000BFF8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RESET : origin = 0x003FFFC0, length = 0x00000002
/* Flash sectors 需按照0x400即1个page为最小单位分配*/
FLASH_BOOT_AREA :origin = 0x080002, length = 0x5FFE /* BOOT存储区域 24kw*/
FALSH_APP0_AREA :origin = 0x086002, length = 0xAFFE /* APP0 44kw*/
FALSH_PARA_AREA_RSVD0 :origin = 0x091000, length = 0x1000 /* 保留4个扇区空间 */
FALSH_APP1_AREA :origin = 0x092002, length = 0xAFFE /* APP1 44kw*/
FALSH_PARA_AREA_RSVD1 :origin = 0x09D000, length = 0x1000 /* 保留4个扇区空间 */
FALSH_PARA_AREA_A :origin = 0x09E000, length = 0x800 /* 参数区域A */
FALSH_PARA_AREA_B :origin = 0x09E800, length = 0x800 /* 参数区域B */
FALSH_PARA_AREA_VERINFO :origin = 0x09F000, length = 0x800 /* 系统软件和硬件版本信息 */
FALSH_PARA_AREA_UPDATAINFO :origin = 0x09F800, length = 0x7F0 /* 固件升级记录信息*/
// FLASH_BANK0_SEC_127_RSVD : origin = 0x0A0FF0, length = 0x0010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
}
SECTIONS
{
codestart : > BEGIN
.text : >> FALSH_APP0_AREA, ALIGN(8)
.cinit : > FALSH_APP0_AREA, ALIGN(8)
.switch : > FALSH_APP0_AREA, ALIGN(8)
.reset : > RESET, TYPE = DSECT /* not used, */
.stack : > RAMM1
#if defined(__TI_EABI__)
.bss : > RAMLS0
.bss:output : > RAMLS0
.init_array : >> FALSH_APP0_AREA, ALIGN(8)
.const : >> FALSH_APP0_AREA, ALIGN(8)
.data : > RAMLS0
.sysmem : > RAMLS0
.bss:cio : > RAMLS0
#else
.pinit : >> FALSH_APP0_AREA, ALIGN(8)
.ebss : > RAMLS0
.econst : >> FALSH_APP0_AREA, ALIGN(8)
.esysmem : > RAMLS0
.cio : > RAMLS0
#endif
#if defined(__TI_EABI__)
.TI.ramfunc : LOAD = FALSH_APP0_AREA,
RUN = RAMLS0,
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
RUN_SIZE(RamfuncsRunSize),
RUN_END(RamfuncsRunEnd),
ALIGN(8)
#else
.TI.ramfunc : LOAD = FALSH_APP0_AREA,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
ALIGN(8)
#endif
/* Allocate IQ math areas: */
IQmath : > FALSH_APP0_AREA, ALIGN(8)
IQmathTables : > FALSH_APP0_AREA, ALIGN(8)
DataBufferSection : > RAMLS1, ALIGN(8) /* flash操作的数据缓存 */
}
上述配置,分为boot和APP区域,目的是为了实现CAN或者UART升级,具体升级方案可以私信指导。
步骤二:编写bat文件,内容如下:
@echo off
set CurrentPath=%~dp0
set P1Path=
set P2Path=
set P3Path=
set P4Path=
set P5Path=
:begin
for /f "tokens=1,* delims=\" %%i in ("%CurrentPath%") do (set content=%%i&&set CurrentPath=%%j)
if "%P1Path%%content%\" == "%~dp0" goto end
set P5Path=%P4Path%
set P4Path=%P3Path%
set P3Path=%P2Path%
set P2Path=%P1Path%
set P1Path=%P1Path%%content%\
goto begin
:end
::echo BatPath=%~dp0
::echo P1Path=%P1Path%
echo P2Path=%P2Path%
::echo P3Path=%P3Path%
::echo P4Path=%P4Path%
::echo P5Path=%P5Path%
::鍓嶉潰鐨勬寚浠ょ敤浜庤幏鍙栦笂绾х洰褰�
echo delete old bin
del %~dp0\ET_BDC_48400_00137.bin
echo create new bin
choice /C yn /T 1 /D y >nul
D:/ti/ccs1260/ccs/tools/compiler/ti-cgt-c2000_22.6.1.LTS/bin/hex2000 -q -b -image -o %~dp0/ET_BDC_48400_00137.bin %~dp0/bin_build_para.txt %P2Path%/RUN_FLASH/ET_BDC_48400_00137.out
set out=
echo out=%~dp0%ET_BDC_48400_00137.bin
exit 0
本质为通过TI的hex2000工具,通过上述ROMS文件和.OUT文件作为输入参数,输出指定的bin件,核心部分为:
D:/ti/ccs1260/ccs/tools/compiler/ti-cgt-c2000_22.6.1.LTS/bin/hex2000 -q -b -image -o %~dp0/ET_BDC_48400_00137.bin %~dp0/bin_build_para.txt %P2Path%/RUN_FLASH/ET_BDC_48400_00137.out
其余部分只是为了笔者指定输出文件位置,或者和输出文件存放路径有关系
步骤3:点击.BAT文件生成bin文件,工作完成。
相关文件如下:
方案二:通过编译器设置实现:
参考下图方式:
Bin_build_para.txt,即前面方案1的ROMS文件,作为CCS的bin生成地址方位和无效数据填充指定。文件前面的为路径变量,可以是环境路径变量,也可以是绝对路径。
通过上述步骤就可以完整正确的bin输出了。