DSP系统应用中FLASH在线编程方法
介绍了在TI公司TMS320VC33 DSP应用系统中,通过JTAG口对DSP外部FLASH存储器实现在线编程的方法,给出了DSP系统加电后的自动装载运行。
关键词:DSP JTAG FLASH存储器在线编程 Bootload
FLASH存储器是一种高密度。非易失性的电可擦写存储器,存储量大,使用方便,适用于低功耗。高性能的系统。在高速DSP应用系统中,为了充分发挥DSP性能,在加电后需要将用户代码装载到高速RAM存储器中运行。下面介绍 SST29LE020型FLASH存储器的烧写方法,以及如何实现TMS320VC33上电后用户程序的自举引导(Bootload)。
1 SST29LE020的特点及操作
SST29LE020是SST公司生产的一种256K×8FLASH,它有10万次以上的擦写寿命,其内部分为2048个页面,每个页面128字节,页面写周期为5ms。如果页面中一个数据需要改变,则这个分区的所有数据必须重新装入。(The SST29LE020 are 256K x8 CMOS Page-Write EEPROM manufactured with SST's proprietary, high performance CMOS SuperFlash technology. The split-gate cell design and thick oxide tunneling injector attain better reliability and manufacturability compared with alternate approaches. The SST29LE020 write with a single
介绍了在TI公司TMS320VC33 DSP应用系统中,通过JTAG口对DSP外部FLASH存储器实现在线编程的方法,给出了DSP系统加电后的自动装载运行。
关键词:DSP JTAG FLASH存储器在线编程 Bootload
FLASH存储器是一种高密度。非易失性的电可擦写存储器,存储量大,使用方便,适用于低功耗。高性能的系统。在高速DSP应用系统中,为了充分发挥DSP性能,在加电后需要将用户代码装载到高速RAM存储器中运行。下面介绍 SST29LE020型FLASH存储器的烧写方法,以及如何实现TMS320VC33上电后用户程序的自举引导(Bootload)。
1 SST29LE020的特点及操作
SST29LE020是SST公司生产的一种256K×8FLASH,它有10万次以上的擦写寿命,其内部分为2048个页面,每个页面128字节,页面写周期为5ms。如果页面中一个数据需要改变,则这个分区的所有数据必须重新装入。(The SST29LE020 are 256K x8 CMOS Page-Write EEPROM manufactured with SST's proprietary, high performance CMOS SuperFlash technology. The split-gate cell design and thick oxide tunneling injector attain better reliability and manufacturability compared with alternate approaches. The SST29LE020 write with a single
power supply. Internal Erase/Program is transparent to the user. The SST29LE020 conform to JEDEC standard pinouts for byte-wide memories.)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页面写操作在使用内部定时方式时的流程。
2 TMS320VC33简介
TMS320VC33是美国TI公司推出的TMS320C3X系列的32位浮点数字信号处理器,它是在TMS320C31浮点DSP的基础上开发的一个价格更低的DSP,该产品具有高速。低功耗。低成本。易于开发等显著优点。 TMS320VC33采用内部1.8V,外部3.3V供电,因而它的功耗比原
SST29LE020的读操作与传统EPROM读操作一致;在进行数据编程操作时,它支持内部定时(Internal Timer).数据查询(Data#Polling).跳变位(Toggle Bit)三种方式,以测试内部编程操作是否完成。FLASH软件擦除指令为6字节加载指令,该指令执行后,最多等待20ms整个芯片便被擦除,即将 FLASH每个数据位都恢复为1状态的全FF状态。
SST29LE020软件指令序列可在SST公司的数据手册上查到,在FLASH编程之前,需对FLASH进行擦除,擦除操作需要六个总线周期。
FLASH页面写操作在使用内部定时方式时的流程。
2 TMS320VC33简介
TMS320VC33是美国TI公司推出的TMS320C3X系列的32位浮点数字信号处理器,它是在TMS320C31浮点DSP的基础上开发的一个价格更低的DSP,该产品具有高速。低功耗。低成本。易于开发等显著优点。 TMS320VC33采用内部1.8V,外部3.3V供电,因而它的功耗比原
有型号TMS320C31的功耗降低了大约一个整量级,而且能支持高达 150M/FLOPS的运行速率。其主要特性如下:
CPU是32bit的高性能CPU:可进行16/32b整数和32/40b的浮点操作;内含8个扩展精度寄存器;有2个地址发生器。8个辅助寄存器和2个辅助寄存器算术单元(ARAU)。
片内存储器为32bit指令字。24bit地址线。34K×32b(1.1Mb)的双静态RAM。
外围接口具有启动程序装载功能;内含5倍频的锁相环(PLL)时钟发生器;片内存储器可映射外设,其中包括一个串行口。两个32bit定时器和一个DMA;具有四个内部译码页选,可大大简化TMS320VC33与I/O及存储器的接口。
3 TMS320VC33程序引导功能
TMS320VC33具有两种存储器映射方式,即在线编程和离线编程的特点MP(Microprocessor Mode)方式和MC/BL(Microcomputer/Bootloader Mode)方式,两种方式下中断向量的位置不同。常用的是MC方式。在该方式下,MCBL/MP引脚接高电平,内部ROM被映射到000~FFF之间。这段ROM中今有器件生产厂家固化的引导程序(BootLoader),该引导程序可以将DSP实时运行的程序和数据从外部低速ROM或串行口装入到高速 RAM中。
TMS320VC33复位后即运行内部固化的引导程序,引导程序通过查询四个中断引脚来确定装
CPU是32bit的高性能CPU:可进行16/32b整数和32/40b的浮点操作;内含8个扩展精度寄存器;有2个地址发生器。8个辅助寄存器和2个辅助寄存器算术单元(ARAU)。
片内存储器为32bit指令字。24bit地址线。34K×32b(1.1Mb)的双静态RAM。
外围接口具有启动程序装载功能;内含5倍频的锁相环(PLL)时钟发生器;片内存储器可映射外设,其中包括一个串行口。两个32bit定时器和一个DMA;具有四个内部译码页选,可大大简化TMS320VC33与I/O及存储器的接口。
3 TMS320VC33程序引导功能
TMS320VC33具有两种存储器映射方式,即在线编程和离线编程的特点MP(Microprocessor Mode)方式和MC/BL(Microcomputer/Bootloader Mode)方式,两种方式下中断向量的位置不同。常用的是MC方式。在该方式下,MCBL/MP引脚接高电平,内部ROM被映射到000~FFF之间。这段ROM中今有器件生产厂家固化的引导程序(BootLoader),该引导程序可以将DSP实时运行的程序和数据从外部低速ROM或串行口装入到高速 RAM中。
TMS320VC33复位后即运行内部固化的引导程序,引导程序通过查询四个中断引脚来确定装
入方式。这些引脚为低电平有效,查询顺序依次为INT3.INT0.INT1.INT2;当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头仿真
TMS320VC33具有四个快速页选信号,用于对外部地址空间寻址。
使用外部存储器装入数据时,外部存储器数据头位置需包含以下信息:
(1)外部存储器宽度(8/16/32位);
(2)程序代码块的长度;
(3)装入数据的目的起始地址;
(4)存储器访问的定时控制参数。
头信息之间是用户的程序代码,程序代码按低位在前。高位在后的顺序排列。程序代码之后,必须有一个全零字,即0x00000000,用以指示引导程序用户程序代码已结束。引导完成后,即从装入的目的地址处开始执行用户程序。
4 FLASH在线编程方法
TMS320VC33的调试使用CC for C3x/4X(Code COmposer)集成编程环境,通过JTAG头仿真
用户板,用户代码先放在外部RAM中调试,调试成功后,就可以将用户程序代码写入FLASH了。下面介绍在并行装入BOOT2方式下的在线编程方法。
SST29LE020与TMS320VC33的连接方式比较简单,FLASH片选CE引脚直接连接至TMS320VC33的PAGE1引脚;FLASH的输出使能OE引脚的最简单的处理方法是采用跳线方式(当向FLASH写入数据时,接高电平;通常情况下,接地)。
在调试用户程序时,需根据用户板的存储器空间分配制作CMD文件,假设用户扩展的外部RAM为32bit,起始地址为0x00c00000,长度为32K;外部FLASH起始地址为0x00400000(使用BOOT2方式),长度为256K。其CMD文件如下:
MEMORY
{
INTRAM1:origin=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*/
SST29LE020与TMS320VC33的连接方式比较简单,FLASH片选CE引脚直接连接至TMS320VC33的PAGE1引脚;FLASH的输出使能OE引脚的最简单的处理方法是采用跳线方式(当向FLASH写入数据时,接高电平;通常情况下,接地)。
在调试用户程序时,需根据用户板的存储器空间分配制作CMD文件,假设用户扩展的外部RAM为32bit,起始地址为0x00c00000,长度为32K;外部FLASH起始地址为0x00400000(使用BOOT2方式),长度为256K。其CMD文件如下:
MEMORY
{
INTRAM1:origin=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空间。
第二步:依据TMS320VC33的BOOT格式,并根据CC产生的用户。MAP文件出程序入口地址。各加载块的入口地址以及长度,编写FLASH烧写文件。示例源程序清单如下:
#define MEM_WIDE 0x00000008 /*Flash存储器宽度*/
#define CG_REGISTER 0x000010c8 /*全局存储器配置参数*/
SECTIONS
{/*用户程序代码及初始化数据放在外部RAM*/
.vectors>VEC /*VC33规定的中断向量地址*/
.text :LOAD=EXTRAM
.cinit>EXTRAM
.data:RUN=EXTRAM
.bss:RUN=INTRAM2
.stack>INTRAM1
}
第一步:在CC下编译后,装入用户。OUT文件,用户程序代码即被写入EXRAM空间。
第二步:依据TMS320VC33的BOOT格式,并根据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;
/
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;
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 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); /*第1个boot的数据长度为1*/
write_flash()ENTER_POINT; /*写入boot的目的地址*/
write_flash(0); /*第1个boot的数据*/
for(i=0;i<BOOTBLK;i++) /*分别烧写需要boot的数据块*/
{if(i==0) /*每个数据块烧写的起起2字节分别是长度和源地址*/
{lenth=BOOTBLK1_LEN;
write_flash(BOOTHBLK1_LEN);
write_flash(BOOTSRC1_ADD);}
{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); /*第1个boot的数据长度为1*/
write_flash()ENTER_POINT; /*写入boot的目的地址*/
write_flash(0); /*第1个boot的数据*/
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文件中SEC
{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文件中SEC
TION段如下:
SECTIONS
{/*Flash烧写代码及初始化数据放在TMS320VC33内部RAM*/
.text:LOAD=INTRAM1
.bss:RUN=INTRAM1
.cinit>INTRAM1
.stack>INTRAM1
}
第四步:运行烧写程序,用户代码即被写入FLASH中,将FLASH的OE引脚跳线连通至的位置,利用CC可以查看FLASH存储器内容是否与要烧写的内部一致,并脱机检验。
FLASH在线编程方法已在用户板上得到了验证,达到了预期的目的。通过JTAG仿真器对 TMS320VC33用户系统外部FLASH的在线编程,可以省去HEX转换工具及EPROM编程器等工具,且具有方便。易行的特点。该现场在线编程的方法可推广至其它系列DSP用户系统,是DSP开发中需要掌握的一项新技术。
SECTIONS
{/*Flash烧写代码及初始化数据放在TMS320VC33内部RAM*/
.text:LOAD=INTRAM1
.bss:RUN=INTRAM1
.cinit>INTRAM1
.stack>INTRAM1
}
第四步:运行烧写程序,用户代码即被写入FLASH中,将FLASH的OE引脚跳线连通至的位置,利用CC可以查看FLASH存储器内容是否与要烧写的内部一致,并脱机检验。
FLASH在线编程方法已在用户板上得到了验证,达到了预期的目的。通过JTAG仿真器对 TMS320VC33用户系统外部FLASH的在线编程,可以省去HEX转换工具及EPROM编程器等工具,且具有方便。易行的特点。该现场在线编程的方法可推广至其它系列DSP用户系统,是DSP开发中需要掌握的一项新技术。
TMS320VC5402(以下简称C5402)是TI公司的一款性价比极好的16位定
点DSP芯片。由于C5402内部只有16K×16位RAM和4K×16位掩膜ROM,用户程序必须存放在外挂的程序存储器中。对程序存储器的编程(即离线编程)通常是通过通用编程器完成的,即用户将要写入的程序转换成编程器能够接收的格式,再通过编程器写入存储器中。随着芯片制造工艺的不断提高,芯片集成度越来越高,存储器正在向小型化、贴片式发展,从而使表面封装或PLCC封装的存储器难以利用编程器编程。目前普遍采用的在系统编程ISP(In System Programming)技术不需要编程器,通过系统的DSP可直接对用户板上的存储器编程,这样不仅节省了通用编程器及适配器的费用,还减少了频繁插拔存储器的麻烦,从而大量节省了系统开发时间,满足了用户程序在线更新的要求。外挂的程序存储器通常选用容量大、存储速度快、功耗低、性价比高的FLASH存储器。
由于DSP仿真软件编译链接后生成的是二进制的COFF格式文件,不能直接写入FLASH中,还需通过Hex转换工具将COFF目标文件转换为标准的ASCII码十六进制格式(即Hex格式)。对于离线编程,只需将这种Hex文件直接作为编程器的输入,即可写入FLASH;而在系统编程,则是利用系统本身的DSP,通过软件编程来实现整个烧写过程。因此,如何对FLASH进行烧写是整个在系统编程的一个关键。本文以一片C
5402外挂一片FLASH存储器构成的最小系统为实例,介绍采用C语言编写FLASH烧写程序,并通过DSP将用户程序代码写入FLASH,从而实现在系统编程。
1 DSP与FLASH构成的最小系统
本系统的FLASH存储器选用SST公司的SST39VF400A,用作DSP的数据空间。FLASH的片选信号/CE由DSP的数据空间选择信号/DS和存储器选通信号/MSTRB产生,读使能信号/OE和写使能信号/WE由DSP的读写脉冲信号R/W和/DS、/MSTRB组合产生。FLASH的地址线A0~A15和DSP的A0~A15直接相连,A16和A17接地。由于DSP数据空间0000H~3FFFH为存储器映象寄存器、暂存器和片内RAM,对外部FLASH来讲是不可见的,所以FLASH可操作的地址范围为4000H~0FFFFH。设用户程序从FLASH中8000H单元开始存放,则系统上电时引导程序就从数据空间的8000H单元开始搬运数据到DSP内部RAM指定区域,引导完毕后即跳转到RAM中程序入口地址运行用户程序。
2 SST39VF400A的在系统编程
2.1 芯片简介及常用命令
SST39VF400A是SST公司的256K×16位FLASH存储器,工作电压3.3V、擦写寿命100 000次,访问时间70~90ns。用户只需向其特定地址写入特定的指令序列,那么通过这些命令用户即可启动内部写状态机,从而使其自动完成指令序列要求的内部操作,其中包括:复位、整片擦除、块擦除、扇区擦除、操作字写入等。
2.2 SST39VF400A编程操作
对采用在系统编程的FLASH存储器,整个编程过程由用户控制,因此用户必须了解FLASH存储器的各状态位,以便知道编程或擦除是否结束。SST39VF400A内部提供两种软件检查方法:检查状态位Data# Polling(DQ7)和Toggle Bit(DQ6)。现以检查Toggle Bit(DQ6)位为例来具体说明SST39VF400A的编程及检查机制。SST39VF400A在进行内部编程或擦除时,对任何地址进行连续读取都会引起DQ6的跳变,当操作停止就会结束跳变。因此可以通过连续两次读取检查DQ6的变化情况来判断编程擦除操作是否完成。单字编程及检查流程如图1所示(其中WA为要写入数据的存储地址)。
3 C5402的并行引导装载
通过在系统编程操作可以实现将用户程序代码写入FLASH。如何确定FLASH中用户程序代码的存放格式并正确地引导装载以实现脱机运行,则是整个在系统编程的重点之处。在C5402的五种引导方式中,并行引导是DSP系统最常用最简单的引导方式。下面介绍C5402的并行16位引导装载方法。
3.1 引导过程简介
为了正确引导用户程序,必须编制引导表,引导表要告诉引导程序采用何种引导方式、程序入口地址、各段的目标首地址和长度等。引导表的数据格式是由链接配置文件和HEX转换配置文件决定的,链接配置文件定义各段存放的首地址和长度,而HEX转换配置文件则定义引导方式、程序入口地址和引导表在外部存储器中存放的首地址。引导程序可以从地址为0FFFFH单元的I/O端口或数据存储器取得引导表的起始地址。本文介绍的是并行引导方式,引导过程如下:引导程序先从外部数据空间的0FFFFH单元(即FLASH的0FFFFH单元)读取引导表起始地址,然后从该起始地址读取引导标识。若为08AAH则为并行8位引导方式;若不是再从起始地址的下一单元读取内容,看由此两单元内容组成的16位字是否为10AAH,若是则为并行16位引导方式。最后从引导表指定的地址
搬运各段代码到片内RAM对应的地址,搬运完毕后即从程序入口地址执行用户程序。由此可见,引导表的编制是引导过程的关键。下面结合实例具体介绍引导表的形成和装载过程(设用户程序为测试指示灯的程序,源文件为main.asm和vectors.asm 源代码省略)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论