资源描述
二次boot
精品资料
TMS320C6000系列二次Bootloader的设计与实现
2007-07-25 16:27:29 作者:谢世珺 李永超等 来源:电子工程师
关键字: 程序 中断 指令 存储
引 言
随着DSP(数字信号处理器)系统的广泛应用,其程序规模也随之不断扩大,使用芯片本身自带的Boot-loader通过Flash存储器来引导DSP程序,往往受到程序大小和结构的制约,比如程序很大超过厂商固化boot的范围,再如中断向量表的不同位置对程序boot跳转的影响,等等,因此越来越需要更加灵活的引导方式。
系统上电后,由引导程序将DSP的应用程序从该存储器引导到DSP应用板上的高速存储器(如内部SRAM、SDRAM等)中。由于Flash存储器具有电信号删除功能,且删除速度快,集成度高,因此已成为此种存储器的首选。由于Flash存储器的存取速度较慢,写入Flash存储器的程序将在系统上电时被DSP装载到快速的存储器中运行,这个过程称为Boot loader。不同的DSP有不同的引导方式。以TI公司TMS320C6000系列芯片为例,自举方式有3种:无自举(No Boot),CPU直接开始执行地址0处的指令;主机自举(Host Boot),系统复位后主机通过CPU的HPI(主程序设计接口)初始化DSP的存储空间;ROM自举(ROM Boot),DMA控制器从CEl空间复制固定长度程序的地址0处,然后从地址0处开始执行。对于620x/670x DMA,复制64 kB数据从CEl到地址0;而对于621x/671x EDMA,复制1 kB数据从CEl地址开始到地址0。
关于TI公司的C6000芯片二次Bootloader在许多文献都介绍过,包括二次Bootloader的PLL、EMIF的设置和搬移表的设置和Flash存储器的烧写过程,但是对于有中断向量表的二次Bootloader实现的文献很少。本文以TI公司高性能DSP的代表作TMS320C6000系列芯片为例,介绍了一种带中断向量表的二次Bootloader的新途径,从而为TMS320C6000系列DSP的开发提供了一种新的思路。该方法在实际中得到具体应用,系统运行稳定可靠。
1 二次Bootload的过程
TMS320C6713是TI公司推出的TMS320C67xx系列浮点DSP中最新的一种芯片。TMS320C6713每周期可以执行8条32位指令;支持32/64位数据;具有最高225 MHz的运行速度和1800 MIPs(百万次运算每秒)或1350 MFLOPS(百万次浮点运算每秒)的处理能力;同时是有强大的外设支持能力;EMIP(外部存储器接口)可以很方便地与SDRAM、SBSRAM、Flash存储器、SRAM等同步和异步存储器相连,16位EHPI接口可以与各种处理器接口;另外,还有优化的多通道缓存串口和多通道音频串口,这些外部接口使设计人员可以很容易实现自己的应用系统。
在选择ROMBoot方式时,RESET由低变高后,C6713的CPU内核处于复位状态,而C6713的其他部分则开始工作,此时EMIF的CEl空间根据ROM Boot的方式自动地配置为8/16/32位异步存储器接口,并且CEl空间读/写时序自动地配置为最大,随后将CEl空间的前1 kB复制到0x0000 0000地址处。通过这1 kB的数据实现对其他程序的引导。对于中断向量表设在0x0000 0000~0x0000 0400处的程序来说,1 kB数据中处包含EMIF设置代码和搬移程序外,必然也包含中断向量表。本文重点叙述带中断向量表的Bootloader的过程,中断向量表起始地址为0x00000000。如果程序长度小于1 kB,那么就不需要二次bootloader,但是往往程序长度都会大于1 kB,所以二次bootloader是必然的过程。
二次Bootloader的实现需要引入EMIF设置和搬移的程序,即编写boot_c671x_2.s62、c6713_emif.s62,lnk2.cmd和boot.cmd3个文件。本文以实现多通道缓冲串口的程序进行说明,实现二次Bootload的过程框图如图1所示。
首先调入调试好的用户程序工程文件MeBSP_test.pjt工程作为例程,然后在此工程文件中引入3个文件。
程序编写好后,要引入3个很重要的文件;EMIF的值定义文件(c6713_emif.s62);关于EMIF的设置和数据搬移的程序(boot_c67lx_2.s62);cmd配置文件(lnk2.cmd)。同时,其原来的mcbsp.cmd文件要去掉。图2做了一个对比。图2(a)为原程序,图2(b)为生成要烧写的数据的程序,图2(b)中加入了3个文件,原有的mcbsp.cmd去掉了。其中boot_c67lx_2.s62是通用的,c6713_emif.s62要根据具体实际的芯片配置EMIF的参数。
其中boot_c671x_2.s62包含了.boot_load的函数,这个函数包含几个过程,如图3所示。c6713_emif.s62文件包括EMIF的几个参数配置。Ink2.cmd文件位COFF的配置。
其次,就是把生成的*.out文件首先使用CCS开发环境自带的工具Hex6x.exe把工程生成的*.out文件转化成hex格式,在DOS环境下指令为>Hex6x.exeboot.cmd。
最后根据Flash存储器芯片的要求把hex文件烧写到Flash存储器中指定的地址即可。本例采用的AM29LV800BB-70ecFlash存储器芯片,采用3.3 V供电,完全兼容JEDEC标准,并支持在系统编程,用户只需向其内部的命令寄存器写入命令序列即可实现部分擦除、全部擦除、数据写人等功能;同时可提供硬件和软件方法来检查Flash存储器的操作执行情况。首先需要对芯片进行擦除全部变为0xFFFF,然后再进行烧写。由于Flash存储器是以16位进行访问的,所以对Flash存储器而言其物理地址以16位为单位进行编址,而程序中使用的逻辑地址是以字节为单位进行编址的,二者之间的关系如下:逻辑地址=物理地址<<1,所以程序中有地址偏移。下面给出烧写的程序。
2 带有中断向量表的二次Bootloader的实现
第1节介绍了一般的二次Bootload过程,但当需要boot带中断向量表的程序时,需要仔细考虑3个重要文件的编程,否则将会遇到意想不到的后果。
2.1 配置文件Ink2.cmd
Ink2.cmd有了细微差别,此时有中断向量表,所以在分配时要考虑vectors的分配空间。在配置文件中差异主要在Memory中,section的部分如下:
SECTIONS
MEMORY的差别具体如下:
a) 没有考虑中断向量表配置的部分程序:
b) 考虑中断向量表配置的部分程序:
.vectors为中断向量表,其有0x200的长度的数据,必须放在0x90000000的地址处,.boot_load紧接着放置。
2.2 中断向量表文件vec.asm
还有一个很重要的一点是图2中vec.asm文件的变化。在调试程序时,中断向量表开始会直接跳到c_int00处,但是待烧写的前1 kB数据,首先要进行EMIF设置和搬移过程,所以其指向要发生变化。
vecter.asm部分程序如下:
a) 原程序的vecter.asm部分程序:
b) 产生Bootload数据的程序的vecter.asm部分程序:
以上程序中,程序a)开始是指向c_int00,程序b)为指向_boot,即.boot_load()的人口。这是因为在1 kB的程序复制完成后,程序即开始执行。首先应执行二次boot程序,即入口点_boot,完成二次boot后,再执行正常的初始化C语言环境代码,进而跳转到用户main函数。此时生成的.out的文件,通过hex6x.exe转化成可烧写的数据。
2.3 转换数据的配置文件boot.cmd
通过hex6x.exe可以把boot.out文件转化成boot.hex形式,方便烧写到Flash存储器中。此时Boot.cmd的也要做相应的变化,把中断向量表的程序同.boot_load程序,程序段,数据段一样转化过来。
boot.cmd配置程序如下:
a) 没有考虑中断向量表的boot.cmd配置:
b) 考虑中断向量表boot.cmd配置:
以上程序中len可以根据实际程序的长度进行修改,如果用hex6x.exe boot.cmd进行转化,程序长度过短时,会产生警告提示。此时可以查看map文件,看看程序和数据占用的空间来定len的大小,只要len大于实际的程序长度即可。Romwidth根据所用的Flash存储器的位数来定,如果是8位的就写8,如果是16位的就换成16。以上程序中,程序b)与程序a)不同的是加入了.vectors,使得生成的boot.hex文件中0x0000 0000地址就为vectors的程序。此时生成的*.hex的文件可以烧写到Flash中。
3 结束语
本文以TI公司高性能DSP TMS320C6000系列芯片为例,介绍了从Flash存储器进行引导,带中断向量表的二次Bootloader的新途径,其中对Bootloader的程序需要改写的部分详细叙述了具体的差别,从而为TMS320C6000系列DSP的开发提供了一种新的思路。该方法简单可行,在TI公司提供的文档上,只要稍做修改就可以得到正确的结果,该方法已在实际工程中得到具体应用,系统性能稳定。一般情况下中断向量表的首地址都为0x0000 0000,如果中断向量表没有设在0x0000 0000地址时,要对boot_c671x_2.s62文件中ISTP进行设置,此时vectors就不需要放在1 kB的数据中,而是在1 kB的程序空间中指向vectors的初地址。
(本文转自电子工程世界:
基于CPLD译码的DSP二次Bootloader方法
时间:2009-08-31 10:24:11 来源:电子设计应用 作者: 刘 伟,闫玉华 山东工商学院
随着数字信号处理技术的快速发展,数字信号处理器(DSP)越来越广泛地应用于各种实时嵌入式系统中。当系统调试完毕,想脱离仿真环境并在上电复位后自动启动程序代码运行时,必须将程序代码存储在非易失性存储器中。Flash存储器以其大容量和可在线编程等特点已成为DSP系统的一个基本配置。在系统上电复位后,DSP芯片内部固化的引导装载器(Bootloader)把应用程序从Flash引导到DSP芯片内高速 RAM中执行。这样既利用了外部存储器扩展DSP有限的ROM资源,又可以充分保证用户程序的全速运行[1-2]。
本文采用德州仪器公司的16位定点DSP芯片TMS320VC5509A(以下简称5509A),其PGE封装形式只有14根地址总线(A0~A13),最大只能寻址16KB的Flash存储器[3]。若要寻址更大地址空间,就需要控制Flash存储器的高位地址线。常见的解决方案是采用DSP的通用输入输出GPIO(General Purpose Input/Output)引脚来控制Flash的高位地址线,从而实现Flash存储器的分页访问[5-6]。然而,对于较大容量的Flash存储器,如本文采用的Am29LV800的容量为512K×16bit,有19根地址线[4],如果采用上述方法,硬件连接虽然简单,但会占用较多的GPIO引脚,而且以后的系统扩展也不方便。本文介绍了一种基于CPLD快速译码的DSP二次引导方法,利用CPLD的时序严格、译码速度快、可在线编程等特点,在 DSP的外部存储器接口EMIF(Exteral Memory Interface)的CE2空间模拟了一个Flash换页寄存器FPR(Flash Page Register),在上电复位后控制Flash的高位地址线,从而实现Flash的分页访问。因此,可通过二次bootloader程序修改FPR的值,控制Flash的高位地址线,将最终的应用程序加载到RAM中运行。
1 TMS320VC5509A的并行引导模式
1.1 5509A的引导模式
5509A的引导模式选择是通过4个模式选择引脚BOOTM[3:0]来配置的,BOOTM3~0引脚分别与GPIO0、3、2、1相连。5509A提供了六种引导模式,即EHPI引导模式、8位/16位并行EMIF引导模式、8位/16位标准串行口引导模式、SPI EEPROM引导模式、USB引导模式以及I2C E2PROM引导模式。本文采用16位并行EMIF引导模式,将BOOTM[3:0]设置为1011即可。
在16位并行EMIF引导模式下,DSP芯片内部固化的Bootloader程序上电复位后,首先从CE1空间首地址0x200000h处开始读取程序代码,并加载到RAM中运行。
1.2 5509A的引导表格式
程序代码以引导表的格式存储在Flash存储器中。引导表是独立于所选引导模式的一种特定的格式,包含了用户程序的代码段、数据段、段在RAM中的目标地址以及程序入口地址等其他相关信息。5509A引导表结构如表1所示。
DSP芯片内部固化的Bootloader的主要功能是将Flash中存储的引导表按一定顺序加载到 RAM中,然后跳转到32位程序入口地址开始执行。引导表文件可以通过TI公司提供的16进制转换工具生成,一般是hex格式,然后将此hex文件烧写到 Flash存储器中供Bootloader加载。
2 DSP二次Bootloader的原理及实现
由上述分析可知,DSP用户程序的并行加载过程是由DSP内固化的Bootloader实现的。由于5509A的PGE封装只有14根地址线,最多只能访问到16K×16bit地址空间。对于超过16KB的用户代码,Bootloader将不能加载全部的引导表文件。因此若要加载超过16K的用户代码,必须进行二次Bootloader。
基于CPLD译码的DSP二次Bootloader方法
时间:2009-08-31 10:24:11 来源:电子设计应用 作者: 刘 伟,闫玉华 山东工商学院
二次Bootloader的原理是由用户自行编写一个代码长度小于16KB的引导程序(以下简称 uboot),其功能与DSP内固化的Bootloader相同,用于加载最终的用户代码。在uboot程序中控制Flash存储器的高位地址线来访问 Flash的其他存储内容。这样,DSP上电复位后,Bootloader首先加载uboot并运行,然后uboot又加载最终用户代码,实现了大于 16K代码的二次引导。
2.1 DSP与Flash及CPLD的硬件接口
本文采用AMD的 Am29LV800作为DSP的外部存储器扩展。Am29LV800按8位方式访问,容量为1M字;按16位方式访问,容量为512K字。DSP外围电路逻辑译码及Flash高位地址线模拟由CPLD实现。Xilinx公司的XC9572XL是一款高性能的CPLD芯片,最高主频可达178MHz,包含了 72个宏单元,1 600个可用门电路,其TQFP封装有72个可用I/O引脚[7]。图1是5509A与CPLD及Flash之间的硬件接口设计原理图。
如图1所示,5509A的地址线A[13:1]与Flash的地址线A[12:0],A0未用。Flash存储器被映射到DSP的CE1空间,由片选线CE1经CPLD译码后选通。其中DSP的地址线A13和A[3:1]与CPLD接口,用于换页寄存器FPR的模拟。Flash存储器的BYTE引脚经上拉后接高电平,即按16位方式访问。
2.2 CPLD译码VHDL程序设计
目前DSP系统主频越来越高,运算速度越来越快,利用小规模逻辑器件译码的方式已不能满足DSP系统性能的需求。CPLD器件以其严格的时序、快速的译码、良好的可编程性成为DSP系统必不可少的部件之一。
本文利用CPLD的快速逻辑译码功能,模拟了一个FPR寄存器来控制Flash的高位地址线。VHDL语言源程序如下(篇幅有限,这里省略实体端口声明及中间信号定义):
begin
fce <=ce1;
foe <=aoe;
fwe <=awe;
h_addr <=a13;
l_addr <=a3&a2&a1;
datain <=d5&d4&d3&d2&d1&d0; //合并d0到d5到datain
facs <=′1′ when h_addr=′1′ //选通flash
and ce2=′0′
and l_addr='000'
else ′0′; //CE2 0x400000
FPR:process(facs,awe,reset)
begin
if reset=′0′ then
fa<=″000000″;
else if reset=′1′ then
if awe′event and awe=′1′ then
if facs=′1′ then
fa<=datain(5 downto 0);
end if;
end if;
end if;
end process;
dataout<=fa when aoe=′0′ and facs=′1′
else ″ZZZZZZ″;
d5 <=dataout(5);
d4 <=dataout(4);
d3 <=dataout(3);
d2 <=dataout(2);
d1 <=dataout(1);
d0 <=dataout(0);
fa18 <=fa(18);
fa17 <=fa(17);
fa16 <=fa(16);
fa15 <=fa(15);
fa14 <=fa(14);
fa13 <=fa(13);
end behaviour;
由上述VHDL程序可知,FPR寄存器被映射到了CE2空间的0x401000地址。其中引入A13及A[3:1]地址线的目的是为了便于以后的功能扩展,映射出更多的寄存器,如LCD控制寄存器、UART控制寄存器等。
FPR寄存器定义如表2所示。
FPR寄存器的第5~0位分别控制Flash的高位地址线A18~A13,第7~6位无效。当DSP 上电复位时,FPR寄存器的值被设置为全0,此时Flash的所有高位地址线均处于低电平状态,DSP开始访问Flash的最低8KB地址单元。复位结束,就可以对FPR寄存器写入值,改变Flash的高位地址,从而实现Flash的分页访问。这样Am29LV800 Flash的512K字存储空间相当于被划分为64页(0~63),每页8K字,当程序大于一页时,修改FPR,进行软件翻页,读入下一页Flash数据。也可以通过读FPR寄存器,了解当前高位地址线的状态,此时FPR寄存器与Flash的地址映射关系为:
Flash地址单元=(FPR<<13)+DSP地址线A[13:1]
2.3 二次Bootloader的实现
基于上述的设计和分析,要实现大程序的自动引导,可以采用二次Bootloader的方法。首先要设计一个uboot程序,大小不能超过一页。将 uboot程序烧写到Flash存储器的第0页,也就是DSP上电复位后被固化的Bootloader自行引导的那一页。uboot的主要功能是通过修改 FPR寄存器值,并按照引导表的格式读取Flash存储器的其他页程序到RAM中,最后跳转到用户程序的32位入口地址开始执行。uboot程序中,可以定义一个16位无符号整型指针变量,指向CE2空间的0x401000地址,即:
unsigned int*FPR=(unsigned int*) 0x401000;
若*FPR=1,即可以访问Flash的第1页。
在编写uboot程序和用户程序时,要对存储器空间重新分配,即在定义CMD文件时,要注意用户程序所占用的存储空间不能与uboot程序占用的存储空间重叠。因为uboot首先被加载运行,在运行时加载用户程序,也需要占用RAM地址空间。而且uboot程序代码长度不能超过一页。当烧写Flash时,必须将uboot程序烧写到Flash的第0页,然后将用户程序烧写到第一页或以后的存储空间中。
3 实验结果
以煤矿井下煤矸分界传感器为例,测试本文介绍的基于CPLD译码的DSP二次Bootloader方法。该传感器采集放煤时煤矸石振动信号,经AD转换后送入DSP经数字信号处理,分析得出煤矸石放落比例[8]。用户程序代码大小为23K字左右,显然不能够被固化的Bootloader正常加载,因此必须经过二次Bootloader。
将大小约2K字的uboot程序烧写到Flash第0页,用户烧写到第1~3页。经多次测试,该系统从上电复位到开始运行用户程序,耗时大约0.3s,而且系统运行稳定可靠。
本文介绍的基于CPLD快速译码的DSP二次Bootloader方法,利用CPLD器件的快速译码功能,模拟了一个换页寄存器,实现了大程序的上电后二次引导。与常见的利用GPIO换页的方法相比,本方法更有效,通用性更好,不会占用宝贵的GPIO资源,而且系统扩展方便,接口简单。
TMS320VC5509 的二次boot
发表于 2010 年 09 月 07 日 由 hulin 1,519 views
中低速的微处理器来说,系统运行时程序可直接从非易失性存储器读取并解释执行;对高速微处理器来说,非易失性存储器的读取速度较低,不能满足系统运行时程序代码直接读取的要求,需采用引导加载(Boot-load)方式将程序代码从低速非易失性存储器中加载到高速的存储器(如SRAM或DRAM)中,系统运行时直接从高速存储器中读取程序代码,实现系统的高速运行。因此引导加载是高速微处理器系统的关键技术之一。
一、 DSP上电加载分析
TMS320VC5509(简称“5509”)是TI公司的一款高性能、低功耗的定点数字信号处理芯片。5509片内具有128K字高速静态RAM,内部只读ROM中固化了引导加载程序(Bootloader)。5509支持多种引导加载方式,上电复位之后,片内引导程序根据不同的加载方式完成加载。
5509引导表格式如图1所示。
从引导表的格式可以看出,引导加载程序首先读入双字程序入口地址,然后读入需要修改的寄存器数,接着是寄存器地址以及赋值,再读入段字节数、段起始地址以及段内容,引导表以读入双字的O值为结束,读完引导表后跳转到加载程序入口执行。不论以何种方式加载,只是读入的方式不同,引导表的格式不变。
下面分别针对固化引导程序中的并行加载方式(16位)以及串行加载方式(16位SPI接口EEPROM),来分析DSP上电加载可能遇到的问题。
对16位并行加载方式,默认从片外扩展地址0×200000(5509对应片选引脚输出为CEl)开始读入引导表,由于TQFP封装的5509内部24根地址线只引出了14根,因此并行加载方式只能寻址外部214=16K字存储空间,对超过16K字长的引导表,引导程序无法加载。
对16位SPI接口的EEPROM串行加载方式,5509默认利用其同步串口0(McBSP0)来模拟SPI接口,引导程序固定收发时钟为DSP时钟频率的244分频。由于引导加载过程中,5509时钟频率等于外部晶振频率,因此对于24MHz时钟频率,加载频率约为100kHz,对于一段仅10K字长的引导程序,完成加载需要244×lO×103×16/24×106≈1.63s;即使工作在DSP最高主频144 MHz,完成加载也需要约244×10×103×16/144×105≈27l ms。这对要求上电后迅速运行的系统来说,系统启动时间过长。
针对以上两种加载方式存在的问题,提出了利用二次引导加载方式来解决的办法。
二次引导加载是采用引导加载的原理,在上电复位时,DSP内部固化的引导程序将一个自编的引导程序(即二次加载程序,其编写格式按照DSP内部固化引导程序的格式完成)加载到片内,然后通过二次引导加载程序将最终需要执行的程序加载到DSP中,从而实现更加灵活的程序加载。
二、并行方式下的二次加载设计
针对16位并行加载方式中存在的加载程序容量有限的问题,并行二次加载方案中利用DSP的GPIO口来扩展地址线,解决大于16K字程序的加载问题。这里使用一片flash芯片AM29LV800(512 K x 16-Bit)作为512K字外扩程序存储器,55509地址线A[13:1]与flash地址线A[12:0]相连,其余高位地址接在开发板上的CPLD芯片上,用作高位地址线与flash地址线A[18:1 3]相连。在二次引导加载程序中,利用软件控制CPLD的IO脚输出高低电平,来达到控制高位地址线的目的。CPLD IO脚电平的不同,相当于将512K字存储器空间划分为64页8K字空间,每当程序内容超过一页时,设置CPLD,实现软件翻页,读入下一页内容。
在程序加载过程中,由于并行二次引导加载程序对引导表的读入方式与固化引导程序相同(不同的地方,只是在于如何寻址大于16K字程序地址),因此省略了流程图中具体读引导表的步骤。
在二次加载程序中,加载开始之后,首先设置FA[18:13]为00h,读入第1页数据。如果程序在计数到8K之后仍未读完,则对FA[18:13]修改翻页,进行下一个8K的读入。如此,直到程序全部读完,跳转到程序入口执行为止。
三、下面给大家一个flash烧写程序。
#include "MaxBurn.H"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
#pragma DATA_SECTION(ProgramDat,".prgdat")
Uint16 ProgramDat[0xFFFF];
////////////////////////////////////////////////////////////////////////////////////////////////////////////
void EmifSetup(void)
{
EMIF_Config MyConfig = {
0x0010 /*EGCR*/, 0x0000 /*EMIRST*/,
/*(MTYPE<<12)|(RDSETUP<<8)|(RDSTROBE<<2)|(RDHOLD), cen1*/
/*(RDEXHLD<<14)|(WREXHLD<<12)|(WRSETUP<<8)|(WRSTROBE<<2)|(WRHOLD),cen2*/
/*(TIMOUT), cen3*/
(1<<12)|(1<<8)|(3<<2)|(1), /*ce01*/
(0<<14)|(0<<12)|(1<<8)|(3<<2)|(1), /*ce02*/
(0), /*ce03*/
(1<<12)|(10<<8)|(0x3f<<2)|(3), /*ce11*/
(3<<14)|(3<<12)|(15<<8)|(0x3f<<2)|(3), /*ce12*/
(100), /*ce13*/
(1<<12)|(15<<8)|(0x3f<<2)|(3), /*ce21*/
(3<<14)|(3<<12)|(15<<8)|(0x3f<<2)|(3), /*ce22*/
(200), /*ce23*/
(1<<12)|(1<<8)|(3<<2)|(1), /*ce31*/
(0<<14)|(0<<12)|(1<<8)|(3<<2)|(1), /*ce32*/
(0), /*ce33*/
0x07FF /*sdc1*/,
0x0FFF /*sdper*/,
0x07FF /*init*/,
0x03FF /*sdc2*/ };
EMIF_config(&MyConfig);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
main()
{
Uint32 i,j,n,FlashAddr;
Uint16 WordHgh;
//////////////////////////////////////////////////////////////////////////////////////////////////////////
CSL_init(); //初始化CSL库 call CSL_init() before calling any other CSL functions.
PLL_setFreq(20,2);
GPIO_RSET(IODIR,0x00FF); //全部输出
GPIO_RSET(IODATA,0x00FF); //全部高电平
CHIP_RSET(XBSR,0×0001); //External Bus Selection Register (EBSR),EMIF为全EMIF接口
CHIP_RSET(SYSR,5); //此语句不管用
EmifSetup();
printf(“*************************************************\n”);
printf(“***************版权所有,翻版必究!**************\n”);
printf(“**********如有疑问或不解,欢迎跟本人联系*********\n”);
printf(“**********email:hulin.1234@*********\n”);
printf(“*************************************************\n”);
//////////////////////////////////////////////////////////////////////////////////////////////////////////
////写入准备
for(i=0;i<0×8000;i++)
*(ProgramDat + i)=0×0000;
FlashReset();
FlashCs();
FlashChipErase();
FlashAddr = FlashSoftId(); //234B00BF
printf(“\nLoad data file please !\n”); //烧写二次boot的程序段
////请在下一语句上设置断点,必须运行下一个语句之前装载程序数据
//n = *(Uint16 *)(ProgramDat+0);
//n <<= 16;
//n += *(Uint16 *)(ProgramDat+1);
n=0×100;
//FlashAddr += FlashBlockErase(0×0000); //清除块,32KW,足够放下16KW的BOOT MAP 数据
for(i=0;i<= n ;i++){
WordHgh = *(ProgramDat+i);
//WordHgh=(*(ProgramDat + j)<<8)|(*(ProgramDat + j+1));
FlashWordProgram(i,WordHgh);
if((i%100)==99)printf(“.”);
}
FlashCs2();
n=0×1000; //程序长度 word
//FlashAddr += FlashBlockErase(0×0000); //清除块,32KW,足够放下16KW的BOOT MAP 数据
for(i=0;i<= n ;i++){
WordHgh = *(ProgramDat + i);
//WordHgh=(*(ProgramDat + j)<<8)|(*(ProgramDat + j+1));
FlashWordProgram(i,WordHgh);
if((i%100)==99)printf(“.”);
}
printf(“\nFinished Burning Flash ! , Verifying now \n”);
j=0;
for(i=0;i< n ;i++){
WordHgh = *(ProgramDat
展开阅读全文