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.

6455 emif boot 失败

Other Parts Discussed in Thread: TMS320C6455

您好:

我使用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文件内容如下:

 

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

 

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

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

    27801712@163.com

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

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

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

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

  • 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}
    }

     

     

    请指教,谢谢!!!

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

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

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

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

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

    PERLOCK .equ 0x02AC0004
    PERCFG0 .equ 0x02AC0008
    PERCFG1 .equ 0x02AC002C

    EMIFA_CE2CFG .equ 0x70000080
    EMIFA_CE3CFG .equ 0x70000084
    EMIFA_CE4CFG .equ 0x70000088
    EMIFA_CE5CFG .equ 0x7000008C
    EMIFA_AWCC .equ 0x700000A0

    DDR_MIDR .equ 0x78000000
    DDR_SDCFG .equ 0x78000008
    DDR_SDRFC .equ 0x7800000C
    DDR_SDTIM1 .equ 0x78000010
    DDR_SDTIM2 .equ 0x78000014
    DDR_DDRPHYC .equ 0x780000E4

    PERLOCK_REG .equ 0x0f0a0b00
    PERCFG0_REG .equ 0x00001550
    PERCFG1_REG .equ 0x00000003

    EMIFA_CE2CFG_REG .equ 0x00240120
    EMIFA_CE3CFG_REG .equ 0x03091848
    EMIFA_CE4CFG_REG .equ 0x8000030C
    EMIFA_CE5CFG_REG .equ 0x8000030E

    DDR_SDCFG_REG_S .equ 0x00534A32
    DDR_SDRFC_REG .equ 0x000007A1
    DDR_SDTIM1_REG .equ 0x2A6D28EB
    DDR_SDTIM2_REG .equ 0x010201A7
    DDR_DDRPHYC_REG .equ 0x00000005
    DDR_SDCFG_REG_E .equ 0x00534A32


    PLLCTL_1 .equ 0x029A0100
    PLLM_1 .equ 0x029A0110
    PREDIV_1 .equ 0x029A0114
    PLLCMD_1 .equ 0x029A0138
    PLLSTAT_1 .equ 0x029A013C
    DCHANGE_1 .equ 0x029A0144
    SYSTAT_1 .equ 0x029A0150
    PLLDIV4_1 .equ 0x029A0160
    PLLDIV5_1 .equ 0x029A0164

    PLLDIV1_2 .equ 0x029C0118
    PLLCMD_2 .equ 0x029C0138
    PLLSTAT_2 .equ 0x029C013C
    DCHANGE_2 .equ 0x029C0144
    SYSTAT_2 .equ 0x029C0150


    PLLM_val .equ 0x00000014
    PREDIV_val .equ 0x00000001
    PLLDIV4_val .equ 0x00000008
    PLLDIV5_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的代码

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

  • BIOS工程,有的段的load和run address是不一样的,需要修改。

    可以参考下面的文档第8页上的表格。
    http://www.ti.com/lit/an/spra999a/spra999a.pdf

  • Hi,Shine Zhang,我看了你推荐的文档。我在DM642中BIOS的配置中将所有段都放在了SDRAM中,这样是可用从FLASH启动的。

    在6455中却不行。我跟踪BOOT执行。在开始B1寄存器保存的还是c_int00在DDR中的运行地址0xe0018560,到boot最后跳转的时候,PC指针就跑飞了。程序没有跳到c_int00中开始执行。

     

    求助~~~~求助~~~~~

  • 请问有.cinit段代表什么?我也出现这种情况了,map文件有.cinit段
  • boot还是容易跑飞,而且FLASH初始化一次完成不了,能找到的参考资料不多,能推荐点给我吗?