期望将一个点亮LED的工程,经过bootload加载到SDRAM后再运行。但是重新上电后LED并没有点亮。现附上代码,请多多指教!
1.我的CMD文件如下:
-c
-x
-l rts6700.lib
-heap 200h
-stack 300h
MEMORY
{
BOOT_RAM : o=0, l=200h
IRAM : o=401h, l=0x0003FBFE
SDRAM : o = 80000000h l = 10000000h}
SECTIONS
{
.vectors :> BOOT_RAM
.boot_load :> BOOT_RAM
.bss :> SDRAM
.cinit :> SDRAM
.far :> SDRAM
.stack :> SDRAM .text > SDRAM
.const > SDRAM
.pinit > SDRAM
.switch > SDRAM
.data > SDRAM
.cio > SDRAM
}
2.利用十六进制转换工具自动生成复制表。所以转换用cmd及二级bootload代码如下。
CMD文件:
debug\boot_test.out
-a
-memwidth 8
-map boot_test.map
-boot
-bootorg 0x90000400
-bootsection .boot_load 0x90000000
ROMS
{ FLASH: org = 0x90000000, len = 0x8C00, romwidth = 8, files = {boot_test.hex}
}
二级bootload代码:
;A;
; ======== boot_c671x.s62 ========
;
.title "Flash bootup utility"
.option D,T
.length 102
.width 140
; global EMIF symbols defined for the c671x family
.include boot_c671x.h62
; Address of the generated boot-table
copyTable .equ 0x90000400
;.global _text_size
;.global _text_ld_start
;.global _text_rn_start
.sect ".boot_load"
.global _boot
.ref _c_int00
_boot:;************************************************************************
;* DEBUG LOOP – COMMENT OUT B FOR NORMAL OPERATION
;************************************************************************
zero B1
_myloop: ; [!B1] B _myloop nop 5
_myloopend: nop
;************************************************************************
;* CONFIGURE EMIF,EMIF初始化;************************************************************************
;****************************************************************
; *EMIF_GCTL = EMIF_GCTL_V;
;****************************************************************
mvkl EMIF_GCTL,A4 || mvkl EMIF_GCTL_V,B4
mvkh EMIF_GCTL,A4
|| mvkh EMIF_GCTL_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_CE0 = EMIF_CE0_V
;****************************************************************
mvkl EMIF_CE0,A4 || mvkl EMIF_CE0_V,B4
mvkh EMIF_CE0,A4
|| mvkh EMIF_CE0_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async)
;****************************************************************
mvkl EMIF_CE1,A4 || mvkl EMIF_CE1_V,B4
mvkh EMIF_CE1,A4
|| mvkh EMIF_CE1_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_CE2 = EMIF_CE2_V (setup for 32-bit async)
;****************************************************************
mvkl EMIF_CE2,A4 || mvkl EMIF_CE2_V,B4
mvkh EMIF_CE2,A4
|| mvkh EMIF_CE2_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_CE3 = EMIF_CE3_V (setup for 32-bit async)
;****************************************************************
|| mvkl EMIF_CE3,A4 || mvkl EMIF_CE3_V,B4 ;
mvkh EMIF_CE3,A4
|| mvkh EMIF_CE3_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_SDRAMCTL = EMIF_SDRAMCTL_V
;****************************************************************
|| mvkl EMIF_SDRAMCTL,A4 || mvkl EMIF_SDRAMCTL_V,B4 ;
mvkh EMIF_SDRAMCTL,A4
|| mvkh EMIF_SDRAMCTL_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_SDRAMTIM = EMIF_SDRAMTIM_V
;****************************************************************
|| mvkl EMIF_SDRAMTIM,A4 || mvkl EMIF_SDRAMTIM_V,B4 ;
mvkh EMIF_SDRAMTIM,A4
|| mvkh EMIF_SDRAMTIM_V,B4
stw B4,*A4
;****************************************************************
; *EMIF_SDRAMEXT = EMIF_SDRAMEXT_V
;****************************************************************
|| mvkl EMIF_SDRAMEXT,A4 || mvkl EMIF_SDRAMEXT_V,B4 ;
mvkh EMIF_SDRAMEXT,A4
|| mvkh EMIF_SDRAMEXT_V,B4
stw B4,*A4
;****************************************************************************
; copy sections,搬移表格
;****************************************************************************
mvkl copyTable, a3 ; load table pointer
mvkh copyTable, a3
ldw *a3++, b1 ; Load entry point
;在copy_section_top中读取用户程序的段信息(段的Flash加载地址,段的RAM运行地址以及段的长度)
;在copy_loop中执行循环拷贝操作。
copy_section_top:
ldw *a3++, b0 ; byte count ldw *a3++, a4 ; ram start address
nop 3
[!b0] b copy_done ; have we copied all sections?
nop 5
copy_loop:
ldb *a3++,b5
sub b0,1,b0 ; decrement counter
[ b0] b copy_loop ; setup branch if not done
[!b0] b copy_section_top
zero a1
[!b0] and 3,a3,a1
stb b5,*a4++
[!b0] and -4,a3,a5 ; round address up to next multiple of 4
[ a1] add 4,a5,a3 ; round address up to next multiple of 4
;****************************************************************************
; jump to entry point
;****************************************************************************
copy_done:
b .S2 b1
nop 5
;copyTable: ; count
; flash start (load) address ; ram start (run) address
;; .text
;.word _text_size
;.word _text_ld_start
;.word _text_rn_start
;; end of table
;.word 0
;.word 0
;.word 0
Shine:
请问点灯程序和二次bootloader代码在仿真器模式是否调试通过?
如果调试通过,接下来确认代码正确烧写到flash里。
检查boot pin管脚是否设置正确。
前面几步都没问题还是不能boot的话,在连上仿真器跟踪一下boot过程:1.二次bootloader是否搬移进来? 2. 二次bootloader是否将应用程序加载到SDRAM?3. 应用程序是否在SDRAM中正确执行。TI的c6713二次加载代码可以参考下面的文档。http://www.ti.com/lit/an/spra999a/spra999a.pdf
gxushine:
回复 Shine:
多谢指教。另请问如何使用仿真器模式调试bootload?因为链接cmd文件里将代码放在SDRAM里,还没有初始化EMIF。我用load symbols时,CCS弹出加载不进去的提示。另外原来的点灯程序是bootload到内部RAM的,而且上电可以正常bootload,正常点灯。但是内部RAM空间太小了,期望将代码全部放到片外SDRAM里,所以在链接CMD文件里将段都放到了SDRAM里,但是没有成功。
Shine:
回复 gxushine:
请问二次bootloader可以将原来的点灯程序boot到内部RAM上运行吗?
二次bootloader代码在仿真器模式下能搬移代码到片外SDRAM里运行吗?
gxushine:
回复 Shine:
谢谢您的回复。首先,原来设计的二次bootloader可以将点灯程序boot到内部RAM上运行的,CMD文件里各段分配在片内我设置好拨码开关后上电,LED就亮了。其次,我一直不明白,怎么在仿真器模式下调试bootload,怎么观察代码是否搬移到SDRAM里了。还请多多指教,谢谢。
bootload到片内IRAM的CMD文件:
-c-x-l rts6700.lib-heap 200h-stack 300hMEMORY{ BOOT_RAM : o=0,l=200h
/* IRAM : o=4001h, l=0x00040000*/
IRAM : o=401h, l=0x0003FBFE
CE0_1 : o = 80000000h l = 00100000h }SECTIONS{ .boot_load :> BOOT_RAM .vectors :> IRAM .bss :> IRAM .cinit :> IRAM .far :> IRAM .stack :> IRAM
}
Shine:
回复 gxushine:
连上仿真器,上电后,用CCS查看地址0处的代码是否为二次bootloader代码。
gxushine:
回复 Shine:
首先,谢谢您的回复。我连上仿真后看到二级bootload代码正确的从FLASH地址0x90000000拷贝到内部地址0处了。但是没有看到二次bootload代码将Flash地址0x90000400处的用户程序加载到SDRAM里了。请问,后续可以考虑从哪些方面进行调试?另外,这个复制是否适应于将代码加载到片外SDRAM里?会不会只适用于加载到片内IRAM?
mvkl copyTable, a3 ; load table pointer mvkh copyTable, a3
ldw *a3++, b1 ; Load entry point
copy_section_top: ldw *a3++, b0 ; byte count ldw *a3++, a4 ; ram start address nop 3
[!b0] b copy_done ; have we copied all sections? nop 5
copy_loop: ldb *a3++,b5 sub b0,1,b0 ; decrement counter [ b0] b copy_loop ; setup branch if not done [!b0] b copy_section_top zero a1 [!b0] and 3,a3,a1 stb b5,*a4++ [!b0] and -4,a3,a5 ; round address up to next multiple of 4 [ a1] add 4,a5,a3 ; round address up to next multiple of 4
;****************************************************************************; jump to entry point;****************************************************************************copy_done: b .S2 b1 nop 5
Shine:
回复 gxushine:
请问二次bootload代码用仿真器调通了吗?
gxushine:
回复 Shine:
在用仿真器调试bootload时( file->load symbols )出现程序只能运行到二级bootload的复制表 的[!b0] and 3,a3,a1 ,再运行就弹出报错框:
Trouble Halting Target CPU:Error 0x80000020/-1070Fatal Error during: Execution, An unknown error prevented the emulator from accessing the processorin a timely fashion.It is recommended to RESET EMULATOR. This will disconnect each target from the emulator. The targets should then be power cycledor hard reset followed by an emureset and reconnect to each target.
Sequence ID: 15Error Code: -1070Error Class: 0x80000020
请问这个怎么解决?Option->customize->Program/Project/CIO->program load下的第1、3、4、5项也都打勾了,还是出现这种情况。
Shine:
回复 gxushine:
可以参考spra999里的二次bootloader例程。http://www.ti.com/lit/an/spra999a/spra999a.pdf
gxushine:
回复 Shine:
请问,在bootload的时候,将代码段.text和已初始话数据段.cinit 、const 、switch 烧写到flash里了。那些没有初始化的段如.far、 .bss都没有烧写进flash里。那这样bootload岂不是不能将所有的程序都加载么,当程序需要用到.far、 .bss这些段时怎么处理?