您好:
我使用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生成烧写文件。
debugflash_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_hexflash_boot.hex]
]
最后生成的HEX文件内容如下:
文件烧写进去后无法启动。
请教各位,我哪里做的不对,请指教,谢谢