网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> 服务导航 >> 帮助中心 >> C5000 >> 文章正文
  并行FLASH引导的一点经验           ★★★ 【字体:
并行FLASH引导的一点经验
作者:阿哲    文章来源:本站原创    点击数:    更新时间:2006-4-25    

 

我用的DSP是5416,以其为核心,做了一个相对独立的子系统(硬件、软件、算法),目前都已基本做好。

下面把在FLASH引导方面做的工作向大家汇报一下,希望能对大家有所帮助。本人经验和文笔都有限,写的不好请大家谅解。

硬件环境:
DSP:TMS320VC5416PGE160
FLASH:SST39VF400A-70-4C-EK
都是贴片的,FLASH映射在DSP数据空间的0x8000-0xFFFF
软件环境:
CCS v2.12.01

主程序(要烧入FLASH的程序):
DEBUG版,程序占用空间0x28000-0x2FFFF(片内SARAM),中断向量表在0x0080-0x00FF(片内DARAM),数据空间使用0x0100-0x7FFF(片内DARAM)。

因为FLASH是贴片的,所以需要自己编一个数据搬移程序,把要主程序搬移到FLASH中。在写入FLASH数据时,还应写入引导表的格式数据。最后在数据空间的0xFFFF处写入引导表的起始地址(这里为0x8000)。

搬移程序:
DEBUG版,程序空间0x38000-0x3FFFF(片内SARAM),中断向量表在0x7800-0x78FF(片内DARAM),数据空间使用0x5000-0x77FF(片内DARAM)。

搬移程序不能使用与主程序的程序空间和中断向量表重合的物理空间,以免覆盖。

烧写时,同时打开主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然后执行搬移程序,烧写OK!

附:搬移程序(仅供参考)

volatile unsigned int *pTemp=(unsigned int *)0x7e00;
unsigned int iFlashAddr;
int iLoop;

/*  在引导表头存放并行引导关键字  */
iFlashAddr=0x8000;
WriteFlash(iFlashAddr,0x10aa);
iFlashAddr++;
/*  初始化SWWSR值  */
WriteFlash(iFlashAddr,0x7e00);
iFlashAddr++;
/*  初始化BSCR值  */
WriteFlash(iFlashAddr,0x8006);
iFlashAddr++;
/*  程序执行的入口地址  */
WriteFlash(iFlashAddr,0x0002);
iFlashAddr++;
WriteFlash(iFlashAddr,0x8085);
iFlashAddr++;
/*  程序长度  */
WriteFlash(iFlashAddr,0x7f00);
iFlashAddr++;
/*  程序要装载到的地址  */
WriteFlash(iFlashAddr,0x0002);
iFlashAddr++;
WriteFlash(iFlashAddr,0x8000);
iFlashAddr++;
for (iLoop=0;iLoop<0x7f00;iLoop++)
{
    /*  从程序空间读数据,放到暂存单元  */
    asm("    pshm al");
    asm("    pshm ah");
    asm("    rsbx cpl");
    asm("    ld #00fch,dp");
    asm("    stm #0000h, ah");
    asm("    MVDM _iLoop, al");
    asm("    add #2800h,4,a");
    asm("    reada 0h");
    asm("    popm ah");
    asm("    popm al");
    asm("    ssbx cpl");
    /*  把暂存单元内容写入FLASH  */
    WriteFlash(iFlashAddr,*pTemp);
    iFlashAddr++;
}
/*  中断向量表长度  */
WriteFlash(iFlashAddr,0x0080);
iFlashAddr++;
/*  中断向量表装载地址  */
WriteFlash(iFlashAddr,0x0000);
iFlashAddr++;
WriteFlash(iFlashAddr,0x0080);
iFlashAddr++;
for (iLoop=0;iLoop<0x0080;iLoop++)
{
    /*  从程序空间读数据,放到暂存单元  */
    asm("    pshm al");
    asm("    pshm ah");
    asm("    rsbx cpl");
    asm("    ld #00fch,dp");
    asm("    stm #0000h, ah");
    asm("    MVDM _iLoop, al");
    asm("    add #0080h,0,a");
    asm("    reada 0h");
    asm("    popm ah");
    asm("    popm al");
    asm("    ssbx cpl");
    /*  把暂存单元内容写入FLASH  */
    WriteFlash(iFlashAddr,*pTemp);
    iFlashAddr++;
}
/*  写入引导表结束标志  */
WriteFlash(iFlashAddr,0x0000);
iFlashAddr++;
WriteFlash(iFlashAddr,0x0000);
/*  在数据空间的0xFFFF写入引导表起始地址  */
iFlashAddr=0xffff;
WriteFlash(iFlashAddr,0x8000);

By 阿哲
chenzher@163.com

               欢迎点击进入:TI德州中文网   (国内唯一针对TI应用的中文技术网站)    文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    通用FLASH烧写工具
    请问如何分片烧写flash
    关于FLASH.CMD的一些问题
    关于FLASH烧写的问题
    烧到Flash的程序,断电再上电…
    Flash烧写
    关于Flash
    Flash程序如何下载到RAM中
    TMS320C6205外部flash启动方…
    DM642的FLASH大小的问题
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号