out文件转换Hex文件操作步骤
- 格式:pdf
- 大小:108.13 KB
- 文档页数:3
第一讲VC33的电源设计这里主要结合实际项目来讲解VC33的最小系统设计,这一讲为电源电路设计,主要分为一下几个部分进行:DSP系统需要的电源种类DSP系统电源供电的特殊要求:上电次序数字/模拟混合系统电源处理方法电源电路设计及器件选型电源在PCB设计时的一些注意事项1、给TI DSP供电TI DSP有5类典型电源引脚:CPU核电源引脚I/O电源引脚PLL电路电源引脚Flash编程电源引脚(仅C2000系列DSP有)模拟电路电源引脚(仅C2000系列DSP有)2、上电次序CPU内核先于I/O上电,后于I/O掉电(TMS320F281X例外,刚好相反)CPU内核与I/O供电应尽可能同时,二者时间相差不能太长(一般不能>1s,否则会影响器件的寿命或损坏器件)为了保护DSP器件,应在内核电源与I/O电源之间加一肖特基二极管3、数字与模拟部分单独供电最后通过磁珠接在一点即可4、电源电路设计主要的考虑因素用哪种类型的电源器件:转换效率、成本和空间输入电压输出电压(输出电压是否可调、输出电压的路数)输出电流控制/状态:EN控制、PowerGood状态5、电源器件选型这里列出一些常用的LDO,供大家在设计时选择双路输出输入电压输出电压输出电流辅助功能TPS767D318: 5V 3.3V/1.8V 1A/1A ENTPS767D301: 5V 3.3V/可调 1A/1A EN单路输出TPS76333: 5V 3.3V 150mA ENTPS76801: 5V 可调 1A EN、PGTPS75701: 5V 可调 3A EN、PGTPS75501: 5V 可调 5A EN、PG我在做VC33设计中用到的电源器件是双路输出的TPS767D318。
实际中的连接电路大家可以参照Datasheet。
6、电源在PCB时的注意事项数字地、模拟地分开,单点连接强烈推荐采用多层板,为电源和地分别安排专用的层同层上的多个电源、地用隔离带分割每个电源引脚附近放置10~100nF旁路滤波电容,以平滑电源的波动在PCB四周均匀分布一些4.7~10uF大电容旁路电容一般采用瓷片电容好了,第一讲就结束了,希望大家对DSP的电源设计有一个比较深的认识,第二讲为复位监控及时钟电路设计,敬请关注!第二讲VC33的复位监控及时钟电路设计一、复位监控电路设计为了使系统被复位信号正确地初始化,复位信号的脉冲宽度必须至少10 个 H1周期以上(即当C3x 运行于33.33MHz 时需要600ns)。
DSP常见问题解答如何选择外部时钟?DSP的内部指令周期较高,外部晶振的主频不够,因此DSP大多数片内均有PLL。
但每个系列不尽相同。
1)TMS320C2000系列:TMS320C20x:PLL可以÷2,×1,×2和×4,因此外部时钟可以为5MHz-40MHz。
TMS320F240:PLL可以÷2,×1,×1.5,×2,×2.5,×3,×4,×4.5,×5和×9,因此外部时钟可以为2.22MHz-40MHz。
TMS320F241/C242/F243:PLL可以×4,因此外部时钟为5MHz。
TMS320LF24xx:PLL可以由RC调节,因此外部时钟为4MHz-20MHz。
TMS320LF24xxA:PLL可以由RC调节,因此外部时钟为4MHz-20MHz。
2)TMS320C3x系列:TMS320C3x:没有PLL,因此外部主频为工作频率的2倍。
TMS320VC33:PLL可以÷2,×1,×5,因此外部主频可以为12MHz -100MHz。
3)TMS320C5000系列:TMS320VC54xx:PLL可以÷4,÷2,×1-32,因此外部主频可以为0.625MHz-50MHz。
TMS320VC55xx:PLL可以÷4,÷2,×1-32,因此外部主频可以为6.25MHz-300MHz。
4)TMS320C6000系列:TMS320C62xx:PLL可以×1,×4,×6,×7,×8,×9,×10和×11,因此外部主频可以为11.8MHz-300MHz。
TMS320C67xx:PLL可以×1和×4,因此外部主频可以为12.5MHz-230MHz。
基于单片机的Flash在系统编程方法一个完整的嵌入式系统必须要有一个合适的存储器存放用户代码。
Flash是一种非易失性存储器,而且具有电可擦写、容量大、价格便宜等特点,通常可用于在DSP系统中存放用户代码。
Flash在正常使用前要进行编程,即将用户代码写入Flash。
在系统编程方法不需要其他编程设备和编程电源,只借助于仿真器,可直接通过DSP烧写程序对Flash进行编程。
本文所使用的编程方法就属于在系统编程。
本文首先介绍常见的Flash编程方法。
然后详细介绍本文方法的原理,以及DSP系统上电加载原理,最后给出整个实现过程并分析了Flash变成时需要注意的一些问题。
Flash编程方法常见的Flash编程方式Flash 在正常使用前必须写入用户程序,传统上有3种编程方法:由供应商出货前把程序代码写入Flash,编程器编程和在系统编程。
第1种方法不能满足用户更改代码的需求,所以在开发阶段不宜采用。
当使用编程器编程时,要求Flash固定在PCB板前必须把用户程序写入片内。
因此,现在一般都优先考虑在系统编程方法,首先应确定所选的DSP是否支持在系统编程。
现行的在系统编程的方法一般是先把待加载程序(用户程序)的.out文件(COFF格式)转成HEX格式,然后去掉HEX格式文件的文件头,再通过烧写程序写到Flash里去,也可以不进行COFF格式到HEX格式的转换这一步,把COFF文件作为源文件,去除文件头信息后将其写入Flash。
本文方法的编程原理本文的实现方法比较简单,首先把用户程序映射到系统RAM,再把用户程序作为数据直接从RAM搬入Flash中。
首先在CCS上完成用户程序,生成可执行的.out文件,将该文件设为文件1进行加载;然后加载烧写程序的.out文件,将其设为文件2;最后运行文件2,通过它把文件1烧入Flash。
操作步骤非常简单,这里要说明几点,首先,2个.out文件各自独立,文件2加载后,文件1成为数据,CCS在运行。
ti txt out hex格式原理
文本输出转化为十六进制格式(hex format)的过程,主要是将文本中的每个字符转化为十六进制的数字表示。
这个过程涉及到字符编码和十六进制编码的转换。
1. 字符编码:文本是由一个个的字符组成的,每个字符都有一个对应的编码。
例如,字母'A'的编码是65,'B'的编码是66,'a'的编码是97,'b'的编码是98等等。
这些编码是按照一定的规则分配的,保证了每个字符都有唯一的编码。
2. 十六进制编码:十六进制是一种数制,它使用16个不同的符号来表示数值。
这16个符号包括0-9(表示0-9)和A-F(表示10-15)。
十六进制的数值范围是0-FFFF(或者说0-65535)。
当我们将文本转化为十六进制格式时,每个字符的ASCII码(或者Unicode码)会被转化为对应的十六进制数。
例如,字母'A'的ASCII 码是65,它在十六进制下表示为"41";字母'B'的ASCII码是66,它在十六进制下表示为"42";以此类推。
因此,将文本输出转化为十六进制格式的过程就是将每个字符的编码转化为十六进制的编码。
这个过程可以通过编程实现,例如在Python中,可以使用内置的函数`ord()`(获取字符的ASCII码)和`hex()`(将十进制数转化为十六进制)来实现。
IAR编译ZStack-CC2530,生成HEX文件完全配置IAR编译ZStack-CC2530为可下载运行的HEX文件的正确配置:1. 正确配置输出文件格式:菜单选择Project-Options-Linker-Output-Format,选择Other。
右边的Output下拉框 选intel-extended,Format variant 下拉框选None,Module-local下拉框选Include all2.还是在菜单Project-Options-Linker-Output标签中,勾上Override default选项,把编辑框中的文件名的后缀改为hex以上两步都是大多数人熟知的,下面这一步是针对大型程序编译下载所必须的,也是大部分写zstack教程的人所没有提到的。
3. 找到f8w2530.xcl文件,并打开。
(这个文件在"Projects/zstack/Tools/CC2530DB/"目录下,也可以通过IAR编 译环境的左侧Workspace窗口点开Tools文件夹看到)在f8w2530.xcl文件中找到两行被注释掉的语句://-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_B ANK_ADDR)]*///_NR_OF_BANKS+_FIRST_BANK_ADDR=0x8000把这两行前面的"//"去掉,保存,重新编译,OK!(注: 去掉这两行的"//"后在编译输出成hex格式时没有问题,但在debug模式下编译会提示警告:Warning[w69]: Address translation (-M, -b# or -b@) has no effect on the output format 'debug'. The output file will be generated but noaddress translation will be performed. 不过并不会影响debug调试的使用。
TI C2000系列串口烧写Flash总结TI提供了多种方式可以对C2000系列DSP的Flash进行编程,参见TI文档《针对TMS320F28xxx DSC 的闪存编程解决方案》。
其中最常见的就是通过JTAG方式,但有时产品装在现场,有空间或其它诸多因素的限制,这种方式过于繁琐,效率低下。
因此,设计人员不得不考虑别的方式,其中,通过串口(SCI)是最常用、最容易实现的方式。
目前,通过串口烧写Flash有两种方法:SDFlash软件和C2Prog软件,下面分别描述。
1 通过SDFlash软件SDFlash软件是Spectrum Digital公司出品的程序下载软件,该公司应该是TI 第三方合作公司。
该公司还生产仿真器、eZdsp实验板以及DMC1500电机控制板等产品。
应用该方法的具体步骤如下:1.1 安装CCS建议安装CCS3.3或更高版本,将你的项目文件编译为可以对Flash编程的.out 文件,如何制作可以参见本文末节。
1.2 安装串口编程算法项目文件文件名称:sdf28xx_v3_0_serial.exe ,可以从Spectrum Digital公司网站上下载(注意这里不是TI网站,记得当时在TI网站上找了好久也没找到),安装时按默认路径。
安装完以后,桌面及程序列表里不会出现相关文件。
1.3 安装SDFlash软件文件名称:类似于SetupCCSPlatinum_v30xxx.exe,从Spectrum Digital公司网站上下载或者百度。
安装路径默认。
安装完后桌面上会出现如下图标,启动软件方式后面介绍。
图11.4 编辑sdopts.cfg文件点击图1中的文本文件,打开编辑,如是Win7系统的以管理员运行,否则会提示无权限保存。
此文件存放在你所安装的windows的System32目录下。
(1)用记事本的方式打开(2)在"# End of sdopts.cfg”前加入如下文本:[EmulatorId=C1]EmuPortAddr=0xC1EmuPortMode=RS232EmuProductName=SERIAL_FLASH[EmulatorId=C2]EmuPortAddr=0xC2EmuPortMode=RS232EmuProductName=SERIAL_FLASH[EmulatorId=C3]EmuPortAddr=0xC3EmuPortMode=RS232EmuProductName=SERIAL_FLASH[EmulatorId=C4]EmuPortAddr=0xC4EmuPortMode=RS232EmuProductName=SERIAL_FLASH意思应该是加入串口启动选择。
Microcomputer Applications V ol.27,No.10,2011开发应用微型电脑应用2011年第27卷第10期3文章编号:1007-757X(2011)10-0043-04一种DM642外部NOR FLASH 分页操作与程序烧写自启动方法向伟,李波摘要:在TMS320DM642芯片被广泛应用的数字多媒体处理领域,对于主处理器外部扩展大容量程序存储器的需求十分迫切,而该芯片自身具有的外部程序存储器控制机制,却不能直接支持外部大容量程序存储器的操作。
针对这一问题,设计并实现了通过CPLD 对TMS320DM642外部大容量NOR FLASH 的分页控制,并在此基础上不依靠FLASHBURN 软件,直接在CCS 环境下对TMS320DM642外部大容量FLASH 芯片进行程序烧写的方法,最终实现了使TMS320DM642由外部大容量NOR FLASH 自启动的目标,为TMS320DM642在大程序项目中的应用,提供了一种方便而又通用的可行方案。
关键词:DM642;NOR FLASH;分页操作;程序烧写;自启动中图分类号:TP311文献标志码:A0引言TMS320DM642[1]是TI (德州仪器)公司推出的一款高性能定点数字信号处理器。
该芯片内部集成TMS320C64xDSP 核,在600MHz 主频下,峰值处理能力可达到4800MIPS 。
另外,该处理器采用V elociTI 指令结构,可在一个时钟周期内执行8条32位字长的指令[2]。
其强大的运算能力足以支持CIF 格式实时视频的H.264编码运算。
该芯片由于具有高性能、体积小和功耗低的优点而在数字多媒体处理领域得到了广泛应用。
当前,人们对于数字多媒体处理终端的移动和便携性能要求日益提高,这就要求所设计的终端产品具有完全的脱机运行的能力。
要实现这一目标,就需要掌握对外部程序存储器的控制,程序的烧写以及系统上电自启动功能的实现这几项关键技术。
Date:2007-10-10SEED-DEC6713调试总结作者:Edward Chen 部门:Product摘要总结了调试SEED-DEC6713的常见问题。
目录:1、使用SEED-XDSUSB2.0调试DEC6713为何无法进入CCS,出现报错提示?需要加SEED-JTAGACK转接头,主要增加JTAG信号电平驱动能力,在SEED-XDSUSB2.0附件里面有。
2、烧写程序之后不能访问CCS可以尝试点击CCS出错界面的Retry,并同时按板卡上的复位按钮;或通过跳线JP8.JP9来使能HPIboot来进入CCS3、新的codec程序不能调试通过库文件的问题,需要更新的dec6713_edma_aic23_l67.l67、DEC6713BSL.lib2个文件4、DEC6713的Flash烧写1.已经用ram调试好的程序原来程序所用的cmd文件2.在已有的文件中加入二次boot的程序,并替换原有的cmd文件,注意用到中断表的,仍然用原来的中断表。
然后重新编译生成.out文件,Boot用的cmd文件3.二次boot程序,注意“entry point”和“copyTable”。
详细的描述请参照:《Creating a Second-Level Bootloader for FLASH Bootloading on C6000》A;; ======== boot_c671x.s62 ========;.title "Flash bootup utility".option D,T.length 102.width 140; global EMIF symbols defined for the c671x family.include boot_c671x.h62.sect ".boot_load".global _boot.global _text_size.global _text_ld_start.global _text_rn_start.ref _c_int00_boot:;************************************************************************;* DEBUG LOOP - COMMENT OUT B FOR NORMAL OPERATION;************************************************************************ zero B1_myloop: ; [!B1] B _myloopnop 5_myloopend: nop;************************************************************************ ;* CONFIGURE EMIF;************************************************************************ ;**************************************************************** ; *EMIF_GCTL = EMIF_GCTL_V;;**************************************************************** mvkl EMIF_GCTL,A4|| mvkl EMIF_GCTL_V,B4mvkh EMIF_GCTL,A4|| mvkh EMIF_GCTL_V,B4stw B4,*A4;**************************************************************** ; *EMIF_CE0 = EMIF_CE0_V;**************************************************************** mvkl EMIF_CE0,A4|| mvkl EMIF_CE0_V,B4mvkh EMIF_CE0,A4|| mvkh EMIF_CE0_V,B4stw B4,*A4;**************************************************************** ; *EMIF_CE1 = EMIF_CE1_V (setup for 8-bit async);**************************************************************** mvkl EMIF_CE1,A4|| mvkl EMIF_CE1_V,B4mvkh EMIF_CE1,A4|| mvkh EMIF_CE1_V,B4stw B4,*A4;**************************************************************** ; *EMIF_CE2 = EMIF_CE2_V (setup for 32-bit async);**************************************************************** mvkl EMIF_CE2,A4|| mvkl EMIF_CE2_V,B4mvkh EMIF_CE2,A4|| mvkh EMIF_CE2_V,B4stw B4,*A4;**************************************************************** ; *EMIF_CE3 = EMIF_CE3_V (setup for 32-bit async);****************************************************************|| mvkl EMIF_CE3,A4|| mvkl EMIF_CE3_V,B4 ;mvkh EMIF_CE3,A4|| mvkh EMIF_CE3_V,B4stw B4,*A4;****************************************************************; *EMIF_SDRAMCTL = EMIF_SDRAMCTL_V;**************************************************************** || mvkl EMIF_SDRAMCTL,A4|| mvkl EMIF_SDRAMCTL_V,B4 ;mvkh EMIF_SDRAMCTL,A4|| mvkh EMIF_SDRAMCTL_V,B4stw B4,*A4;****************************************************************; *EMIF_SDRAMTIM = EMIF_SDRAMTIM_V;**************************************************************** || mvkl EMIF_SDRAMTIM,A4|| mvkl EMIF_SDRAMTIM_V,B4 ;mvkh EMIF_SDRAMTIM,A4|| mvkh EMIF_SDRAMTIM_V,B4stw B4,*A4;****************************************************************; *EMIF_SDRAMEXT = EMIF_SDRAMEXT_V;**************************************************************** || mvkl EMIF_SDRAMEXT,A4|| mvkl EMIF_SDRAMEXT_V,B4 ;mvkh EMIF_SDRAMEXT,A4|| mvkh EMIF_SDRAMEXT_V,B4stw B4,*A4;**************************************************************************** ; copy sections;**************************************************************************** mvkl copyTable, a3 ; load table pointermvkh copyTable, a3copy_section_top:ldw *a3++, b0 ; byte countldw *a3++, b4 ; load flash start (load) addressldw *a3++, a4 ; ram start addressnop 2[!b0] b copy_done ; have we copied all sections?nop 5copy_loop:ldb *b4++,b5sub b0,1,b0 ; decrement counter[ b0] b copy_loop ; setup branch if not done[!b0] b copy_section_topzero a1[!b0] and 3,a3,a1stb b5,*a4++[!b0] and -4,a3,a5 ; round address up to next multiple of 4[ a1] add 4,a5,a3 ; round address up to next multiple of 4;**************************************************************************** ; jump to entry point;**************************************************************************** copy_done:B0_c_int00,mvkl.S2mvkh .S2 _c_int00, B0b .S2 B0nop 5copyTable:count;; flash start (load) address; ram start (run) address;; .text.word _text_size.word _text_ld_start.word _text_rn_start;; end of table.word 0.word 0.word 04.烧写用的cmd文件,详细地说明请参照《TMS320C6000 Assembly Language Tools User's Guide》5.编译生成的out转换成hex的方法,注意out文件的名称要与cmd文件相同使用ccs带的hex6x.exe,配合上面的cmd文件,注意使用方法执行语句后的结果生成boot.hex和boot.map6.flashburn的使用方法如图:如果没有显示FBTC Version ID:1.00000,download 一下FBTC就可以了,然后执行擦除烧写7.对flash操作的程序:Cmd文件,注意与硬件板卡对应《Process FlashBurn Target Component commands for FBTC6713》/********************************************************************** (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 2000-2002 * FBCmd.c -- Process FlashBurn Target Component commandsFBTC6713* for*//* Change Log:***/#define DBPRINT 0#include "type.h"#include "c6713dsk.h"#include "FBTC6713.h"#include "FBCmd.h"#include <stdio.h>/* -------------* Globals* -------------*//* -------------* Local statics* -------------*//* ----------------* Local prototypes* ----------------*/static void SendVersionID(void);void doCommand(void){u16 cmd = GetCmd();#if DBPRINT == 1printf("CMD: %x", cmd);#endif/* Dispatch to a command handler. Handle* simple stuff here.*/switch(cmd){case 0x0000: /* NOP */break;case 0x0001: /* QUERY PROTOCOL VERSION */SetErrorBits(CMDOK);GetProtocolVersionID());SendI2ToHost(cmd,break;case 0x0002: /* QUERY STATUS */#if DBPRINT == 1if(DBPRINT) printf(" Status: %x", GetProtocolStatusWord());#endifGetProtocolStatusWord());SendI2ToHost(cmd,break;case 0x0003: /* ERASE FLASH */InitFlash();SetErrorBits(CMDOK);EraseFlash();break;case 0x0004: /* Query FlashStart Addr */(unsigned long)GetFlashBase());SendI4ToHost(cmd,break;case 0x0005: /* Read 1 Flash loc */#if DBPRINT == 1if(DBPRINT) printf(" ARGS: %x %x", GetArgVal(0), GetArgVal(1));#endifSendI1ToHost(cmd, GetFlashVal((unsigned long)GetFlashBase() + ShortsToULong(GetArgVal(0), GetArgVal(1))));break;case 0x0006: /* Read a block of flash memory */#if DBPRINT == 1printf(" ARGS: %x %x %x",GetArgVal(0), GetArgVal(1), GetArgVal(2));#endifSetErrorBits(CMDOK);SendFlashBufToHost(cmd, (unsigned long)GetFlashBase() + ShortsToULong(GetArgVal(0), GetArgVal(1)), GetArgVal(2));break;case 0x0007: /* Write data to flash */#if DBPRINT == 1printf(" ARGS: %x %x %x", GetArgVal(0), GetArgVal(1), GetArgVal(2));#endiflong)GetFlashBase() + ShortsToULong(GetArgVal(0),*)((unsignedSetFlashAddr((u8GetArgVal(1))));SetErrorBits(CMDOK);GetArgVal(2));BurnFlash(GetData(),break;case 0x0008: /* More data */#if DBPRINT == 1printf(" ARG: %x", GetArgVal(0));SetErrorBits(CMDOK);GetArgVal(0));BurnFlash(GetData(),break;case 0x0009: /* Respond with current flash data checksum */#if DBPRINT == 1printf(" ARGS: %x %x %x %x\n", GetArgVal(0), GetArgVal(1), GetArgVal(2), GetArgVal(3));#endifSetErrorBits(CMDOK);CKSSet(0);SendI2ToHost(cmd,(u16)CKSAccumBuf((unsigned char *)((unsigned long)GetFlashBase() + ShortsToULong(GetArgVal(0), GetArgVal(1))),ShortsToULong(GetArgVal(2), GetArgVal(3))));break;case 0x000a: /* Accept User Data* Simply accept & toss data.* I use this for timing tests.* It could contain your own proprietary* commands or data, sort of an escape* sequence.*/#if DBPRINT == 1printf(" ARG: %x", GetArgVal(0));#endifSetErrorBits(CMDOK);/* (Don't do anything with the data)*/break;case 0x000b: /* QUERY FLASHSIZE V ALUE */SetErrorBits(CMDOK);GetFlashSize());SendI4ToHost(cmd,break;case 0x000c: /* Change FLASH Start Address */#if DBPRINT == 1printf(" ARGS: %x %x", GetArgVal(0), GetArgVal(1));#endifSetErrorBits(CMDOK);GetArgVal(1)));SetFlashBase(ShortsToULong(GetArgVal(0),break;case 0x000d: /* Change Flash Size */#if DBPRINT == 1printf(" ARGS: %x %x", GetArgVal(0), GetArgVal(1));SetErrorBits(CMDOK);SetFlashSize(ShortsToULong(GetArgVal(0), GetArgVal(1)));break;case 0x000e: /* Query FBTC Version ID */SetErrorBits(CMDOK);SendVersionID();break;case 0x000f: /* QUERY EDIT CAPABILITY */SetErrorBits(CMDOK);EDITFLASHPERMIT);SendI2ToHost(cmd,break;case 0x0010: /* QUERY MAX DATA BLOCK SIZE (BYTES)*/SetErrorBits(CMDOK);MAXDATABYTES);SendI2ToHost(cmd,break;default:1#if==DBPRINT***");UNKNOWN!printf("***#endifbreak;}#if DBPRINT == 1printf("\n");#endif}/* Send my version ID back to the Host.*/static void SendVersionID(){StoreCmd(0x000e); /* response to this command */FBTCVersionMajor); /* Arg0 */StoreArg(0,StoreArg(1, FBTCVersionMinor); /* Arg1 */}<FlashBurn Programming Functions for FBTC6713>注意:不通的flash对应得key值不同********************************************************************* * (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 2000-2002* FlashBurn Programming Functions* for FBTC6713*//**/#include <stdio.h>#include "type.h"#include "c6713dsk.h"#include "FBTC6713.h"#include "FBCmd.h"prototypeLocal/**/static GetFlashBuf(u8 *dest, u8 *flashsrc, u16 nBytes);/* Used by the checksum calc functions*/static volatile unsigned long cksum = 0;/* flashstart/next are used to track* where we are in a "flat" Flash memory.* Paging, etc. are handled by helper* funcs.*/static volatile u8 *flashstart = (volatile u8 *)FLASH_START;static volatile u8 *flashnext = (volatile u8 *)FLASH_START;/* These are "override" values, in case the* Host has sent new flash base addr and size.* flashbaseov is 0xffffffff normally, but changes* if Host sends the Change FLASHSTART Address command.* Thus if it's not 0xffffffff, then it should be used* instead of the FLASH_START value.*/static volatile u8 *flashbaseov = (u8 *)0xffffffffUL;static unsigned long flashsizeov = 0xffffffffUL;/* Set and get the flash base address*/void SetFlashBase(unsigned long val){flashbaseov = (volatile u8 *)val;}volatile u8 *GetFlashBase(void){return flashbaseov != (volatile u8 *)0xffffffffL ?flashbaseov :(volatile u8 *)FLASH_START;}/* Set and get the flash size*/void SetFlashSize(unsigned long val){val;=flashsizeov}unsigned long GetFlashSize(void){return flashsizeov != 0xffffffffL ? flashsizeov : FLASH_SIZE;}void InitFlash(void){flashstart = GetFlashBase();flashnext = flashstart;}void SetFlashAddr(u8 *addr){flashstart = (volatile u8 *)addr;flashnext = flashstart;}volatile u8 *GetNextFlashAddr(void){returnflashnext;}/* Burns flash data, starting at flashnext.* This embodies the burning algorithm for the* AMD29LV400B flash memory used on 6713 DSK*/void BurnFlash(u8 *data, u16 nBytes){timeout;u16c;u8while(nBytes--){/* Prep AMD* 4MBit (256K X 16) Flash Memory* for writing a byte. Only low byte is written.*/*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1; //AAH*(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2; //55H*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY3; //A0H*data;*flashnext=/* Spin here 'til programming completes*/*data++;c=0;timeout=1;+=timeoutdowhile(*flashnext != c && timeout < (u16)0xffff);flashnext++;}}/* The Flash Erase function uses* the AMD algorithm to erase the* entire chip.*/void EraseFlash(void){/* Code to erase AMD29LV400B* 4MBit (256K X 8) Flash Memory*/*(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1; //AAH *(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2; //55H *(volatile char *)FLASH_ADR1 = (char)FLASH_KEY4; //80H *(volatile char *)FLASH_ADR1 = (char)FLASH_KEY1; //AAH *(volatile char *)FLASH_ADR2 = (char)FLASH_KEY2; //55H *(volatile char *)FLASH_ADR1 = (char)FLASH_KEY5; //10H /* Spin here 'til erasing completes*/while(GetFlashVal(FLASH_START) != 0xff);/* Do Nothing!*/return;}void CKSSet(u16 val){cksum = val;}u16 CKSGet(void){(u16)cksum;return}u16 CKSAccumBuf(unsigned char *buf, unsigned int len){0)>while(len--{*buf++;cksum+=if(cksum > (unsigned long)0x0000ffff){cksum += 1;long)0x0000ffff;(unsigned&=cksum}}(u16)cksum;return}u8 GetFlashVal(unsigned long addr){/* Set External Flash for byte-addressability */*(unsigned volatile int *)EMIF_CE1 = CE1_8; /* EMIF CE1 control, 8bit async */ return *(u8 *)addr ;}void SendFlashBufToHost(u16 cmd, unsigned long addr, u16 bytecount){u8 *pflash = (u8 *)addr;u16 n = bytecount > 256 ? 256 : bytecount;StoreCmd(cmd);bytecount);StoreArg(0,n);pflash,GetFlashBuf(GetData(),}static GetFlashBuf(u8 *dest, u8 *flashsrc, u16 nBytes){/* Set External Flash for byte-addressability */*(unsigned volatile int *)EMIF_CE1 = CE1_8; /* EMIF CE1 control, 8bit async */ memcpy(dest, flashsrc, nBytes);}正文:参考文档:。