CCS12.6 编译生成BIN文件正确方法

        看到网上各种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输出了。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值