FBTC程序编写_第1页
FBTC程序编写_第2页
FBTC程序编写_第3页
FBTC程序编写_第4页
FBTC程序编写_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于DM642的FBTC程序的编写1、 引言在嵌入式系统开发过程中,把编写好的应用程序烧写进目标板的Flash以实现系统的上电自举是非常重要的一个环节。对于嵌入式DSP系统,我们常使用FlashBurn System来对Flash进行烧写。FlashBurn System由两部分组成,分别是FlashBurn应用软件(application)和FBTC(FlashBurn Target Component)程序(program)。FlashBrun的工作原理如图1所示:图1FlashBurn应用软件提供用户操作界面,把FBTC程序通过ccs和JTAG仿真器下载到DSP目标板中,由FBTC程序对

2、FLASH存储空间进行操作和管理,并把用户程序下载到FLASH存储器中。由此可见,FlashBurn应用软件就相当于厂房里的各种机器设备,而FBTC程序则是生产和操作规程。从某种意义来说FlashBurn是硬件,而FBTC是软件,在相同的FlashBurn里应用不同的FBTC会得到完全不一样的效果。事实上,当CCS、DSP目标板、仿真器、FlashBurn或FLASH芯片的型号不一样时,FBTC程序就应做相应的改变,以成功地将用户程序烧写到FLASH中。本文试着将这些改变剖析一下。二、需要说明的问题本文使用的各种工具有CCS3.3、DM642EVM开发板、XDS560 JTAG 仿真器、Fla

3、shburn 2.80,需要烧写的FLASH芯片是AMD公司的AM29LV033C。该FLASH的容量是4Mbytes(0X400000),在DM642上对应的存储空间位于CE1 EMIF,其首地址是0X90000000。该款FLASH芯片的datasheet如图2:推荐精选 图2从上图可知:1)向flash的任意位置写入序列0xAA, 0x55, 0x80, 0xAA, 0x55, 0x10,表示擦出该位置的数据;2)写入0xf0表示将flash设置为读模式;3)序列0xAA, 0x55, 0xA0后加上一字节的数据表式将该数据写入到flash的某一位置上。本文所举的例子是在FBTC6416

4、程序的基础上修改而成的,该程序所在的文件可以在FlashBurn的安装文件中找到。之所以选择TEB6416,是因为它和DM642属于同一个ISA(Instruction Set Architecture)家族。三、得到FBTC642的步骤。(1)将FBTC6416文件夹复制到你自己的工作区域,将文件名和文件中所有的6416改成642。用记事本打开.pjt文件,将里面的TEB6416改成DM642,将ProjectDir="C:ccFlashBurnpitvobFlashBurnersrcFBTCTEB6416"引号里内容改成你现在的工程文件所在的路径。保存后,在ccs里打开

5、该工程文件,将build option 设置为Full Debug和 No Optimization后编译,链接。(2)修改FLASH的起始地址和大小。在文件dm642.h中:将“#define FLASH_SIZE0x80000” 改成“#define FLASH_SIZE 0x40000”将“#define FLASH_START 0x64000000”改成“#define FLASH_START 0x90000000”将“#define CE1_8 0xffffff03”改成 “#define CE1_8 0xF3A88E02”将 “#define CE1_320xffffff23”改成

6、 “#define CE1_32 0xF3A88E22”(3)FLASH的寻址。FlashBurn把flash image 当做是从下标为0开始的一个字节流,FBTC程序要做的就是把这一字节流和实际地址一一对应起来,这一任务由FBurnCmd.c里的相关函数实现,另外还需要编写一个新的函数推荐精选SetFlashPage()来设置FPGA的页寄存器。即在FBurnCmd.c里添加如下代码:void SetFlashPage(FLASH_IMAGE_INDEX_TYPE index) PTR_SIZED_INT addr = (u32)GetFlashBase() + index; *FLASH

7、_PAGE = (addr & 0x380000) >> 19;(4)把FLASH设置为读状态。这一功能由函数ResetFlash()实现。根据FLASH的datasheet,其代码应为:void ResetFlash() volatile FLASH_DATA_TYPE* volatile flashaddr; flashaddr = GetFlashAddr(0); /* Don't care what address is used */ *flashaddr = 0xF0;这里不用修改。(5)从FLASH中读取数据这一功能由函数GetNextFlashAdd

8、r,GetFlashVal(), SendFlashBufToHost()联合实现,第一个函数负责寻址,第二个负责取数,第三个负责传数。在文件FBurnCmd.c中:函数GetFlashVal()改成, u8 GetFlashVal(unsigned long addr)*FLASH_PAGE = (u8)(u32)addr & 0x380000) >> 19);return *(volatile u8 *)(addr & 0xffc7ffff);(6)擦除FLASH此功能由函数EraseFlash()实现,由此型号的FLASH可知,其参考代码如下:void Era

9、seFlash(void) volatile FLASH_DATA_TYPE* volatile pBase = GetFlashBase(); /* Code to erase AMD29LV033C */推荐精选 *pBase = 0xAA; *pBase = 0x55; *pBase = 0x80; *pBase = 0xAA; *pBase = 0x55; *pBase = 0x10; CheckFlashErase(); ResetFlash(); return;(7)写FLASH此功能由函数BurnFlash()完成,参考代码如下:void BurnFlash(FLASH_IMAG

10、E_INDEX_TYPE index, MSG_DATA_TYPE *data, u32 nBytes) u16 timeout; u8 c; volatile FLASH_DATA_TYPE* volatile flashaddr; FLASH_IMAGE_INDEX_TYPE i = index; volatile FLASH_DATA_TYPE* volatile pBase = GetFlashBase();#if DBPRINT printf("Burning %x bytes of flash at %xn", nBytes, flashaddr);#endif

11、 while(nBytes-) flashaddr = GetFlashAddr(i); SetFlashPage(i); *pBase = 0xAA; *pBase = 0x55; *pBase = 0xA0; /* Write a byte */ *flashaddr = *data;推荐精选 /* Spin here until programming completes */ c = *data+; timeout = 0; do timeout += 1; while(*flashaddr != c && timeout < (u16)0xffff) ; i+; ResetFlash();对于不同型号的FLASH,*pBase对应的值不同,对于不同的开发板就看是否有分页。这些修改完成之后,就可以将整个工程进行编译、连接,得到的FBTC642.out文件就可以应用在FlashBurn里面了。四、应用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论