This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

急!CCS烧写Flash的问题

我用的CCS5.2, 烧写Flash时,是可以指定需要擦除的分区的,如下图:

我的问题是,每个工程必须擦除Flash A吗?如上图我的工程是占用了B和H两个的,不用A,但debug的时候报错,报错提示:0x33FFF6处没法擦除;

我知道这个在cmd文件中是:

BEGIN      : origin = 0x33FFF6, length = 0x000002     /* Part of FLASHA.  Used for "boot to Flash" bootloader mode. */

请问这个BEGIN必需要被擦除么?如果不,应该怎么设置呢?CCS中没有指定可以擦除用户指定的区间吧?

  • 是啊,要擦除,因为BEGIN那里放的是code start代码,放一条跳转指令,如果跳转地址在编译后有变化的话,确实是需要重新编译烧写的。

    只要编译后代码发生变化的区域,都需要擦除再烧写。如果你确定扇区A所有区域代码都不变,那么可以不用。

    Eric

  • 不好意思,可能是我理解有问题,没太明白你的意思;

    我想要的是不擦出flashA,可以做到么?

    我工程大部分放在flashB,还有一部分拷贝至内存运行的存储在flashH;

    但flashA中有其他工程的代码,所以我不想擦除。

    请问怎么解决呢?

  • 原则是:如果flash A扇区在你整个开发过程中都不会变,那就不用管。扇区A包括code start, 对应BEGIN的存储块。

    首先你要确定flash A中你的其他工程代码都不会变。其次是code start:

    code start是上电后会跳转到那里运行,那两个单元时候放了一个跳转指令,跳转到_c_int00,所以如果c_int00地址如果不变的话,那这两个单元也不会变。

    下面是一种固定_c_int00的方法。

    memory:

       CINT00      : origin = 0x13E000, length = 0x000050

    section:

    boot : > CINT00 PAGE = 0
    {
    -l rts2800_fpu32.lib<boot.obj>(.text)
    }

  • 谢谢了  Eric Ma!
    其实我也是在做在线升级相关的工程,我在论坛看你回答这类帖子蛮多的,麻烦跟我们这些菜鸟分享些经验吧。

    1. 我想这样,分两个独立工程来做,flashA中烧写类似于bootloader程序,flashB中烧写项目程序;

    我的理解是每次项目程序调好后通过仿真器烧写时,都必须擦除flashA啊,如果擦除flashA那个钩不选就烧写失败,但flashA中我已经存储我的boot代码了,所以选择擦除flashA的话,就没有bootloader程序了。。。

    2. 在附加一个问题:在项目程序中如何跳转至boot程序呢?比如boot程序烧写在flashA(0x338000),难道直接类似于这样(*(0x338000))()来调用吗?谢谢了~

     

  • Scott

    两个工程的方式,确实可以,如bootloader 工程, APP工程。

    那么首先你要理解code start的含义,这个是你工程的入口地址,那么两个工程意味着有两个code start。但是只有一个是芯片上电后会自动跳转去那里的,就是0x3ff7f6这个地址的code start。另外的app 的code start你就自己定义一个地址给它就好了,如FLASH B的起始两个单元。

    那么就可以将bootloader 都放在A扇区,如果当你的升级代码OK之后,这个扇区的东西就可以不用擦除了。其他扇区都作为APP工程。

    升级的逻辑是:上电后芯片跑到Bootloader 的code start中,这里你应该判断是否要升级,如果不升级,应该就要跳转到APP的code start。升级的话,就跳转到bootloader的_c_int00. 这是上电的逻辑1.

    逻辑2是APP正常运行时,接到串口的升级指令,这时候要跳转到bootloader中去,可以直接跳转到bootloader的_c_int00(可以通过上贴的方法固定_c_int00的地址)。

    如此,两个工程就是独立的,都可以单独烧写。Flash A烧bootloader, 其他扇区烧APP。

    至于跳转的函数怎么调用,可以给你个参考:

    #define C28Update (void   (*)(void))0x0013e000  //0013a000 //

    ........

    main{

    ......

    //接到升级指令

    (*C28Update)();

    }

    bootloader 的cmd中:

    memory{

    CINT00      : origin = 0x13E000, length = 0x000050

    .....

    }

    section{

    ......

    boot : > CINT00 PAGE = 0
    {
    -l rts2800_fpu32.lib<boot.obj>(.text)
    }

    }

    Eric

  • 这是TI早期的bootloader例程,但跟在线升级还是不大一样。它是使用ROM中的sci boot接收flash API算法,然后再烧写。仅供你参考某些思路或是某些函数写法而已。具体逻辑,你按我上一贴是可以的。

    Eric

  • 非常感谢!Eric

    牛人就是不一样,啥都懂... 可是还有几个问题不懂,希望您能回复。

    1. 我添加过后有警告:-l rts2800_fpu32.lib<boot.obj>(.text)  no matching section。。

    2. 具体应该如何实现呢?我感觉这里才是关键;你说的这种方法我在网上看过,应该需要自己写汇编程序吧?

      汇编应该还要有一个功能就是用来执行退出吧,比如像官方的exit.asm中有什么_Exit_boot函数之类的。。。

    一直在坚持用TI的产品,再次期待您的回复......

    scott.

  • 1.0x13E000 这个地址是需要改的,根据你的芯片程序放在哪里来改,比如你的代码放在BCD扇区,那我可以把这个地址改成BCD起始两个单元。

    2. 是需要在code start中写汇编的:

    下面是一个样例:通过查询0x13F780开始的每隔四个单元的值是否是0xFFFF或0xFFF0来判断跳到哪里。这只是样例,你只要知道是如何跳转就行,至于判断条件,你自己写。你也可以只判断某个段元的值是否等于xxxx,如果是,则跳转到C_INT00,即bootloader,如果不是,则跳转到APP,正常运行。

  • Eric Ma

    非常感谢~

    试着自己写写,表示汇编的压力很大额~

    请问,不同Flash块中的程序,是不是都可以通过_c_int00来直接的跳转?不会出现什么问题吗?

    我在网上看到很多人说从boot程序跳到app应用程序,跳过去后,应用程序运行不正常。。。

    说是要一段汇编程序,貌似是_ExitBoot之类的,请问你有了解吗?

    我觉得那应该是SCI启动方式下需要用的。。。

    scott

  • _C_INT00是针对不同的工程。一个工程有自己对应的一个C_INT00。

    按照我的那个逻辑跳转,是没有问题的。原因是,如果判断升级,你就跳转到boot 的c_int00,如果不升级,再跳转到app的code start,差不多也等于跳转到app的c_int00.

    Eric

  • 谢谢!Eric

    最后还想问一下,关于串口文件传输的问题。

    我想在arm板子的Linux系统中写个类似于上位机的程序与28335通讯,发送Flash文件数据;

    这个貌似要求比较严格,要转换格式为.hex、还要保证数据完整性等等,对这一块也不太熟悉,要写类似于modbus的协议么?

    Eric 麻烦给点参考建议或资料呢?

    scott

  • 串口传输文件,这个难点在于如何把hex文件解析出来。至于你把地址和数据提取出来后,你想怎么发送给C2000,用什么协议,这都你自己定就可以了。当然有些应用可能有规定具体的协议。但是如果没有,你就最简单的那种就行了,如

    地址,数据长度,数据,校验和。

    Eric

  • 我也在做基于UART对C2000升级这个功能,现在的问题是CCS编译生成.out后,怎样转换成.hex,转换成后.bin,有没有什么工具?

  • 在CCSv5或CCSv6上有一个功能可以生成hex文件。

    右键工程,属性,CCS Build 》 steps 》 post build steps中的apply predefined step中选择intel hex。

    Eric

  • 您好, Eric Ma

       我目前在做dsp串口升级的程序梳理,我知道ccs5能够生成.hex文件,可是从.hex到.bin,需要fileoshell.exe,这个工具网上都没有介绍,更别说下载了,请问你知道从哪里下载fileoshell.exe吗,好像用hex2bin也可以,不过我看的升级方法用的是fileoshell.exe,比较完整,换成hex2bin不知道会出什么错

  • 沉得真快,有TI的牛人知道吗,或者我看到在ccs中MP430可以在post-build写指令直接生成.bin,为什么C2000不好使呢

  • 我也不知道从哪里可以去下载这个软件。你要是想转换成bin格式,也可以通过CCS5或CCS6中的CCSbuild选项>step 里面的post step中,选择Intel hex,然后将-i 改成-b.

    ERIC

  • Eric Ma,

    我试了,在CCS5下的CCS build选项>step 里面的post step中,选择Intel hex,然后将-i 改成-b.

    如下图,但确没有生成.bin文件,请问这是什么原因?

    其中,在post step中

    选择Intel hex:

    "${CG_TOOL_HEX}" -i "${BuildArtifactFileName}" -o "${BuildArtifactFileBaseName}.hex" -order MS -romwidth 16

    修改后(将将-i 改成-b)

    "${CG_TOOL_HEX}" -b "${BuildArtifactFileName}" -o "${BuildArtifactFileBaseName}.hex" -order MS -romwidth 16


  • 你好,

      我和mak he一样,不过不仅不出bin文件,还出了一堆警告

    请问怎么回事

  • 你好,我用FileIOShell.exe把hex文件转换成bin文件后,是否再需要对文件进行解析,还是直接可以从串口吧bin文件存到flash的区里?

    FileIOShell.exe是否已经对hex文件解析了?

  • 请问生成的HEX文件存放在哪里?选择完 INTEL-hex后如何操作生成HEX文件,重新Build工程吗?

  • 重新编译工程,然后在debug文件夹下就有。

    ERIC

  • 你好,我怎么现在在POST BUILD STEPS 中找不到apply predefined step 这个功能呢?

  • predefine 在C2000 compiler 的 andvanced 选项中。

    ERIC

  • 您好 Eric Ma

           我的CCS中steps一栏没有下拉选项是怎么回事呢?

           谢谢。