>
摘要:嵌入式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 | ||||||
序列 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 | 地址 | 数据 |
软件复位 | XXX | F0 | ||||||||||
芯片擦除 | XXX | AA | XXX | 55 | XXX | 80 | XXX | AA | XXX | 55 | XXX | 10 |
扇区擦除 | XXX | AA | XXX | 55 | XXX | 80 | XXX | AA | XXX | 55 | SA | 30 |
字节写 | XXX | AA | XXX | 55 | XXX | A0 | PA | PD |
编程方法实现
系统配置和参数设置
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.out | 0x80000000 | 2M | 0x9001 0000 |
bootloader | 0x0000 0000 | 1K | 0x9000 0000 |
FBCT.out, | 0x30000000 | 4K | -- |
结语
利用上面的方法,本文在TMS320DM642平台中通过JTAG仿真头,成功地实现了在系统编程,为程序的调试提供了一种非常方便的手段,也为用户程序的升级提供了一种简单易行的方法,同时这个方法也在C6211环境下成功实现,其它DSP同样可参考本方法。■