原创 基于TMS320DM642的

2009-9-19 20:01 1874 3 3 分类: 处理器与DSP
作者:    时间:2007-08-23    来源: 
 
      

摘要:嵌入式dsp系统在独立运行时需要把用户代码从外部flash中加载到系统ram运行,包括了flash的编程及上电加载两项技术,是dsp系统开发中的重点和难点。本文采用一种在系统编程方法对flash编程,巧妙地利用jtag仿真器实现系统在线调试及编程,无需进行coff到hex的数据格式转换。

关键词:在系统编程;dsp;加载器

引言

一个完整的嵌入式系统必须要有一个合适的存储器存放用户代码。flash是一种非易失性存储器,而且具有电可擦写、容量大、价格便宜等特点,通常可用于在dsp系统中存放用户代码。

flash在正常使用前要进行编程,即将用户代码写入flash。在系统编程方法不需要其它编程设备和编程电源,只借助于仿真器,可直接通过dsp烧写程序对flash进行编程。本文所使用的编程方法就属于在系统编程。

本文首先介绍常见的flash编程方法,然后详细介绍本文方法的原理,以及dsp系统上电加载原理,最后给出整个实现过程并分析了flash编程时需要注意的一些问题。



图1 系统上电的工作步骤 图2 程序流程


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在运行时,运行的是最新加载的程序,也即文件2。其次,文件2与文件1映射到ram中的物理空间各自独立,也就是文件2不能映射到文件1已映射的地方,如果发生重叠,文件2的内容就会覆盖原先文件1映射到该地址空间的内容,写入flash的内容就会发生错误。再次,用户程序里包括了二次加载程序,以在自举时把用户程序从flash还原到ram中。


      总线周期     命令1 2 3 4 5 6 序列地址数据地址数据地址数据地址数据地址数据地址数据软件复位xxxf0          芯片擦除xxxaaxxx55xxx80xxxaaxxx55xxx10扇区擦除xxxaaxxx55xxx80xxxaaxxx55sa30字节写xxxaaxxx55xxxa0papd    表1 am29lv033c内存指令表

二次加载和bootloader

要保证用户程序的正确运行,仅把程序写入flash是不够的,必须保证上电后,程序能够从flash中正确恢复到ram。系统上电工作步骤如图1所示。

dsp首先自检,得到程序的加载模式。在c6000中主要有2种模式,一种是主机加载模式,也即dsp从0x0000 0000开始执行程序;另一种是rom加载模式,该模式又有8位、16位、32位几种,不同的dsp略有不同,这里选用8位rom模式。工作时,dsp先从地址0x9000 0000开始,把0x9000 0000~0x9000 0400这1k(在c62xx中是64k)的数据搬到0x0000 0000~0x0000 0400,然后再从0x0000 0000开始执行程序。这一次加载由dsp自行完成,但是1k的程序作为用户程序显然不够,因此,这1k的程序要做成加载器,也就是手工写的bootloader,利用它把用户程序从flash搬入ram。加载器搬运用户程序又是一次加载,因此把这个过程统称为二次加载。

bootloader要完成两项功能,第一,把其它程序搬到指定的地址;第二,跳转到用户程序入口,这里要先修改isp,再跳转到复位中断,因此在bootloader的最后总是一条跳转指令。由于bootloader在flash中的位置是0x9000 0000~0x9000 0400,而bootloader又是放在用户程序里的,因此,为了方便烧写程序把bootloader写到该位置,这里在用户程序的.cmd文件中把bootloader定位在程序段的起始位置。


编程方法实现

系统配置和参数设置

tms320dm642是ti公司的一款视频图像dsp,工作时钟最高可达到600mhz。程序存储器最大可调至272m×8位,其emif接口分4个空间,即ce0~ce3。flash映射到ce1空间,其地址为0x90000000~0x90400000,上电时采用8位rom加载方式。

am29lv033c是amd公司生产的flash存储器,其主要特点有:3.3 v单电源供电,可使内部产生高电压进行编程和擦除操作;只需向其命令寄存器写入标准的微处理器指令,具体编程、擦除操作由内部嵌入的算法实现,并且可以通过查询特定的引脚或数据线监控操作是否完成;可以对任一扇区进行读、写或擦除操作,而不影响其它部分的数据。

由于4mb的flash rom有22根地址线,而dm642只有20根地址线,因此加入fpga,对flash进行分页,这里共分8页,每页512kb,每页内含8块,每块64kb。

am29lv033c有多条内存指令,可以实现芯片id的读取、软件复位、整片擦除、块擦除等。在这里主要介绍烧写时用到的指令,其擦写命令如表1所示。表中的xxx表示任意地址,sa为块地址,即地址线的第16位到21位,pa为烧写地址,pd为烧写数据。

待烧写程序(用户程序)为user.out,大小为2m;烧写程序为fbct.out,大小为4k,地址分配如表2所示。

编程过程

第一步,对整个flash进行一遍擦除。因为flash在编程时只能把“1”置为“0”,而不能把“0”置为“1”。

第二步,判断擦除结束。通过dq6、dq7均可完成判断,当dq6位不再跳变时说明擦除结束。这里通过读取最后一位数据是否为“0xff”来完成判断。

第三步,进行软件复位。软件复位使flash处于就绪状态,当flash在进行擦除、编程时软件复位信号无效。

第四步,取得编程地址。如果地址超过最大地址则编程结束。

 开始地址长度写入flash的开始地址user.out0x800000002m0x9001 0000bootloader0x0000 00001k0x9000 0000fbct.out,0x300000004k--
表2 程序的地址分配

注意事项

对于不同的dsp,不同的flash,在实现时可能不一样,这里有几个问题必须注意:
(1) 文件1和文件2的.cmd文件要分配好各自的地址,地址空间不能重叠。
(2) 不是每个dsp都可以实现在系统编程,如tms320c6204就不行,而c621x,c64x等就可以。原因在于flash在编程时速度较慢,一般为ms级,所以需要we#信号的有效时间较长。但是,一般的we#有效时间都只有几十ns,这么短的时间不足以让dsp把内容写进flash。c64x等之所以能实现在系统编程,是因为在编程时dsp自动延长了编程的有效时间。
(3) 如果用户程序中不含加载器程序,那么用户程序的目的地址就不能从flash的前1k地址开始。
(4) 不同型号flash的编程时序和指令可能会有所不同,编程之前要弄清该flash的编程时序和指令。如果flash要求有偏移地址,就需要加上基地址。
(5) 对于程序的未初始化段不必烧入flash,可以参考.map文件,里面对于各段有详细说明。

结语

利用上面的方法,本文在tms320dm642平台中通过jtag仿真头,成功地实现了在系统编程,为程序的调试提供了一种非常方便的手段,也为用户程序的升级提供了一种简单易行的方法,同时这个方法也在c6211环境下成功实现,其它dsp同样可参考本方法。■

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条