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.

TMS320C6727B: 二次Bootloader后的地址与值

Part Number: TMS320C6727B
Other Parts Discussed in Thread: TMS320C6726B

我使用的DSP型号是TMS320C6727B,对应的内部RAM地址为0x10000000——0x1003FFFF,对应Flash的地址为0x90000000——0x9FFFFFFF,自己编写C语言与汇编语言程序进行二次引导操作。C语言程序是将hex文件中的数据按地址写进Flash中。汇编语言程序进行二次引导操作,即EMIF配置、将Flash数据拷贝到RAM相应的位置、跳转至C语言程序入口。C6727.cmd文件修改部分如图所示:

如果二次引导成功,那么:

①内部RAM中地址为0x10000000——0x10000400的数据应该与Flash地址为0x90000000——0x90000400中的数据对应相同。

②内部RAM中地址为0x10000400之后的数据应该与Flash地址为0x90000400之后的数据对应相同(Flash中未写入数据的部分不算)。

想问下,这个说法是正确的吗?

如果上面的①②是对的,那么想问下出现以下问题的原因:

将汇编文件boot.asm单独放到一个工程中,分别进行单步运行与全速运行,发现均可以将0x90000400之后的数据成功赋给0x10000400后对应的位置。但是将C语言与汇编语言程序放到一个工程中,全速运行后发现(此时无法对汇编文件单步运行),RAM对应地址上会出现Flash中的数据,但是会出现数据错误与丢失现象。0x400之后的数据错误与丢失现象尤为明显。我在汇编程序中加入了很多延时语句,没有效果。

请问出现这个问题的原因以及可能的解决方法,谢谢。

  • 建议把二次bootloader和应用程序分两个工程。

    此时无法对汇编文件单步运行

    设断点可以跟踪二次bootloader代码吗?

  • 现有两个工程,第一个是led.prj,功能是小灯闪烁5次,里面主要包括.c文件、.cmd文件、vectors.asm文件(该工程没有使用中断,所以只在RESET部分做了修改)、boots.asm文件。

    第二个是二次引导程序bootloader.prj,里面主要包括.c文件(功能是将.hex文件按地址写进Flash中)、.cmd文件、vectors.asm文件、boots.asm文件。其中两个工程的后三个文件完全相同。

    .cmd文件如图所示:

    为了将led.prj烧进电路板,也就是实现重新上电后小灯闪烁5次的功能,我的操作是这样的:

    ①编译led.prj生成led.out和led.map,然后用hex6x生成led.hex文件,并将led.hex复制到bootloader.prj所在的Debug文件夹下。

    ②编译并运行bootloader.prj,运行完毕后发现led.hex文件已经成功被写入Flash所在地址。但是却并没有将这些数据复制到内部RAM所在地址,也就是说boots.asm文件并未生效。

    之后我将boots.asm单独放到一个工程中,对其分别进行单步运行与全速运行,发现可以将flash的0x90000400后的数据成功复制到内部RAM的0x10000800地址。但0x10000000——0x10000400上的数据与0x90000000——0x90000400上的数据并不相同。我查阅资料发现,前0x400个数据的复制是芯片自带的一次引导程序完成的,所以我编写的boots.asm代码应该完成了二次引导的任务。

    设置断点无法跟踪boots.asm代码,只能跟踪C语言代码。

  • 我觉得分三个工程比较好

    1. led.prj工程

    2. 二次bootloader工程:负责初始化EMIF和从flash里搬移代码到RAM。

    3. 烧写工程:负责把二次bootloader和应用程序led.out烧写到flash。

  • 按照您的回复,我尝试了一下。

    我发现我的二次bootloader工程,也就是.asm文件,如果不做修改会有报错。修改之后,我还在代码的结尾加上一个“RET”,程序无法自己结束运行。所以我就在结尾加了一个死循环。这样运行一段时间后停止,我发现已经运行到死循环处,便停止运行代码。查看了一下RAM对应地址的值,发现这次都是正确的。于是我退出Debug。对电路板重新上电,发现还是没有任何现象,并且Flash中的数据全为FFFF,RAM中的代码也发生了变化,也就是二次引导还是未成功。

    这是哪里出了问题呢?会和中断向量表有关吗?如图所示是我的vectors.asm文件。

  • 并且Flash中的数据全为FFFF,RAM中的代码也发生了变化,也就是二次引导还是未成功。

    这个应该是烧写工程烧写的吧?

    建议先把烧写工程调试通过,然后把led应用代码烧写到flash,再在仿真模式下调试二次bootloader,看是否能去flash中搬移应用程序到RAM并且运行。

    如果上面都调通了,再把二次bootloader烧写到flash,看是否能脱机运行。

    下面的二次bootloader应用文档可以参考一下。
    https://www.ti.com/lit/an/spra999a/spra999a.pdf

    8080.spra999a.zip

  • 您好,现在的情况是这样的:

    烧写工程完全正常,可以把hex文件成功烧写到Flash对应位置,并且重新上电之后Flash数据不会丢失。

    二次bootloader程序也完全正常,可以将Flash中的数据搬移到RAM对应位置。但是没有对应现象(小灯闪烁)。重新上电后,发现Flash中的数据正确,但是RAM中的数据是错误的,也没有对应现象(小灯闪烁)。

  • 建议用仿真器跟踪一下二次bootloader代码boot过程

    连上仿真器,板子上电,打开CCS, load symbols,然后可以设置硬件断点跟踪boot过程。

    "Load Symbols" instead of "Load Program"

    When debugging an application from flash, you want to let the application boot in its normal manner. If you select "load program" in CCS then you are overwriting the application that loaded from flash and not debugging the code as it runs normally. You should instead do "load symbols" in CCS and then select your .out file. This will allow you to debug your code using variable/function names without overwriting the code that boots from the flash.
    CCS 3.3: Go to File -> Load Symbols -> Load Symbols Only
    CCS 4.x: Right-click on the project and select Debug Options. On the "Debugger" tab choose "Load Symbols" instead of "Load Program"
    CCS 5.x: In the "Debug View" tab choose "Run"--> "Load" --> "Load Symbols"

  • 您好,谢谢您的回复。

    ①将电路板上电,CCS软件进入Debug后,这段汇编代码是自动运行的吧,也就是说不需要点击“运行”,这段汇编代码就已运行完毕?

    ②刚才又进行了以下测试:

    工程中的C语言文件如下:

    int main()

    {

        return 0;

    }

    工程中的汇编语言文件如图所示:这个汇编文件不为了完成二次bootloader功能,只是为了测试文件是否运行。

    测试结果发现:当工程中既有C语言文件又有汇编语言文件时,点击“运行”,寄存器的值并未改变,也就是说汇编语言文件实际上没有运行。这个是什么问题呢?

  • 还有一个问题就是,我的CCS是7.4版本的,我用“load symbols”也无法对boot过程进行调试,点击“load symbols”后,代码就直接运行到主函数处了。

    然后我对软件进行了设置,如图所示:我将这里的“main”改成了代码中boot过程的入口“_boot”。

    随后我想单步运行或全速运行都不能进行,就直接卡在_boot这里了。

    所以我想问,是还要做其他的设置吗?

  • ①将电路板上电,CCS软件进入Debug后,这段汇编代码是自动运行的吧,也就是说不需要点击“运行”,这段汇编代码就已运行完毕?

    从flash中把二次bootloader搬移到片上RAM是硬件做的,看一下能否在RAM 0x10000004处设置硬件断点。


    也就是说汇编语言文件实际上没有运行

    建议跟踪一下代码,看程序跳到哪里去了。

  • ①无法在RAM 0x10000004处设置断点

    ②一进入Debug模式,程序就跳到main函数了。

  • 无法在RAM 0x10000004处设置断点

    设置的是硬件断点么?应该可以设置啊

    一进入Debug模式,程序就跳到main函数了。

    应用程序的main函数?

  • 我刚才又试了一下,工程中主要包含①将hex文件烧录到Flash的.c文件②完成二次引导的.asm文件。

    可以在0x10000004处设置硬件断点。设置完毕后,点击Run→Debug,程序跳转到main函数(上面提到的①)处。

    此外,根据" Using the TMS320C672x Bootloader "手册( SPRAA69D )第五页: Once the bootloader detects EMIF boot mode, it reads the first byte from the flash device to determine 8 or 16 bit boot mode. 所述,我对Flash读操作的CS_2与OE信号进行了测量,发现二者均一直为高电平,也就是说没有进行Flash读操作。根据这个实验结果,我的想法是,芯片没有进行一次引导操作。

  • 如果上电后,ROM bootloader没有去flash搬1K代码的话,请看一下boot pin管脚电平是否设置成了parallel flash boot mode了。

  • 用万用表检测了硬件的boot管脚电平配置正确。

    并且在CCS中通过查看寄存器的值,也确定了相应管脚的电平是正确的。

  • 那很奇怪啊,如果boot管脚配置正确的话,上电后,ROM bootloader会根据采集到的boot管脚电平进入到相应的boot模式。

  • 所以现在不知道是什么原因导致没有进行一次引导,硬件配置完全正确。

    这个应该不用在CCS软件上进行什么配置吧。

  • 这跟ccs配置没有关系。您看一下其他boot mode能进么?

  • 在硬件上已经对相应管脚做了拉高拉低处理,没有办法更改引脚电平

  • 硬件上接死就没办法改了。

  • 好吧,我再研究研究,谢谢啦

  • 不客气~

    可以尝试用个最简单helloworld程序,看硬件上有没有搬移。

  • 我暂时将此贴关闭,如果后续还有问题,可以回复此贴。

  • 您好,根据“Using the TMS320C672x Bootloader”(SPRAA69D)手册中第五页Table 6下面一段话所述:

    Once the bootloader detects EMIF boot mode, it reads the first byte from the flash device to determine 8 or 16 bit boot mode. The bootloader then sets the EMIF control registers for accessing 8 or 16 bits according to the mode selected. The first 1024 bytes of data are copied from the FLASH memory into the
    first 1kBytes of TMS320C672xx internal memory.

    对于这段话,我的理解是:DSP会连续对Flash memory中的数据从头开始读1024个字节。也就是说,DSP会进行多次读操作,直到1024个字节被搬运完毕。

    我对我手中的电路板进行了测试,按下电路板上的复位按钮后松开,示波器的波形如图所示:

    从上到下分别为:

    黄色:CS_2 or OE(根据EMIF接口的读时序,读操作时,CS_2与OE均为低)

    绿色:BA0    蓝色:A0    红色:A1(即DSP的EMIF接口低三位地址线)

    从波形可以看出,复位后只进行了8次读操作。也就是说,并没有完成对前1024个字节的读操作。

    想问一下,这个问题是什么原因呢,该怎么解决?谢谢

  • flash地址0处写了EMIF寄存器配置值么?

  • flash的地址0处写的是“01”,也就是16bit boot mode。

  • 那应该没问题,就是很奇怪,为什么您那边不能用仿真器去跟ROM里的运行情况。

  • 可以在0x10000000-0x10000400中设置断点,但是不会在所设置的断点处暂停。

    这边有之前用过TMS320C6726B的老师,他有可以成功完成二次引导的汇编语言代码,我在他的基础上修改了下。我看Bootloader手册,C6726B和C6727B的二次引导过程并没有区别,理论上来说是可以成功的,但是并没有成功完成二次引导。

  • C6726B和C6727B的二次引导过程是一样的,从您描述的现象看,感觉更像是硬件的问题或者芯片本身的问题。 1K代码是ROM bootloader自动搬的。

  • 您好,问题已经解决了。程序本身是没问题的,问题的原因是其中一个高位地址线的下拉电阻没有焊好。重新焊接之后就可以完成二次引导了。谢谢您这段时间的帮助。

  • 不客气~ 

    非常感谢分享解决办法!