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.

请教大家关于在线升级的问题



忙了两个月,最后关头要做个在线升级程序,从来没搞过,特来求教。

我这边是一个子板,主机会把HEX文件或者BIN文件通过I2C发过来,我需要把这个HEX或者BIN文件写入FLASH,但是我查了很久,没有找到相关资料,比如HEX或者BIN的文件格式解析的资料,请问谁有相关资料,请帮忙发一份,多谢了~~~

我需要写一个函数,解析HEX或者BIN,然后写入FLASH,现在两个问题:

1.HEX和BIN文件的语法格式是什么样的

比如:

$A90000000,(这个是地址,但是下边的哪些是数据 ,哪些是地址,哪些是CRC呢?)
C2 08 80 00 00 80 00 00 00 00 00 00 29 00 00 02 2A 70 18 02 69 C0 00 02
6A 00 00 02 76 02 10 02 29 02 00 02 AA 81 7F 02 69 C0 00 02 EA FF 7F 02
77 02 10 02 29 0A 00 02 2B 18 00 02 00 00 00 00 69 C0 00 02 6A 00 00 02
77 02 10 02 29 0C 00 02 2A 00 28 02 69 C0 00 02 EB 08 2B 02 00 00 00 00
77 02 10 02 29 0E 00 02 2A EE 02 02 69 C0 00 02 6A 00 00 02 77 02 10 02
29 10 00 02 AA 44 0A 02 69 C0 00 02 EA 07 00 02 76 02 10 02 28 00 82 01
68 00 C8 01 66 36 8C 00 66 36 0C 00 64 36 0C 02 00 40 00 00 12 06 00 30
00 80 00 00 26 36 8C 02 C2 29 00 00 92 01 00 20 12 FF FF 3F C0 08 80 00
A0 67 8C 30 36 36 90 02 A0 87 8F 32 40 89 94 81 62 03 04 00 00 80 00 00
00 00 00 00 00 00 00 00
$A90000400,
40 50 07 B0 60 C7 02 00 00 04 00 00 F6 14 BD 01 00 20 00 00 F4 22 3C 02
00 20 00 00 F8 00 80 01 F4 42 BC 01 00 20 00 00 D4 82 BD 01 00 20 00 00
D4 A2 BD 01 00 20 00 00 FA 00 00 02 D6 C2 3D 02 00 20 00 00 5B 10 10 02
90 08 43 00 C4 02 10 02 2A 2C 82 01 42 89 BE 02 42 09 3E 02 6B 00 80 01

2.如何写入FLASH(直接把地址指针化,然后写入可行吗?)

  •  1.    BIN文件格式
             对二进制文件而言,其实没有”格式”。文件只是包括了纯粹的二进制数据。
             
    2.   HEX文件格式
             HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。记录的基本格式为:
             +---------------------------------------------------------------+
    | RECORD | RECLEN | LOAD | RECTYPE | INFO or DATA | CHKSUM |
    | MARK ':' | | OFFSET | | | |
             +---------------------------------------------------------------+
             |  1-byte   | 1-byte | 2-byte | 1-byte  |    n-byte    | 1-byte |
             +---------------------------------------------------------------+
            
             记录类型包括:
             '00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
             '01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
             '04' Extended Linear Address Record: 用来标识扩展线性地址的记录
             '02' Extended Segment Address Record: 用来标识扩展段地址的记录
            
             在上面的后2种记录,都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。
             对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。
            
             数据记录的具体格式:
             +---------------------------------------------------------------+
             |   RECORD  | RECLEN |  LOAD  | RECTYPE | INFO or DATA | CHKSUM |
             |  MARK ':' |        | OFFSET |  '00'   |              |        |
             +---------------------------------------------------------------+
             |  1-byte   | 1-byte | 2-byte | 1-byte  |    n-byte    | 1-byte |
             +---------------------------------------------------------------+        
            
             看个例子:
            :020000040000FA
            :10000400FF00A0E314209FE5001092E5011092E5A3
            :00000001FF        
          
            对上面的HEX文件进行分析:
            第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0000,校验和为
            FA。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为0X0000。后面的数据记录都以这个地址为基
            地址。
            第2条记录的长度为10(16),LOAD OFFSET为0004,RECTYPE为00,说明该记录为数据记录。
            数据为FF00A0E314209FE5001092E5011092E5,共16个BYTE。这个记录的校验和为A3。此时的基地址为0X0000,加上OFFSET,
            这个记录里的16BYTE的数据的起始地址就是0x0000 + 0x0004 = 0x0004.
            第3条记录的长度为00,LOAD OFFSET为0000,TYPE = 01,校验和为FF。说明这个是一个END OF FILE RECORD,标识
            文件的结尾。
          
            在上面这个例子里,实际的数据只有16个BYTE:FF00A0E314209FE5001092E5011092E5,其起始地址为0x4

    更多关于hex见附件

    第二个问题 我说不清,你百度一下,上面有关于这的资料。

    Hexfrmt.pdf
  • 1. Hex文件的格式看一下下面文档第章节11.13 Description of the Object Formats
    http://www.ti.com/lit/ug/spru186w/spru186w.pdf

    2. bin文件可以用fread, fwrite读写. hex文件需要去掉一些头信息等附加信息, 取出有效数据, 组成一个数组放在烧写代码中.

    flash需要先clear/erase, 再可以program.  

  • Hi,zhang:

     有几个问题想请教:

     1.fread/fwrite 必须先fopen,那这个fopen所创建的文件是在flash上边吗?

     2.我试着用fopen打开并建立一个文件,然后fwrite写入,再fread读,在JTAG仿真能运行,但是把这个程序写到FLASH就不行了,程序不能运行,请问是怎么回事?

     3.另外我用的是CCS3.1 我用HEX6X.EXE把OUT文件转换为HEX文件,请问有什么工具是可以转换为BIN文件的?

  • HI,Zhao:

       我还是要烧bin文件,因为其他子板都是bin格式。

       请问bin格式是什么样的,是从0地址开始,连续的数据,如果中间没有用到就填充0xFF吗?

  • 1. fopen的文件包含在你写的flash烧写程序中, 不用存放在flash上

    2. 为什么要把flash烧写程序写到flash中? flash烧写程序的目的是把你的代码烧写到flash

    3.  在命令中输入-b选项

  • 二楼的工程师已经回答了, bin文件没有格式, 就是二进制数据.

  • Hi,zhang:

       关于2 的问题,我这个项目是一个子板,要做因特网在线升级,主机从网络下载升级文件,里边包含了各个子板的升级bin文件,然后把DSP的bin文件发给我,所以我的bin文件不可能放到本地电脑里边,这已经不处于调试阶段,是用户使用阶段了。

      现在是主机会把bin文件通过I2C发给我,大概275K,然后我把这275K文件要写到FLASH,来做到在线升级。

  • 那你只要把I2C DRR寄存器里收到的数据往flash里写就可以了

  • Hi,zhang:

       我这个是nor-flash,可以直接读。但是写的话,要先擦除,再按时序来写。我现在是擦除不成功,下边是我的擦除程序:

    unsigned int Flash_Erase_All(void)
    {
      unsigned int i,j;
      *FLASH_555 = 0xAA;
      *FLASH_2AA = 0x55;
      *FLASH_555 = 0x80;
      *FLASH_555 = 0xAA;
      *FLASH_2AA = 0x55;
      *FLASH_555 = 0x10;
      while((*FLASH_555 & 0x80) != 0x80);
      for(i = 0; i < CHIP_SIZE; i++)
     {
      if(*(unsigned int *)(addr + i) != 0xffff)
     {
       j = -1;
      return  j;
    }
    }
    j = 1;
    return j;
    }

  • 量一下擦除时序符合flash数据手册吗? 如果整个block不能擦除, 试试sector是否能擦除?

    另外, 看一下WP写保护位.

  • 我看数据手册,上边说擦除是不用管时序的,只要发命令就行了。WP位为高,没有保护。

    如果擦除需要时序,那一般是哪几个时序CE OE WE还有其他的吗?

  • 命令是这样写的, 但实际上有没有写进去呢, 要对照时序的, 你看一下你flash数据手册, 应该有擦除的时序图, 包括CE, OE, WE, Data bus, address bus, Read/write等信号

  • Hi,zhang & all:

      搞了几天,有点进展,首先用fopen fwrite等函数,读写bin,会出现很多写不进去的情况,就是前边大概13.5K会写对,后边的就不对了,还是擦写后的状态0xff.

      而且我的在线升级不会用到fwrite函数,所以暂时没去查原因了。

     

      现在的问题是,我用I2C收到升级的bin文件,大概254K,我直接从norflash的0地址写入,会不会影响到正在运行的程序? 换句话说:DSP在运行时,会不会把所有的flash内容,全部读入sdram,然后就不关flash的事了?

  • DSP运行时, 会把flash里的代码搬移到RAM中运行, 注意不要把保存在flash中的flash烧写程序覆盖掉, 否则板子下电后, 如果要再次更新程序, 就没flash烧写程序了, 除非你升级的bin文件中包含了flash烧写程序.