C5410与FLASH的接口设计及bootload实现
文章选择的FLASH存储器是SST公司生产的SST39VF400A。
关键词:FLASH存储器;地址分配;实现
1 C5410与FLASH的接口设计
1.1 SST39VF400A芯片介绍
SST39VF400A是SST公司的256K×16位FLASH存储器,工作电压3.3V,支持单字节编程;支持3种擦除方式:以2 kB为单位的扇区擦除,以32 kB为单位的块擦除和片擦除。用户只需向其特定地址写入特定的指令序列,那么通过这些命令用户即可启动内部写状态机,从而使其自动完成指令序列要求的内部操作。
SST 39VF400A具有在线烧写功能,只要在有效的擦除工作完成后,按照特定的命令时序向其写入编程命令和数据就可以实现对它的编程。SST39VF400A常用的字编程和片擦除命令如表1所示。
表1 SST39VF400A指令序列
1.2 DSP与FLASH构成的最小系统
图1 DSP与FLASH连接图
由图1,FLASH的片选信号CE由DSP的数据空间选择信号DS和存储器选通信号MSTRB产生,读使能信号OE和写使能信号WE由DSP的读写脉冲信号R/Wj产生。FLASH的地址线A0~A15和DSP的A0~A15直接相连,A16和A17接地。由于DSP数据空间0000H~7FFFH为存储器映象寄存器、暂存器和片内RAM,对外部FLASH来讲是不可见的,所以FLASH可操作的地址范围为8000H~FFFFH。设用户程序从FLASH中8000H单元开始存放,则系统上电时引导程序就从数据空间的8000H单元开始搬运数据到DSP内部RAM指定区域,引导完毕后即跳转到RAM中程序入口地址运行用户程序。
为配合FLASH读写的时序要求,我们通过CPLD实现FLASH读写时序,逻辑如图2所示。
图2 CPLD逻辑
1.3 JTAG接口设计
对于C5410,需要引出JTAG接口,以便于仿真调试。一般情况下,只要仿真器与开发板之间的连接电缆不超过6英寸,可以直接连接。如果超过了6英寸,则需要在数据传输引脚加上驱动。图3给出两种情况下的JTAG接口的连接方法。
2 C5410的BOOT设计与实现
DSP系统的引导装载(Bootload)是指在系统加电时,DSP将一段存储在外部的非易失性存储器的代码移植到内部的高速存储器单元中去执行。这样既利用了外部的存储单元扩展DSP本身有限的ROM资源,又充分发挥了DSP内部资源的效能。尽管用户代码在一段时间相对是固定的,但是如果直接将其掩膜到内部ROM中去的话,一方面受容量以及价格的限制,另一方面每次修改代码都需要向TI公司提交代码,由TI公司进行掩膜,显得不是很灵活方便。FLASH是一种高密度、非易失性的电可擦写存储器,而且单位存储比特的价格比传统的EPROM要低,十分适合于低功耗、小尺寸和高性能的便携式系统。除了可以采用专用的硬件编程器把代码灌入FLASH中之外,也可以利用现成的DSP通过软件编程来实现同样的功能。
2.1 BOOTLOADER概述
TMS320VC5410的片内ROM区程序如表2所示。
表2 TMS320VC5410片内ROM区
当DSP上电(复位)后,IPTR被恢复成默认值111111111b,如果MP/MC=0,程序指针PC指向片内程序区的0xFF80处,这个地址正好是ROM区中断向量表的起始地址,在这个地址上有一条跳转指令,使程序指针PC跳转到F800H,开始执行BootLoader程序。
TMS320VC5410提供的片内引导方法有:主机口HPI模式、8位串口EEPROM模式、8位或16位并口模式、8位或16位I/O模式和8位或16位串口模式等。DSP上电后,顺序检测这些引导模式,当检测到有效的引导模式后,则进入相应的引导模式。检测过程参看图4。
2.2 TMS320VC5410的BOOT设计与实现
参看图4,本系统选取16位并行引导模式。INT2设置为不激活(本系统直接通过一个10k?赘电阻接到3.3V电源),MP/MC=0,OVLY=1,DROM=0,FLASH映射到DSP数据区的8000H~FFFFH。
为了实现DSP加电自举,FLASH中的数据必须按照自举引导表的格式“烧写”。
自举表内容不仅包括了欲加载的各段代码,而且包括各段代码长度、各代码段存放的目标地址、程序入口地址等信息。因此若想利用自举引导功能,首先必须正确建立自举表。
2.3 FLASH在线编程
要把通过上面介绍的方法生成的自举引导表文件放入FLASH中,需要使用烧录器,而且使用烧录器烧录,还对FLASH的封装提出了要求,这就限制了用户的灵活性。
本系统采用了另外一种被称为“二次加载法”的方法,具体过程如下:
建立两个独立的工程文件:Project.pjt和FlashBurn.pjt。前者生成的目标文件就是要烧入到FLASH中的用户程序,后者则是烧写程序。Project.pjt有两个程序段:第一段是“.text”段,位于0x0100开始的单元,长度为0x0838。第二段为“.VECTORS”段,位于0x0080开始的单元,长度为0x0080。它实现中断向量表的重新映射。程序执行入口地址也在0x0100单位。烧写的只需烧写用户程序的已初始化段。用户程序各段的起始单元及其长度可以参考该工程编译链接后的生成的.map文件。
烧写工程文件Project.pjt只有一个程序段,定位在0x7000开始的存储区(注意不要与MyProject.pjt所占的程序空间有重叠),并将其_c_int00直接定位到该区域。
用户程序烧写到外部FLASH的0x8000开始的存储区。
两个工作建立并且编译完毕后,在CCS中先打开Project.pjt工程文件,用“File→Load Program...”菜单命令下载用户程序目标代码Project.out;再打开Project.pjt工程文件,下载FlashBurn.out,运行FlashBurn.out,即可将FlashBurn.out代码及其Boot引导信息写入到FLASH中。
烧写结束后,关掉CCS,重新给DSP上电,DSP自举引导成功。
3 结束语
利用“二次加载”法,可以实现DSP程序的在线烧写,文章以5410为例来介绍该方法,实际上可以扩展到其它型号的DSP芯片,烧写成功的关键在于:一是要理解该方法的实质,二是要正确规划两种程序在内存中的地址分配。
推荐访问: 接口 设计 C5410 Flash bootload