TMS320VC5410分页烧写Flash的多页程序并行自举
ti公司的dsp芯片tms320vc5410(简称5410)是性能卓越的低功耗定点dsp,在嵌入式系统中有着广泛的应用。5410没有自带的片上非易失性存储器,因此需要外部的非易失性存储介质,如eprom或flash,来存储程序和数据。5410片内有64k字ram。由于在片内ram运行程序比片外运行有高速度低功耗等显著优点,通常上电后都需要从片外eprom或flash上加载程序到片内ram,但是芯片自带的自举程序(简称bootloader)只支持32k字以内的外部程序加载,因此程序设计往往局限于32k字空间内,限制了编程的灵活性,不能充分发挥5410的性能,当程序空间大于32k字时,就需要自己编写程序来实现自举。下面首先介绍使用5410对am29lv200bflash存储器进行程序分页烧写的方法,然后重点介绍利用bootloader来编程实现多页并行自举引导的方法。
本文引用地址:https://www.eepw.com.cn/article/20651.htm1 am29lv200b flash存储器的分页烧写
1.1 flash存储器简介
am29lv200b(简称flash)是amd公司生产的flash存储器,主要特点有:3v单电源供电,可内部产生高电压进行编程和擦除操作;支持jedec单电源flash存储器标准;只需向其命令存储器写入标准的微处理器指令,具体便编程、擦除操作由内部嵌入的算法实现,并且可以通过查询特定的引脚或数据线监控操作是否完成;可以对任一扇区进行读、写或擦除操作,而不影响其他部分的数据。文中128k×16位am29lv200b flash映射为5410的片外数据存储空间,地址为:0x8000~0xffff,数据总线16位,用于16位方式的并行引导装载。128k的flash被分为7页进行访问。本文通过dsp的i/o端口向fpga写控制字,由fpga控制flash的换页引脚对各个分页进行访问;以烧写2个页面为例,使用flash的第1、2页,初始化时选中第1页。
1.2 flash存储器的分页烧写
flash的页面分配和相应的引脚控制如表1所列。关于am29lv200b的擦除、写、效验等详细操作,请见参考文献[1]、[2]。

从表1可以看到,通过对a16、a15等地址引脚的控制,可以实现flash的页面切换。在烧写过程中,只要在制定页面烧写完预定空间后就对flash进行换页,然后将烧写指针指向新的一页的首地址,就可以继续进行烧写,当程序烧写完成后需要将页面换回到第1页,在第1页的ffffh地址写入8000h,这样bootloader可以从这一页开始自举。整个烧写程序流程如图1所示。

这里会出现一个问题:程序烧写好后,虽然bootloader可以自动加载程序,但是bootloader怎样在加载过程中自动换页?下面详细介绍利用片上bootloader编程实现多页程序并行加载的方法。
2 多页并行加载的实现
实现多页加载,关键问题是要让bootloader知道什么时候可以换页;但是bootloader是固化在5410片上rom内的,无法对其进行编程。解决的方法是通过自己编写一段“前导”加载程序(简称loader)来实现加载中的换页:首先将loader和用户程序都烧写到flash中,当系统上电后,bootloader将loader加载到片上并运行,然后loader将flash中的用户程序加载到目标ram空间。这个加载过程是用户编程可控的,因此在需要换页时,可以控制flash进行换页,加载完成后loader跳转到用户程序的入口地址处运行用户程序。
2.1 bootloader的并行自举表结构和编程后的自举表结构
5410的并行加载过程以及生成自举表的详细方法请见参考文献[1]、[3]。bootloader使用图2所示的并行自举表来加载程序。bootloader从表头开始依次读取自举表,然后将相应的程序段加载到目标ram,最后以程序段大小为0来结束自举表的读取,跳转到用户程序入口地址执行用户程序。从图2可以看到,bootloader是以自举表中的程序长度为0来结束自举的,于是就可以利用这个特性,给bootloader制造一个“假象”,让bootloader在加载完loader程序后,认为程序已经加载完毕,然后开始运行loader程序,继续加载用户程序。按照这个思路,可以建立图3所示的自举表。

图3中的黑体字部分,是嵌入了loader程序的自举表,有了图3这样形式的并行自举表,系统就可以实现多页程序的并行自举,建立这样的自举表很简单,只需要将hex500格式转换工具生成的loader的并行自举表和用户程序的并行自举表按图3给定的格式,通过简单的文件操作合并在一起就可以了。注意:loader程序要占用一部分ram空间,用户程序空间不能和loader的ram空间重叠在一起。

2.2 loader程序的具体实现
下面以分布在2个flash页面的程序为例,给出5410并行自举的示例程序。程序中,当i/o端口5写入数据0时,选中flash第1页;写1时选中第2页。程序里用黑体字标出的注释部分,是loader程序设计的重点或难点。(具体程序见本刊网站www.mesnet.com.cn——编者注)
示例程序中,dsp上电后,bootloader将loader程序加载到ram中,然后执行loader程序:loader程序从flash第1页的8080h开始读取用户程序自举表,当flash读取计数值超过31k时,将flash切换到页面2,继续加载,自举完成后,跳转到用户程序入口地址执行用户程序。
在编写自举程序过程中,有这样几个问题需要注意:
①在换页时,一般情况下程序段都会跨越两个页面,因此在确定需要换页时要计算出第1页和第2页分别要加载的段长度。
②整个用户程序段开始时有2个字的入口信息,每一个程序段都有3个字的段信息,因此需要在flash读取计数时给予修正,才能正确加载数据。
③在确定需要换页时要将换页标志置为1,换页后要将换页标志置为0,而且换页后要将数据读取指针指向第2页的开头地址。
如果要使用本文的示例程序,一定要将loader程序烧写到flash第1页8000h的位置,用户程序段烧写到8080h以后的位置,再次提醒,loader程序加载到ram中的地址,不能和用户程序段加载到ram中的地址重叠。例如loader使用了ram中的7f80h~8000h这段空间,则用户程序不能使用这段空间,否则会出现错误。
loader的自举流程如图4所示。

3 总结
要实现5410的多页程序并行自举,有如下几个步骤:
根据用户程序的需求以及实际使用flash的分页设置,参考第2部分提供的思路和例子编写loader程序;
使用hex500代码转化工具分别生成loader程序和用户程序的自举表;
将两个自举表按图2的格式生成一个新的自举表,再使用第1部分介绍的方法将新的自举表分页烧写到flash上。
使用本文介绍的方法,通过多次试验,系统上电后,能够很好地实现2个页面程序的并行自举。虽然是以2个页面为例介绍flash烧写和并行自举的方法,但是对于2页以上的程序烧写和并行自举同样适用,只需要进行一些细微的改动即可。本文提供的方法以不到128字的ram空间代价,在5410上实现了将大于32k字的程序并行自举到片上ram,大大提高了编程的自由度和程序的运行速度,降低了系统功耗,这个方法有很强的通用性,可以在很多存在类似问题的dsp芯片(5409、5416等)上进行应用,具有较高的实用价值。
评论