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.

5509A SPI模式下用例程中的.BIN文件能自举成功,但自己转换的.bin文件能烧到flash中,但程序自举失败



如题,程序通过SPI模式能将例程中的二进制.bin文件烧到串行flash中,并能自举,程序运行也正常,但自己通过转换的二进制文件不能自举。由于例程只提供了.bin文件,没有提供具体的转换命令,转换命令是参照资料写的。请高手过来看看指导指导。

这是转换的cmd文件,程序入口地址,通过查看map,确定是0x100没错,程序只有3k,flash用的是AT26df321.

-boot
-v5510:2
-serial8
-map bootloader.map
-e 0x100
-b
-o bootloader.bin
bootloader.out

还有个问题就是程序如果比较大,内部ram不够的情况下,加载到外部RAM中,是不是只要在程序的CMD文件中,将text段放在外部RAM的空间区域?相当与程序入口地址在外部RAM空间?

希望各位不吝赐教,谢谢!

  • 你写的hex cmd文件没什么问题, 查看一下HEX55.exe版本是不是2.10以上的版本?

    查看一下bootloader.map, .cinit段正确吗? 工程在编译的时候不要用-cr选项.

    查看一下GEL文件中对板子的初始化设置是否搬移到应用程序中?

    用仿真器跟一下程序, 看是程序是否正确boot进来? 是否能从程序入口地址_c_int00开始执行? 执行到哪里出错? 

    关于第二个问题, RAM不够的话, 在cmd文件中将.text段定义到外部RAM就可以了. 程序入口地址也在外部RAM空间, 你可以通过查看.map文件中的entry point address.

  • 谢谢,我在好好看看!

  • 还是没解决自举问题,hex55.exe的版本和GEL文件我都查看了没问题。难道烧写时的程序CMD像2000系列要要做相应的修改。

    这是下载程序的CMD文件:

    -w
    -stack 500
    -sysstack 500
    -l rts55x.lib

    MEMORY

    {
    PAGE 0:

    MMR : origin = 0000000h, length = 00000c0h
    SPRAM : origin = 00000c0h, length = 0000040h
    VECS : origin = 0000100h, length = 0000100h
    DARAM0 : origin = 0000200h, length = 0003E00h
    DARAM1 : origin = 0004000h, length = 0004000h
    DARAM2 : origin = 0008000h, length = 0004000h
    DARAM3 : origin = 000c000h, length = 0004000h
    SARAM0 : origin = 0010000h, length = 0004000h
    SARAM1 : origin = 0014000h, length = 0005000h
    SARAM2 : origin = 0019000h, length = 0003000h
    }
    SECTIONS
    {
    .vectors : {} > VECS PAGE 0 /* interrupt vector table */
    .cinit : {} > SARAM0 PAGE 0
    .text : {} > SARAM1 PAGE 0
    isrs : {} > SARAM2 PAGE 0

    .stack : {} > DARAM0 PAGE 0
    .sysstack: {} > DARAM0 PAGE 0
    .sysmem : {} > DARAM0 PAGE 0
    .data : {} > DARAM1 PAGE 0
    .bss : {} > DARAM1 PAGE 0
    .const : {} > DARAM1 PAGE 0

    .cio : {} > DARAM2 PAGE 0
    .csldata: {} > DARAM0 PAGE 0
    }

    转换成BIN后生成的map文件如下:

    NPUT FILE NAME: <bootloader.out>
    OUTPUT FORMAT: Binary

    PHYSICAL MEMORY PARAMETERS
    Default data width : 8
    Default memory width : 8
    Default output width : 8

    BOOT LOADER PARAMETERS
    Table Type: SERIAL PORT (McBSP 8 bit Mode)
    Entry Point: 0x00014000


    OUTPUT TRANSLATION MAP
    --------------------------------------------------------------------------------
    00000000..00ffffff Page=0 Memory Width=8 ROM Width=8
    --------------------------------------------------------------------------------
    OUTPUT FILES: bootloader.bin [b0..b7]

    CONTENTS: 00000000..000006b3 BOOT TABLE
    .cinit : dest=00010000 size=000000de width=00000001
    .text : dest=00014000 size=000005b1 width=00000001

    --------------------------------------------------------------------------------
    00000000..00ffffff Page=1 Memory Width=8 ROM Width=8 "*DEFAULT PAGE 1*"
    --------------------------------------------------------------------------------
    NO CONTENTS

    从这两个文件看.cinit段好像也没问题啊。

  • cmd文件不用C2000那样修改, 因为C55x片上没有flash.

    你的程序在仿真器下调试是通过的吧?

    你是怎么执行hex cmd文件的? 从map文件看, Entry Point: 0x00014000和你hex cmd文件中的-e 0x100不符啊? 而且.vectors段也没转, 你在工程文件中.vectors段使用.sect定义成initialized section么?

  • 程序仿真通过了的,我就编写了个简单的方波输出函数。后面发的那个map和CMD是昨天调试修改后的,入口地址改成了hex cmd文件中的地址。

    hex cmd:

    bootloader.out
    -boot
    -v5510:2
    -serial8
    -e 0x00014000
    -reg_config 0x1c00,0x2180
    -delay 0x100
    -b
    -map bootloader.map
    -memwidth 8
    -romwidth 8
    -o bootloader.bin

    我就写了个批处理执行hex cmd文件:

    del bootloader.map
    del bootloader.bin
    hex55 HEX2BIN.cmd
    pause

    执行后的map文件就只有

    .cinit : dest=00010000 size=000000de width=00000001
    .text : dest=00014000 size=000005b1 width=00000001

    这两个段。

  • 你的工程文件里.vectors段是用.sect伪指令定义的么?

    用仿真器跟一下程序, 看是程序是否正确boot进来? 是否能从程序入口地址_c_int00开始执行? 执行到哪里出错?

  • 在仿真情况下,程序的入口地址是从_c_int00开始执行的。我的程序没有用到中断,所以没有用.sect伪指令定义.vectors段.程序的cmd中我是按照习惯添加了“ .vectors  : {} > VECS   PAGE 0 ”这句。不加这句在仿真情况下程序也能正常跑。好像cmd中没有用到的段,在通过hex cmd转换后,不会在转换生成的map文件中出现。

  • 仿真情况下观察到的程序的入口地址和通过hex cmd转换后的.text段的起始地址不一致,例如:通过仿真器查看的入口地址是:0001062f,而实际上hex cmd转换后的map中的.text段的起始地址为:000100e0。我后面将entry point修改成了仿真情况下程序的入口地址,也不行。并且我发现如果在hex cmd中不用-e  _c_int00指令的话,他会默认生成仿真情况下观察到的程序的入口地址。但我在一本书上看到的,却是要将entry point的地址修改成和.text段的起始地址一样。

  • 感谢Shine的耐心指导,终于解决了这个问题。是两个原因造成的自举失败。都是你上面提到的几点里面的。

    第一是:程序入口地址问题。不能单纯的.map文件中的entry point地址写成map文件中的text段的起始地址,而要写成_c_int00;这个我被一本参考资料误导了。

    第二个问题是:hex55.exe版本造成的。我原来用的是ccs2.2里面的hex55.exe,在你指出hex55.exe版本可能存在问题的时候,我还特意看了下hex55.exe的属性,显示的版本是Hex Converter v3.3.2。在修改了第一个问题后发现还是不能自举成功,我索性改装ccs3.3,改用了里面的hex55.exe,最终自举成功。CCS3.3版本里的hex55.exe貌似也是Hex Converter v3.3.2,这个我就不知道怎么回事了。

    自举成功了也不用想他了,谢谢Shine!!

  • 恭喜调试成功! 谢谢分享经验!

    hex55.exe如果是3.3.2版本的话, 应该没问题. 有兴趣的话, 可以试试把ccs2.2里生成的.out文件用CCS3.3的hex55.exe工具转, 看是CCS选项配置问题还是hex版本问题.

  • 您好,有一个问题想请教您,是这样的,我用5509A的开发板烧写我自己写的程序到开发板上的flash自举没有问题,程序可以正常运行,但是同样的程序烧写到我自己的板子上的flash时,显示烧写成功,但是程序并没有运行。板子上flash的电路是照着开发板画的,DSP和flash芯片型号也跟开发板上的一样,我也互换过flash,效果一样,真不知道是什么原因,还望您不吝赐教!flash芯片用的是AT25F1024N-10SI-2.7。

  • 这么老的帖子了,麻烦开个新帖吧。

    程序在你的板子上仿真器模式下能正确运行吗?

  • 您好,不好意思现在才回复您。是这样的之前做了一块板子,在线能跑,下到flash不能自举,后来问题解决了,是因为GPIO1连接的电阻不是10K,后来又做了一块板子,电路跟上一版一样,现在还是在线能跑,不能自举。下载flash的程序没有源程序,买的开发板不提供源程序,只给转换.bin文件的小程序,请问您能帮忙解决一下吗?

  • Boot mode管脚都设置好了?

    你要什么样的源程序?现在代码能正确烧写到flash么?

    另外,麻烦另起新帖吧,也方便其他客户参考。

  • 嗯嗯,问题解决了,是复位电路的问题,之前只有冷复位没有热复位,后来改成了RC复位电路就自举成功了,多谢帮助。另外我不知道怎么发新帖啊。。。

  • 谢谢分享。

    新帖可以点论坛上的"发表新帖"
      

  • 不好意思,问题还没解决,一开始复位电路直接接了上拉电阻到3.3V,程序下到flash里面自举不成功,后来复位电路加了按键,结果偶尔可以自举成功。每次复位后,如果自举不成功,则MCBSP0的SCK引脚会输出时钟,但是FLASH的SO引脚并不会出数据,这是为什么呢?

  • 是否有量过IO4管脚?IO4管脚是否有拉低->拉高->拉低->拉高的动作?

  • 自举失败的时候量过,一直是高电平,现在调好了,自举成功了,我把DSP引脚都重新烫过了,然后重新下了一遍程序,是不是DSP焊接问题呢,但是我之前量过DSP引脚都是连接没问题的呀

  • 是不是虚焊了