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.
我使用的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之后的数据错误与丢失现象尤为明显。我在汇编程序中加入了很多延时语句,没有效果。
请问出现这个问题的原因以及可能的解决方法,谢谢。
现有两个工程,第一个是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语言代码。
按照您的回复,我尝试了一下。
我发现我的二次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
建议用仿真器跟踪一下二次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后,这段汇编代码是自动运行的吧,也就是说不需要点击“运行”,这段汇编代码就已运行完毕?
从flash中把二次bootloader搬移到片上RAM是硬件做的,看一下能否在RAM 0x10000004处设置硬件断点。
也就是说汇编语言文件实际上没有运行
建议跟踪一下代码,看程序跳到哪里去了。
无法在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读操作。根据这个实验结果,我的想法是,芯片没有进行一次引导操作。
您好,根据“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个字节的读操作。
想问一下,这个问题是什么原因呢,该怎么解决?谢谢
C6726B和C6727B的二次引导过程是一样的,从您描述的现象看,感觉更像是硬件的问题或者芯片本身的问题。 1K代码是ROM bootloader自动搬的。