网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> C3000文章 >> VC33X系列 >> 文章正文
  [图文]DSP系统应用中FLASH在线编程方法       ★★★ 【字体:
DSP系统应用中FLASH在线编程方法
作者:黎明也    文章来源:电子技术应用    点击数:    更新时间:2005-7-23    

来源:电子技术应用  作者:黎明也

摘要:介绍了在TI公司TMS320VC33 DSP应用系统中,通过JTAG口对DSP外部FLASH存储器实现在线编程的方法,给出了DSP系统加电后的自动装载运行。

 

    关键词:DSP JTAG FLASH存储器 在线编程 Bootload

 

FLASH存储器是一种高密度、非易失性的电可擦写存储器,存储量大,使用方便,适用于低功耗、高性能的系统。在高速DSP应用系统中,为了充分发挥DSP性能,在加电后需要将用户代码装载到高速RAM存储器中运行。下面介绍SST29LE020FLASH存储器的烧写方法,以及如何实现TMS320VC33上电后用户程序的自举引导(Bootload)。

 

1 SST29LE020的特点及操作

 

SST29LE020SST公司生产的一种256K×8FLASH,它有10万次以上的擦写寿命,其内部分为2048个页面,每个页面128字节,页面写周期为5ms。如果页面中一个数据需要改变,则这个分区的所有数据必须重新装入。

 

FLASH支持软件数据保护功能(Software Data Protection),当执行三字节DSP写指令时,保护功能将自动加上,任何后续的写操作必须带上三字节DSP写指令。

 

SST29LE020的读操作与传统EPROM读操作一致;在进行数据编程操作时,它支持内部定时(Internal Timer)、数据查询(Data#Polling)、跳变位(Toggle Bit)三种方式,以测试内部编程操作是否完成。FLASH软件擦除指令为6字节加载指令,该指令执行后,最多等待20ms整个芯片便被擦除,即将FLASH每个数据位都恢复为1状态的全FF状态。

 

SST29LE020软件指令序列可在SST公司的数据手册上查到,在FLASH编程之前,需对FLASH进行擦除,擦除操作需要六个总线周期。

 

FLASH页面写操作在使用内部定时方式时的流程如图1所示。

 

2 TMS320VC33简介

 

TMS320VC33是美国TI公司推出的TMS320C3X系列的32位浮点数字信号处理器,它是在TMS320C31浮点DSP的基础上开发的一个价格更低的DSP,该产品具有高速、低功耗、低成本、易于开发等显著优点。TMS320VC33采用内部1.8V,外部3.3V供电,因而它的功耗比原有型号TMS320C31的功耗降低了大约一个整量级,而且能支持高达150M/FLOPS的运行速率。其主要特性如下:

 

CPU32bit的高性能CPU:可进行16/32b整数和32/40b的浮点操作;内含8个扩展精度寄存器;有2个地址发生器、8个辅助寄存器和2个辅助寄存器算术单元(ARAU)。

 

片内存储器为32bit指令字、24bit地址线、34K×32b1.1Mb)的双静态RAM

 

外围接口具有启动程序装载功能;内含5倍频的锁相环(PLL)时钟发生器;片内存储器可映射外设,其中包括一个串行口、两个32bit定时器和一个DMA;具有四个内部译码页选,可大大简化TMS320VC33I/O及存储器的接口。

 

3 TMS320VC33程序引导功能

 

TMS320VC33具有两种存储器映射方式,即MPMicroprocessor Mode)方式和MC/BLMicrocomputer/Bootloader Mode)方式,两种方式下中断向量的位置不同。常用的是MC方式。在该方式下,MCBL/MP引脚接高电平,内部ROM被映射到000FFF之间。这段ROM中今有器件生产厂家固化的引导程序(BootLoader),该引导程序可以将DSP实时运行的程序和数据从外部低速ROM或串行口装入到高速RAM中。

 

TMS320VC33复位后即运行内部固化的引导程序,引导程序通过查询四个中断引脚来确定装入方式。这些引脚为低电平有效,查询顺序依次为INT3INT0INT1INT2;当INT3有效时,为串行装入方式;当INT0有效时,从外部地址0x001000处装入(BOOT1);当INT1有效时,从外部地址0x400000处装入(BOOT2);当INT2有效时,从外部地址0xfff000处装入(BOOT3)。

 

TMS320VC33具有四个快速页选信号,用于对外部地址空间寻址。

 

使用外部存储器装入数据时,外部存储器数据头位置需包含以下信息:

 

1 外部存储器宽度(8/16/32位);

 

2 程序代码块的长度;

 

3 装入数据的目的起始地址;

 

4 存储器访问的定时控制参数。

 

头信息之间是用户的程序代码,程序代码按低位在前、高位在后的顺序排列。程序代码之后,必须有一个全零字,即0x00000000,用以指示引导程序用户程序代码已结束。引导完成后,即从装入的目的地址处开始执行用户程序。

 

4 FLASH在线编程方法

 

TMS320VC33的调试使用CC for C3x/4X(Code COmposer)集成编程环境,通过JTAG头仿真用户板,用户代码先放在外部RAM中调试,调试成功后,就可以将用户程序代码写入FLASH了。下面介绍在并行装入BOOT2方式下的在线编程方法。

 

SST29LE020TMS320VC33的连接方式比较简单,FLASH片选CE引脚直接连接至TMS320VC33PAGE1引脚;FLASH的输出使能OE引脚的最简单的处理方法是采用跳线方式(当向FLASH写入数据时,接高电平;通常情况下,接地)。

 

在调试用户程序时,需根据用户板的存储器空间分配制作CMD文件,假设用户扩展的外部RAM32bit,起始地址为0x00c00000,长度为32K;外部FLASH起始地址为0x00400000(使用BOOT2方式),长度为256K。其CMD文件如下:

 

MEMORY

 

{

 

INTRAM1origin=0x00800000,length=0x00008000

 

INTRAM2:origin=0x00809800,length=0x000007c1

 

VEC:origin=0x00809fc1,length=0x3f

 

EXTRAM:origin=0x00c00000,length=0x00008000/*32k*/

 

FLASH:origin=0x00400000,length=0x00040000/*256*/

 

}

 

SECTIONS

 

{/*用户程序代码及初始化数据放在外部RAM*/

 

.vectors>VEC /*VC33规定的中断向量地址*/

 

.text :LOAD=EXTRAM

 

.cinit>EXTRAM

 

.data:RUN=EXTRAM

 

.bss:RUN=INTRAM2

 

.stack>INTRAM1

 

}

 

第一步:在CC下编译后,装入用户.OUT文件,用户程序代码即被写入EXRAM空间。

 

第二步:依据TMS320VC33BOOT格式,并根据CC产生的用户.MAP文件找出程序入口地址、各加载块的入口地址以及长度,编写FLASH烧写文件。示例源程序清单如下:

 

#define MEM_WIDE 0x00000008 /*Flash存储器宽度*/

 

#define CG_REGISTER 0x000010c8 /*全局存储器配置参数*/

 

#define ENTER_POINT 0x00c00064 /*程序代码入口地址*/

 

volatile int *flash_add=(volatile int *)0x400000;/*外部Flash的映射地址*/

 

#define BOOTORG 0xc00064 /*.MAP文件中的程序入口地址

 

#define BOOTBLK 3/*.MAP 文件中的加载块数量*/

 

#define BOOTSRC1_ADD 0x00809fc1 /*1个加载块地址*/

 

volatile int *bootblk1_add=(volatile int *)0x00809fc1;

 

#define BOOTBLK1_LEN 0x3a /*1个加载块长度*/

 

#define BOOTSRC2_ADD 0x00C00000 /*2个加载块地址*/

 

volatile int *bootblk2_add=(volatile int *)0x00c00000;

 

#define BOOTBLAK2_LEN 0xa3 /*2个加载块长度*/

 

#define BOOTSRC3_ADD 0x00C000a3 /*3个加载块地址*/

 

volatile int *bootblk3_add=(volatile int *)0x00c000a3;

 

#define BOOTBLK3_LEN 0x17 /*3个加载块长度*/

 

////////////////////////////////////////////

 

unsigned int flashaddnum,bytenum;

 

/*定义Flash地址及页面字节数变量*/

 

void waite(int ms)/****软件 1ms子程序****/

 

{…………;}

 

void sdp_flash()/******软件数据保护子程序*********/

 

{flash_add[0x5555]=0xaa;/*3字节芯片SDP指令*/

 

flash_add[0x2aaa]=0x55;

 

flash_add[0x5555]=0xa0;

 

}

 

void era_flash()/******擦除芯片子程序*********/

 

{flash_add[0x5555]=0xaa;/*6字节芯片擦除指令*/

 

flash_add[0x2aaa]=0x55;

 

flash_add[0x5555]=0x80;

 

flash_add[0x5555]=0xaa;

 

flash_add[0x2aaa]=0x55;

 

flash_add[0x5555]=0x10;

 

waite(20); /*20ms等待芯片擦除完成*/

 

}

 

void write_flash(int bootdata)/***写一个int型数据***/

 

{unsigned int i;

 

for(i=0;i<3;i++) /*一个int型数分成四个字节写入*/

 

{if(bytenum==0) /*如果是页面第1个字节,先写SDP指令*/

 

{sdp_flash();}

 

flash_add[flashaddnum]=bootdata; /*Flash地址写一个字节*/

 

flashaddnum++; /*Flash地址加1*/

 

bytenum++; /*页面字节加1*/

 

if(bytenum>127) /*一个页面写完,页面字节置0,等待11ms*/

 

{bytenum=0;waite(11);}

 

bootdata>>=8; /*待写数据右移8*/

 

}

 

}

 

void main() /***主程序***/

 

{unsigned int i,j,lenth;

 

bytenum=0;flashaddnum=0; /*Flash地址及页面字节数置*/

 

waite(1); /*等待1ms*/

 

era_flash(); /*擦除Flash芯片*/

 

write_flash(MEM_WIDE); /*写外部Flash存储器宽度*/

 

write_flash(CG_REGISTER); /*写寄存器配置参数*/

 

write_flash(1); /*1boot的数据长度为1*/

 

write_flash()ENTER_POINT; /*写入boot的目的地址*/

 

write_flash(0); /*1boot的数据*/

 

for(i=0;i<BOOTBLK;i++) /*分别烧写需要boot的数据块*/

 

{if(i==0) /*每个数据块烧写的起起2字节分别是长度和源地址*/

 

{lenth=BOOTBLK1_LEN;

 

write_flash(BOOTHBLK1_LEN);

 

write_flash(BOOTSRC1_ADD);}

 

else if(i==1)

 

{lenth=BOOTBLK2_LEN;write_flash(BOOTBLK2_LEN);

 

write_flash(BOOTSRC3_ADD);}

 

else{;}

 

for(j=0;j<lenth;j++) /*将数据块内容写入Flash*/

 

{if(i==0){write_flashbootblk1_add[j]};}

 

else if(i==1){write_flash(bootblk2_add[j]);}

 

else if(i==2){write_flash(bootblk3_add[j]);}

 

else{;}

 

}

 

}

 

write_flash(0); /*代码最后位置写全零*/

 

write(10); /*等待10ms,保证Flash写完成*/

 

}

 

第三步:修改.CMD文件SECTION段,将烧写程序链接到内部RAM区。.CMD文件中SECTION段如下:

 

SECTIONS

 

{/*Flash烧写代码及初始化数据放在TMS320VC33内部RAM*/

 

.text:LOAD=INTRAM1

 

.bss:RUN=INTRAM1

 

.cinit>INTRAM1

 

.stack>INTRAM1

 

}

 

第四步:运行烧写程序,用户代码即被写入FLASH中,将FLASHOE引脚跳线连通至的位置,利用CC可以查看FLASH存储器内容是否与要烧写的内部一致,并脱机检验。

 

FLASH在线编程方法已在用户板上得到了验证,达到了预期的目的。通过JTAG仿真器对TMS320VC33用户系统外部FLASH的在线编程,可以省去HEX转换工具及EPROM编程器等工具,且具有方便、易行的特点。该现场在线编程的方法可推广至其它系列DSP用户系统,是DSP开发中需要掌握的一项新技术。

 

 

 

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

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    没有相关文章
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号