这是我第一次写博客,暂时只是用来记录每天学习到的知识,以后可以随时查阅。
购买了一个magicVision公司的VMD642开发板,用于学习DM642,目的是用作数字图像处理。
刚开始,程序只能下载到ram中运行,掉电后就没有了,后来发现,需要烧写到flash中才可以永久保存,掉电后,程序不会消失。
使用的平台是CCS3.1,使用插件flashburn。flashburn插件需要自己安装,网上看到有些资料说,安装完成后,CCS中有选项可以直接启动flashburn,结果,我这里并不是这样的,CCS中没有出现此选项。刚开始以为安装未成功,所以连续安装了很多次,还是未出现选项,后来才发现,其实是安装成功了,可以到CCS安装目录下,binutilitiesflashburn中找到flashburn.exe,这样,可以直接使用。
首先,程序烧写到flash,上电后,DSP需要首先运行一段引导程序(DM642中是1K大小)引导程序将flash中的程序再加载到RAM中运行,称为二次加载。所以,在将普通程序烧写到FALSH中的时候,需要对程序做一定的修改。
1.在程序中添加boot.cmd文件:内容如下:
.title "Flash bootup utility for DM642 EVM"
.option D,T
.length 102
.width 140
COPY_TABLE .equ 0x90000400
EMIF_BASE .equ 0x01800000
.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_values, a3 ; load pointer to emif values
mvkh emif_values, a3
mvkl EMIF_BASE, a4 ; load EMIF base address
mvkh EMIF_BASE, a4
mvkl 0x0009, b0 ; load number of registers to set
mvkh 0x0000, b0
emif_loop:
ldw *a3++, b5 ; load register value
sub b0,1,b0 ; decrement counter
nop 2
[ b0] b emif_loop
stw b5, *a4++ ; store register value
nop 4
;****************************************************************************
;* 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
emif_values:
.long 0x00052078 ; GBLCTL
.long 0x73a28e01 ; CECTL1 (Flash/FPGA)
.long 0xffffffd3 ; CECTL0 (SDRAM)
.long 0x00000000 ; Reserved
.long 0x22a28a22 ; CECTL2
.long 0x22a28a22 ; CECTL3
.long 0x57115000 ; SDCTL
.long 0x0000081b ; SDTIM (refresh period)
.long 0x001faf4d ; SDEXT
2.修改程序的cmd文件,在MEMORY中添加:boot: o = 00000000h l = 000400h (这就是因为引导程序是1kb)。然后重新编译整个工程,生成新的.out文件。
3.启动flashburn.exe发现需要添加一些文件,比如:
Conversion Cmd
File To Burn
FBTC Program File
将程序烧写到flash时,需要将原来的.out文件转化成.hex文件,所以,需要用到TI的hex_6x.exe(可以在ccs安装目录下找到)、一个用来转化的CMD文件。
第一个,Conversion Cmd,就是这个用来转化的cmd文件,文件名:boot_hex.cmd(可以自己取名字)内容如下:
VMD642_video_out1.out /*转化前的.out文件*/
-a
-memwidth 8
-boot
-bootorg 0x90000400
-bootsection .boot_load 0x90000000 /*flash首地址*/
ROMS
{
FLASH: org = 0x90000000, len = 0x400000, romwidth = 8, files = {VMD642_video_out1.hex}/*转化后的.hex文件名*/
}
“File To Burn”就是要填的转化后的.hex文件了。
现在讲讲具体怎么讲.out文件转化成.hex文件。
1).新建一个文件夹,比如,在C盘根目录下新建DSP_BURN文件夹;
2).将.out文件(VMD642_video_out1.ou),Conversion Cmd文件(boot.hex),hex_6x.exe都放在这个文件夹中。
3).点开windows命令处理程序(运行->cmd.exe)
4).输入:cd c:dsp_burn 回车
5).输入:hex_6x boot_hex.cmd 回车
这时候会发现,c:DSP_BURN中出现了一个文件:VMD642_video_out1.hex,这个就是转哈后的.hex文件。flashburn.exe中要求添加的“File To Burn”就是这个文件。
4.添加FBTC Program File。这个是那个1k的引导程序(个人理解)。是由专门的另外一个DSP工程生成的.out文件。一般开发板会提供这个工程,网上也有这个工程的讲解,这里不再多说。
配置完成后是这样的:
选Program->download FBTC,需要CCS连接到开发板,否则,失败。
选Program->Erase Flash,这个需要比较长时间,耐心等待,如果看到进度条到了末尾然后又从头开始,就表示前面的配置工作没做好(可能是转化文件时候出错)需要重来。
选Program->Program Flash,等待成功。(如果进度条到了末尾又从头开始,还是表示失败)