您好:
我使用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的时候出错了,程序没有搬移完成就跑飞了,请问可能是什么原因造成的???