基于PCMBI模块的Flash编程技术研究

2015-01-13 01:33:07高辉辉
单片机与嵌入式系统应用 2015年9期
关键词:用户程序扇区存储器

高辉辉

(国家知识产权局 专利局专利审查协作江苏中心 光电部,苏州 215163)

高辉辉

(国家知识产权局 专利局专利审查协作江苏中心 光电部,苏州 215163)

通过JTAG对Flash进行编程,给嵌入式系统的软件维护和升级造成一定的困难,针对这一点,以PC-MBI(PCI)模块为实例,完成了通过主机接口和串口的Flash编程软件。首先优化了Am29LV320D Flash的编程代码,提高了编程速度和正确率,并且设计了一种引导程序,实现了用户自行设置启动扇区的功能,对某一扇区进行更新等操作时,不会影响其他扇区的用户程序,此设计已应用于实际项目中。实际应用结果表明,该软件运行稳定,可维护性好。

Am29LV320D;Flash;在线编程;引导程序

引 言

随着信息技术的发展,嵌入式系统目前已在国防、国民经济及社会生活等领域普及应用。在嵌入式系统中,为了提高代码执行速度和系统的可靠性,操作系统及其软件多固化在非易失性的存储器中,如ROM、EPROM、EEPROM和Flash。其中Flash是一种可以在线进行电擦写、掉电后信息不丢失的非易失性存储器,具有功耗低、容量大、擦写速度快等优点,并且内部嵌入算法完成对芯片的操作,适用于需要实时写入数据并且掉电保持的系统。

传统上使用仿真器固化软件,给用户带了很大的不便,尤其不利于系统的后期维护,另外,这种方法也不能在高、低温等复杂环境下工作。针对这些问题,本文以PC-MBI(PCI)模块为实例,设计了基于该模块的通过主机接口和串口的Flash编程软件,使用户可以脱离仿真器自行固化所需的软件。该软件支持动态配置启动映像,可从DPRAM或Flash配置启动参数;支持主机接口更新软件;支持串口更新软件,并增加了校验来确保通过串口传送映像文件的正确率;在Am29LV320D Flash编程方法的基础上,优化了Flash的编程和擦除代码,提高了对Flash操作的正确率和速度;对Flash存储空间进行了划分,在对某一扇区操作时,不影响其他扇区的用户程序[1]。

PC-MBI(PCI)模块是一款基于SoC芯片HKS1553BCRT的低功耗、高性能的MBI板卡,支持1路双冗余度MIL-STD-1553B总线通信,该芯片内嵌ARM7TDMI微处理器;片内具有16K×32位和4K×16位的SRAM,以及可配置为8K×16位、16K×16位或32K×16位的DPRAM;片内中断控制器最多支持32路中断;串口控制器支持2路串行通信;提供8路通用输入/输出接口(GPIO);1路1553B接口,支持1~4 Mbps的MIL-STD-1553B数据传输速率;包括2M×16位的Flash存储器和1个3.3 V、总线频率为33 MHz的PCI总线接口。

1553B总线接口SoC应用中可以通过外部总线接口外接2M×16位的Flash存储器,MBI模块的传输层软件、引导软件、加载软件和测试软件都存储在Flash存储器中,通过固化程序将这些软件固化到Flash中,系统上电后,通过搬家程序将测试软件或传输层软件搬到SRAM中运行。

在以前的应用中,经常使用仿真器为PCI模块升级软件,但此方法代价高,不利于用户操作,在一定程度上也影响了后期维护工作。针对这些缺陷,为满足用户需求,开发了通过主机接口和串口固化板卡映像的Flash在线编程软件。

2 Flash基本操作命令以及程序设计

本设计采用了Flash的autoselect模式,该模式能使编程设备自动地与另一采用相应编程算法编程的设备匹配,并且通过命令寄存器访问系统内的autoselect代码。为了访问到系统内autoselect代码,主机系统可经由命令寄存器发送autoselect命令。

图1 擦除操作流程

2.1 Flash存储器擦除命令

擦除命令分为整片擦除和扇区擦除两种,可按字或字节操作,共需要6个总线周期,依次为两个解锁周期、一个建立周期、两个解锁周期、一个擦除周期。该擦除命令启动内部擦除算法,自动完成擦除操作。擦除操作的流程如图1所示。

2.2 Flash存储器编程命令

对Am29LV320D进行编程,可以按字或字节操作,共需要4个总线周期。编程命令首先以两个解锁周期开始,然后是一个建立周期,最后一个周期完成向待编程地址写入特定的数据。写完该地址和数据后,内置编程算法自动启动,进行Flash存储器编程。编程算法完成后,进入读取数据状态。

2.3 Flash存储器操作结束的检测机制

常用的Flash存储器操作结束的检测方法有3种:第1种是判断引脚RY/BY#的状态,在编程或擦除操作过程中RY/BY#引脚一直为低电平,操作完成后变为高电平。第2种是检测跳变位DQ6,在编程或擦除时对任何地址进行连续读,均引起DQ6连续跳变,直至操作结束才停止跳变。第3种方法是使用数据线的DQ7和DQ5位,DQ7位在编程或擦除过程中输出的数是写入该位数据的反码,当操作完成时输出才变为写入该位的数据,但还要读取DQ5位的状态,为“1”时表示操作超时,此时应再读一次DQ7位的状态,若DQ7位输出仍不是写入的数据,则操作失败,复位Flash存储器。本设计使用了第2种方法检测跳变位DQ6,具体算法见图2。

图2 检测跳变位算法

2.4 Flash操作代码实现

Flash烧写代码设计中具体算法的函数定义如下:

① 整片擦除函数为void flash_erase_chip()。

② 扇区擦除函数为void flash_erase_sector(int s_first,int s_last),其中s_first和s_last为sector号,函数功能为擦除扇区s_first到扇区s_last的区域。

③ 编程操作的函数为unsigned short write_flash_sector(unsigned int offset),其中offset为扇区号,程序在Flash中烧写的起始地址为Flash基地址+扇区号,本设计中的Flash基地址定义为0x 0100 0000。

仅介绍烧写Flash存储器的一个单元作为参考:

unsigned short write_flash (unsigned short length,unsigned int addr,unsigned short* pdata){

unsigned int i;

for(i=0;i<=length;i++){//length为映像大小

writeFlash_16(FLASH_BaseAddr+0xaaa,0x00aa);

//解锁周期

writeFlash_16(FLASH_BaseAddr+0x555,0x0055);

writeFlash_16(FLASH_BaseAddr+0xaaa,0x00A0);

//建立周期

writeFlash_16(FLASH_BaseAddr+addr+i*2),*(pdata+i);

//编程命令

check_toggling (FLASH_BaseAddr+addr+i*2);

//检测操作完成函数

}

}

应在每个单元编程和擦除命令发出后进行检测,以保证前一个单元编程或擦除结束后再进行下一个存储单元的编程或擦除,可以采用第2.3节中介绍的检测机制,也可以采用延时等待的方法实现,但是在编程和擦除过程中,延时的方法占用时间较长,烧写也不稳定,所以本设计采用了检测跳变位DQ6,提高了Flash的编程速度。函数实现为check_toggling(unsigned int dst),其中dst为要检测的地址,通过检测该地址数据的第6位来确定操作是否完成,并且增加了对超时标志位DQ5的判断,提高了Flash操作的正确率,具体流程见图2。

3 软件设计

软件设计主要包括引导程序、Flash在线烧写和映像文件3个部分。Flash在线编程软件包括主机接口烧写和串口烧写两大部分,该软件开发完成后,将其各自的映像文件和其他必要的映像文件分别烧写到Flash的不同扇区Sector(对于映像文件,开发人员可根据自己的需要给实际需要的映像分配扇区),烧写到各扇区的用户程序互不影响,烧写成功后,用户可自行选择启动扇区,此功能由引导程序来实现。以下主要介绍引导程序和Flash在线烧写部分。

3.1 引导程序

引导程序完善了ARM系统正常工作所需要的简单初始化,它涉及到用户程序的正确定位和复位后的启动过程,是整个设计的重要组成部分[2]。该引导程序是用汇编语言完成的,支持用户自行选择启动Sector,即可根据用户的外部命令选择运行合适的用户程序。具体实现如下:

(1) 上电复位查询

上电复位后,首先进入复位异常中断,禁止所有中断,然后查询通用I/O端口(GPIO)的状态和启动标志来确定从哪个地址启动。GPIO状态是从GPIO输入寄存器读取数值,地址定义为0xEF60 0708。

(2) 定位启动实现

本设计设定了DPRAM、Flash和Demo三种启动参数配置方式。这是通过定义启动标志的地址和启动标志来实现的,根据上层用户的需求(VC6.0实现)完成从DPRAM/Flash配置启动参数,从而运行合适的用户程序。具体程序流程如图3所示。

图3 引导程序的启动流程

3.2 Flash在线烧写

为了方便用户,本实例提供了两种Flash在线烧写方法:第一种为主机接口烧写,通过主机接口完成程序烧写;第二种为串口烧写,该方法是针对可脱离仿真器烧写的问题提出的。

3.2.1 主机接口烧写

该软件的底层是在ADSv1.2环境下完成的,主要是Flash的编程和擦除程序,驱动层是在VC6.0环境下完成的。通过Flash烧写命令字和烧写响应字来实现它们之间的通信,从而完成主机接口烧写。使用定义的命令字来完成该部分,命令字为1时,执行整片擦除;命令字为2时,执行扇区擦除;命令字为3时,执行Flash编程操作。底层从烧写命令字中读取驱动层下发的命令后,根据命令执行相应的操作,操作完成后把当前命令写回到响应字。驱动层收到正确的响应字后,表示当前用户执行的动作完成。底层和驱动层之间的关系如图4所示。

图4 底层与驱动层的实现

3.2.2 串口烧写

传统上都是使用仿真器烧写映像文件,这种方法必须在ADS环境下通过JTAG接口实现,虽然这种方法方便调试,但是当程序需要更新或升级时,以及在后期维护过程中,尤其是用户需要重新更新映像文件时,此方法就不太方便。因此针对这一点开发了串口烧写技术,即通过串口传输映像文件和SoC内运行的Flash烧写程序,将映像文件固化到指定扇区。它采用了“程序”烧写“程序”的方法,前一个“程序”为串口烧写程序[6],包括文件接收和烧写的具体实施,开发完成后需要将其固化到Flash中。

主机端串口工具使用DNW,该工具具有发送、接收、显示等功能。使用DNW传送文件后,会在文件开头生成32位的文件长度,并且还会在文件末尾自动生成一个16位校验和。具体格式如下:

32位总长度实际数据16位校验和

串口通信方式有查询方式和中断方式,为了文件接收的完整性,底层采用串口的中断方式接收文件,串口的接收模块包括接收缓冲寄存器和移位寄存器。接收的数据进入移位寄存器后经移位处理并行传入缓冲寄存器,当串口的接收缓冲寄存器中有数据时,进入中断,在中断中接收并处理4个字节的数据后退出中断,这样依次接收数据,直至整个文件接收成功。在接收数据的同时,要计算出整个文件的校验和,最后与收到的校验和做比较,来确保传送文件的正确性,之后完成映像文件的烧写。操作成功与否都可在DNW上显示,方便用户实时了解操作过程及结果。

该软件开发完成后,需要使用仿真器将引导程序、Flash在线编程软件固化到Flash的指定扇区,用户就可以使用此Flash在线烧写来满足自己的需求。同时通过对Flash存储空间的划分,该软件可对不同程序进行在线更新,并且不会影响其他用户程序。

结 语

本文讨论的主机接口烧写和串口烧写技术在实际工

程中已经运用。虽然介绍的编程及擦除程序是针对 Am29LV320D Flash编写的,但是对于其他型号的Flash芯片,烧写方法与此类似。该烧写软件可脱离仿真器固化映像文件,适用于后期维护阶段,并且在串口烧写技术中,增加了校验和来提高文件传输的正确率,降低Flash编程的错误率,具有较高的实用价值。另外,本文使用ARM汇编语言编写了引导程序,用户依靠此引导程序可自行选择启动扇区,实现了动态配置启动参数的功能,从而启动预置在MBI模块内的多个用户程序。当更新某一扇区的用户程序时,也不影响其他空间的程序,在实际应用中大大方便了用户。所需程序开发完成后,只需使用仿真器将引导程序、Flash在线编程软件(主机接口烧写和串口烧写)以及实际应用的映像文件固化到Flash的相应扇区,用户就可以很容易地更新映像文件,还可根据需要选择启动扇区。本设计加载后运行可靠,在实际工作中取得了良好的效果,并且整个设计采用ARM汇编语言和C语言开发,方便移植。

[1] 殷树明,王宜怀.嵌入式系统中多用户程序在线编程技术[J].计算机工程,2009,35(5):37-39,43.

[2] 孙昊,曹玉强,杜秀芳.ARM处理器启动代码的分析和编程[J].工业控制计算机,2005(11):54-55.

Research on Programming Technology of Flash Based on PC-MBI Module

Gao Huihui

(Patent Examination Cooperation Jiangsu Center of the Patent Office,SIPO,Suzhou 215163,China)

It is difficult to maintain and upgrade the software of the embedded system if programming of Flash by JTAG.Taking PC-MBI model as an example,a new programming software for Flash memory through the host interface and serial port is proposed in this paper.Firstly,Am29LV320D Flash programming code is optimized,which improves the programming speed and accuracy.A booting program is designed,which helps the users can set the start-up sector,and it will not affect the user programs in another sector when updating program in a certain sector.The actual application results show that the software runs stably and has good maintainability.

Am29LV320D;Flash;on-line programming;booting program

TP311

A

士然

2015-03-11)

猜你喜欢
用户程序扇区存储器
分阶段调整增加扇区通行能力策略
南北桥(2022年2期)2022-05-31 04:28:07
静态随机存储器在轨自检算法
变速箱控制系统Bootloader设计与实现
嵌入式设备远程升级方案设计
U盘故障排除经验谈
基于贝叶斯估计的短时空域扇区交通流量预测
重建分区表与FAT32_DBR研究与实现
存储器——安格尔(墨西哥)▲
环球时报(2014-06-18)2014-06-18 16:40:11
C8051F410单片机BootLoader的实现
基于Nand Flash的高速存储器结构设计