TI中文支持网
TI专业的中文技术问题搜集分享网站

6455 emif boot 失败

您好:

我使用TMS320C6455,从选择从FLASH启动。程序由于比较大,打算把程序放在DDR2中。我使用的boot.asm代码如下

.title  "Flash bootup utility for 6455"
            .option D,T
            .length 102
            .width  140

COPY_TABLE    .equ     0xB0000400 ;

EMIF_BPRIO_R           .equ  0x70000020 ;emif register
EMIF_CE2CFG_R       .equ     0x70000080 ;
EMIF_CE3CFG_R       .equ  0x70000084 ;
EMIF_AWCC_R           .equ  0x700000A0 ;

EMIF_BPRIO_V            .equ  0x000000FE ;
EMIF_CE2CFG_V        .equ     0x32109086 ;
EMIF_CE3CFG_V        .equ  0x63209104 ;
EMIF_AWCC_V             .equ  0x40000380 ;

            .sect ".boot_load"
            .global _boot

_boot:     ;************************************************************************
;* Debug Loop –  Comment out B for Normal Operation
;************************************************************************
            zero B1
_myloop:   [!B1] B _myloop             nop  5
_myloopend: nop

;************************************************************************
;* Configure EMIF
;************************************************************************
   mvkl EMIF_BPRIO_R,A4   || mvkl EMIF_BPRIO_V,B4     mvkh EMIF_BPRIO_R,A4   || mvkh EMIF_BPRIO_V,B4       stw B4,*A4    
   mvkl EMIF_CE2CFG_R,A4   || mvkl EMIF_CE2CFG_V,B4     mvkh EMIF_CE2CFG_R,A4   || mvkh EMIF_CE2CFG_V,B4       stw B4,*A4
    
   mvkl EMIF_CE3CFG_R,A4   || mvkl EMIF_CE3CFG_V,B4     mvkh EMIF_CE3CFG_R,A4   || mvkh EMIF_CE3CFG_V,B4       stw B4,*A4
    
   mvkl EMIF_AWCC_R,A4   || mvkl EMIF_AWCC_V,B4     mvkh EMIF_AWCC_R,A4   || mvkh EMIF_AWCC_V,B4       stw B4,*A4

   nop   4;****************************************************************************
;* Copy code sections
;****************************************************************************
   mvkl COPY_TABLE, A3     ; load table pointer 加载用户程序代码的起始地址0xb0000400地址放到A3寄存器
   mvkh COPY_TABLE, A3
   ldw *A3++, B1       ; Load entry point 加载用户程序的 C 语言入口c_int00地址到B1寄存器

copy_section_top:         ;循环加载多个段标签
   ldw *A3++, B0       ; byte count 本段加载的字节个数 32 比特存储方式
   ldw *A3++, A4       ; ram start address 本段要被加载到内存中的 RAM 起始地址
   nop 3
   [!B0] b copy_done      ;have we copied all sections? 判断所有段都被加载完成
   nop 5
copy_loop:           ;循环加载当前段标签
   ldb *A3++,B5       ;将 FLASH 地址中的数放到核寄存器 B5 中 8bit 存储方式
   sub B0,1,B0       ; decrement counter 每加载一个字节,字节数减一
   [ B0] b copy_loop      ; setup branch if not done 判断当前本段加载字节数是否为零
   [!B0] b copy_section_top    ;判断当前段加载成功后跳转到循环开始地址,加载下一段。
   zero A1        ;执行完这条指令 B5 和 A4 中才会有新的数据
   [!B0] and 3,A3,A1
   stb B5,*A4++       ;将从 flash 中读出的数放到 RAM 地址中,按 8bit 搬移
   [!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:           ;跳转到 C 语言入口标签
   b .S2 B1        ;跳转到 C 语言入口地址
   nop 5

在BIOS配置中设置了如下的几个区域。

调试运行没有问题后,使用HEX6X生成烧写文件。

debug\flash_boot_test.out
-a
-map flash_boot.map
-memwidth  8
-boot
-bootorg 0xB0000400
-bootsection .boot_load 0xB0000000

ROMS
{
    FLASH:  org = 0xB0000000, len = 0x120000, romwidth = 8, files = {.\burn_hex\flash_boot.hex}
}

最后生成的HEX文件内容如下:

 

文件烧写进去后无法启动。

 

请教各位,我哪里做的不对,请指教,谢谢

user1953003:

请问哪位能给我发个正确的EMIF BOOT启动的程序来参考一下,十分感谢!!

27801712@163.com

Shine:

回复 user1953003:

boot.asm二次boot代码先调通过吗?

user1953003:

回复 Shine:

你好,你说的二次BOOT是指汇编代码吗?

我没有调过,汇编这块我不太熟悉,找的别人的代码,请问这块该如何调试,请指教一下,十分感谢!!!!!!!!!

Shine:

回复 user1953003:

用仿真器跟,看有没有成功搬移代码。

user1953003:

回复 Shine:

Shine Zhang,非常感谢你的建议,我按照你的建议调试了BOOTLOADER的功能。在闪灯程序中调用boot功能,能够实现程序重新启动运行,这段BOOTLOADER程序应该没有问题。但是我发现,我把BOOTLODADER程序分配到0x00800000地址,在memory view窗口中查看到的代码和生成的.hex文件的BOOT段代码不一致。在.hex文件中。boot段代码比内存中的少了一部分,也就是生成的boot代码不完整,请问这是什么原因造成的。

 在内存中BOOT段的代码。到.endfunc段boot结束。

 生成的hex文件中boot代码最后到0xE4800000,比内存中的代码要短。请问这是怎么回事?

我使用的HEX6X.EXE的命令文件如下:

debug\flash_boot_test.out-a-map flash_boot.map-memwidth  8-boot-bootorg 0xB0000400-bootsection .boot_load 0xB0000000

ROMS{    FLASH:  org = 0xB0000000, len = 0x120000, romwidth = 8, files = {.\burn_hex\flash_boot.hex}}

 

 

请指教,谢谢!!!

Shine:

回复 user1953003:

看一下flash_boot.map文件里是否有.cinit这个段?

user1953003:

回复 Shine:

Shine Zhang,谢谢你的建议。我的测试程序FLASH启动成功了,此时程序运行在RAM中。

我在BIOS配置中将程序运行地址都放到DDR2中去运行后,又无法自启动。我只是更改了BIOS配置中MEM属性中各段的运行地址,设置成DDR。

Shine:

回复 user1953003:

在boot.asm对DDR2进行初始化了么?

user1953003:

回复 Shine:

.title "Flash bootup utility for 6455 dsk" .option D,T .length 102 .width 140COPY_TABLE .equ 0xb0000400

PERLOCK .equ 0x02AC0004PERCFG0 .equ 0x02AC0008PERCFG1 .equ 0x02AC002C

EMIFA_CE2CFG .equ 0x70000080EMIFA_CE3CFG .equ 0x70000084EMIFA_CE4CFG .equ 0x70000088EMIFA_CE5CFG .equ 0x7000008CEMIFA_AWCC .equ 0x700000A0

DDR_MIDR .equ 0x78000000DDR_SDCFG .equ 0x78000008DDR_SDRFC .equ 0x7800000CDDR_SDTIM1 .equ 0x78000010DDR_SDTIM2 .equ 0x78000014DDR_DDRPHYC .equ 0x780000E4

PERLOCK_REG .equ 0x0f0a0b00PERCFG0_REG .equ 0x00001550PERCFG1_REG .equ 0x00000003

EMIFA_CE2CFG_REG .equ 0x00240120EMIFA_CE3CFG_REG .equ 0x03091848EMIFA_CE4CFG_REG .equ 0x8000030CEMIFA_CE5CFG_REG .equ 0x8000030E

DDR_SDCFG_REG_S .equ 0x00534A32DDR_SDRFC_REG .equ 0x000007A1DDR_SDTIM1_REG .equ 0x2A6D28EBDDR_SDTIM2_REG .equ 0x010201A7DDR_DDRPHYC_REG .equ 0x00000005DDR_SDCFG_REG_E .equ 0x00534A32

PLLCTL_1 .equ 0x029A0100PLLM_1 .equ 0x029A0110PREDIV_1 .equ 0x029A0114PLLCMD_1 .equ 0x029A0138PLLSTAT_1 .equ 0x029A013CDCHANGE_1 .equ 0x029A0144SYSTAT_1 .equ 0x029A0150PLLDIV4_1 .equ 0x029A0160PLLDIV5_1 .equ 0x029A0164

PLLDIV1_2 .equ 0x029C0118PLLCMD_2 .equ 0x029C0138PLLSTAT_2 .equ 0x029C013CDCHANGE_2 .equ 0x029C0144SYSTAT_2 .equ 0x029C0150

PLLM_val .equ 0x00000014PREDIV_val .equ 0x00000001PLLDIV4_val .equ 0x00000008PLLDIV5_val .equ 0x00000004

.sect ".boot_load" .global _boot

_boot: ;************************************************************************;* Debug Loop – Comment out B for Normal Operation;************************************************************************ mvkl PERLOCK,A4 ||mvkl PERLOCK_REG,B4 mvkh PERLOCK,A4 ||mvkh PERLOCK_REG,B4 stw B4,*A4 mvkl EMIFA_CE3CFG,A4 ||mvkl EMIFA_CE3CFG_REG,B4 mvkh EMIFA_CE3CFG,A4 ||mvkh EMIFA_CE3CFG_REG,B4 stw B4,*A4 mvkl DDR_SDCFG,A4 ||mvkl DDR_SDCFG_REG_S,B4 mvkh DDR_SDCFG,A4 ||mvkh DDR_SDCFG_REG_S,B4 stw B4,*A4 mvkl DDR_SDRFC,A4 ||mvkl DDR_SDRFC_REG,B4 mvkh DDR_SDRFC,A4 ||mvkh DDR_SDRFC_REG,B4 stw B4,*A4 mvkl DDR_SDTIM1,A4 ||mvkl DDR_SDTIM1_REG,B4 mvkh DDR_SDTIM1,A4 ||mvkh DDR_SDTIM1_REG,B4 stw B4,*A4 mvkl DDR_SDTIM2,A4 ||mvkl DDR_SDTIM2_REG,B4 mvkh DDR_SDTIM2,A4 ||mvkh DDR_SDTIM2_REG,B4 stw B4,*A4 mvkl DDR_DDRPHYC,A4 ||mvkl DDR_DDRPHYC_REG,B4 mvkh DDR_DDRPHYC,A4 ||mvkh DDR_DDRPHYC_REG,B4 stw B4,*A4 mvkl DDR_SDCFG,A4 ||mvkl DDR_SDCFG_REG_E,B4 mvkh DDR_SDCFG,A4 ||mvkh DDR_SDCFG_REG_E,B4 stw B4,*A4 zero B1_myloop: ; [!B1] B _myloop nop 5_myloopend: nop

;****************************************************************************;* Copy code sections;**************************************************************************** mvkl COPY_TABLE, a3 ; load table pointer mvkh COPY_TABLE, 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

已经对需要的外设寄存器都初始化了,以上是bootloader的代码

user1953003:

回复 Shine:

你好,我对bootloader跟踪调试,发现在搬移.bios段到DDR的时候出错了,程序没有搬移完成就跑飞了,请问可能是什么原因造成的???

赞(0)
未经允许不得转载:TI中文支持网 » 6455 emif boot 失败
分享到: 更多 (0)