基于LPC2148的SD卡实现嵌入式系统升级设计
1 引言
随着现代工业社会逐步向智能化社会的过渡,嵌入式在现代经济生活中扮演着重要的角色。为了做出好的产品,必须与用户形成互动,利用用户的反馈信息不断完善产品。另外,产品在长时间使用中,会慢慢出现终端程序设计上的缺陷,这就要求对终端系统设备的内核、文件进行系统升级或者对设备进行功能维护。如果对几百个终端进行现场ISP升级,或通过JTAG口、串口实现升级,不仅浪费大量的人力、财力,更重要的是浪费了宝贵的时间。延误了开拓市场的机遇,降低了用户对产品的信誉度[1]。为了解决这些问题,提出了利用LPC2148的SD卡实现嵌入式系统升级的设计方案。
2 总体系统升级方案设计
厂家生产出产品后,用户购买回去使用,当设备出现了系统漏洞或者用户不满足现有功能而提出更多需求时,就要对系统升级或者维护系统功能。厂家只需将SD卡取回,把更新后的程序放入SD卡中,然后发放给用户,用户只需把SD卡插入终端设备,即可达到系统升级的目的。图1给出厂商与用户之间的交流流程图。图2给出整个系统设计流程图。
按图1所示,厂商与用户交流过程如下:
(1) 厂商将一个类似Boot loader的程序通过ISP方式,将 其下载到Flash中,如图2所示的位置;
(2) 将升级程序放入SD卡中,随产品一起出厂;
(3) 用户拿到SD卡后,将其插入SD卡槽,终端设备开始 工作;
(4) 用户使用一段时间后,若出现问题或者需要升级、维护时,只需将SD卡返回厂家即可;
(5) 厂家将升级后的程序放入返回的SD卡中,再返回 给用户,或者厂家直接再发放SD卡给用户,而无需用户返回SD卡;
(6) 用户拿到SD卡后,将其直接插入终端设备卡后,则可达到升级的目的。
出厂前,通过ISP编程方式烧入一个类似于Boot loader的程序。该程序的实现大致分为3个步骤:
(1) SPI模式下的SD卡底层驱动;
(2) 读出SD卡中的系统程序,并放入指定的Flash地址段中:
(3) 跳转到指定的Flash地址段,执行升级后的系统。
在用户插入SD卡前,程序不断判断SD卡是否插入。用户插入SD卡后,程序首先驱动SD卡,使其能正常工作,然后读取SD卡中的升级程序,并将其放入指定的Flash地址段中。最后,跳转到指定段,开始工作。厂家可根据需要,任意安排升级程序放置的位置。
3 系统硬件设计
核心处理器采用PHILJIPS公司的LPC2148。它是一个支持实时仿真和嵌入式跟踪的32位ARM7微控制器,带有32KB和512KB嵌入的高速Flash存储器。128位宽度的存储器接口和独特的加速结构,使32位代码能够在最大时钟速率下运行,并带有SPI总线。选用该处理器主要考虑其内部资源丰富,无需扩展存储器和SPI总线,且性能优异,抗干扰能力强,价格低廉,具有极高的性价比。
该设计只是产品电路中的一部分。其硬件电路如图3所示。LPC2148具有同步、全双工串行接口(SPI),其最大数据位频率为输入时钟频率的l/8,可以没置为主机或从机工作方式。SD卡是通过SPI总线协议驱动的,数据传输中,主机总是向从机发送一个字节数据,而从机也总是向主机发送一个字节数据。图3中左边为LPC2148,右边为SD卡插槽。SCKl为串行时钟,用于LPC2148与SD卡之间的数据传输时钟信号;MIS01是一个单向信号,用于将数据从SD卡传输至LPC2148;MOSll也是一个单向信号,用于将数据从LPC2148传输至SD卡;SSEL1为选通信号,用于选中SD卡。图3中的引脚3和引脚6分别接地,引脚4接电源,引脚8用于检测SD卡是否插入,并可根据实际要求选定。SD卡与LPC2148之间通过SPI协议和SD文件系统的组织形式,才能协调通讯。
4 系统软件设计
系统软件部分首先通过SPI协议对SD卡初始化,然后根据SD卡的FAT32文件系统组织形式读取SD卡中的数据,将读取数据通过IAP方式将其写入Flash中,最后用一个跳转程序跳转到该段,以达到升级的目的。
4.1 SD卡的初始化
用户应用程序通常以文件的形式访问SD卡,并以文件的形式存取数据。文件系统层是通过调用SD卡物理层的有关函数来实现的[2],所以要想以文件系统的形式访问SD卡,则必须先驱动SD。SD卡的读写操作都是基于命令的,通过向SD卡发送相应的命令并读取相应的响应控制SD卡。在对SD卡读写前,首先要进行初始化操作。这是确保SD卡能在SPI模式下正常读写数据的前提[3]。SD卡上电复位后,默认是SD模式。为了使SD卡进入SPI模式,必须将CS置低(至少延迟74个时钟)并通过SPI总线发送CMD。使SD卡复位,同时激活,并进行内部初始化处理,使SD卡退出空闲状态。SD卡初始化流程图如图4所示。
SD卡中SPI模块的读操作包括读单块和读多块两种。该系统仅实现了读单块功能。初始化的长度为512字节。函数的实现分为4个步骤:①LPC2148向SD卡发送读单块命令(CMD17),SD卡响应(R1格式);②等待SD卡发送读起始令牌;③判断收到的令牌是否为OxFE;④从SD卡中读取数据[4]。
4.2 SD卡文件系统
SD卡完成底层驱动后,可按照FAT32文件系统格式对SD卡上的数据进行操作,进而在SD卡上实现读写文件等操作。FAT32文件系统是微软FAT类文件系统中的最高版本,是现今Windows下最常用的硬盘文件系统[5]。
当读取SD卡中的文件时,首先要根据文件名查找该文件的信息结构体。根据文件信息结构体中的起始簇号即可找到数据区第1簇的内容,也可在FAT表中找到第2个簇号。根据第2个簇号又能找到第2簇的内容和FAT表中的第3个簇号,直至遇到文件结束标志。这样,就可根据FAT表中的簇号读取到全部文件数据[4]。以图5为例,说明读取SD卡文件的具体步骤:
(1) 先在目录项表中找到与文件名匹配的内容,如“Myfile”从“Myfile”所对应的目录项中可以读到该文件的首簇号0004:
(2) 根据首簇号0004访问FAT表,读出首簇号对应的FAT表项内容0005,即第2个簇号。根据第2个簇号再访问FAT表,读出其对应的FAT表内容,即第3个簇号0006…等。依次做下去,直到最后一个表项内容为FFFF为止;
(3) 由第(2)步可知,“Myfile”这个文件占用了4个簇,这4个簇号形成一个簇链0004H-0005H-0006H-0008H,根据这些簇号所形成的簇链访问这4个簇号对应的4个数据存储区域,文件“Myfile”就分成4个部分分别存放在这4个存储区域中[6]。
4.3 IAP功能的实现
LPC2148支持多种方式对Flash进行编程,用来写入用户代码或数据。第一种方式是通过内置的串行JTAG接口进行编程;第二种方式是通过UARTO进行存系统编程(ISP);第三种方式是通过在应用编程(IAP)。IAP程序是thumb代码,地址为0x7FFFFFF0。在使用IAP擦除、编程操作过程中,片内Flash存储器不可访问。当用户运行应用程序时,用户Flash区域的中断向量有效,所以在调用Flash擦除、写IAP之前,用户应当禁止中断,确保用户中断向量在RAM中有效和中断处理程序位于RAM中。IAP代码不使用或禁止中断。
可将SD卡读出的数据用C代码烧入指定的Flash段中[7]:
*定义IAP程序的入口地址
#define IAP_LOCATION 0x7FFFFFF1;
*定义数据结构或指针,将IAP命令表和结果表传递给IAP函数unsigned long command[5],
unsignecl long result[2];
*定义函数类型指针,函数包括两个参数,无返回值
Typedef void(*IAP)(unsigned int[],unsigned int[]);
IAP lap_entry; //定义函数指针
*设置函数指针
iap_entry=(IAP)IAP_LOCATION;
*调用IAP语句
iap_entry(command,result);
4.4 程序实现跳转到任意行代码段执行
现以下例来说明这段程序。如果程序跳转到绝对地址为0xFFFF0执行,代码如下:
typedef void(*run)();//定义一个无参数,无返回类型的函数指针类型
run address=(run)0xFFFF0;//定义一个函数指针,指向跳转的位置address()://调用函数
在上述应用程序中,根本没有看到任何一个函数实体,但是却执行了函数调用。实际上它起到了“软重启”的作用,跳转到CPU启动后第一条要执行的指令位置,即实现了程序的跳转。
5 结语
该设计方案以LPC2148为核心,通过SD卡驱动、FAT32文件系统、IAP功能和程序跳转实现了系统升级的模块设计,并用于实际开发中。该设计增强了系统维护,缩短了产品的开发周期,节约了大量的人力、财力,增加了与用户的交流力度。与传统设计相比,在开发时间、成本和灵活性等方面都占有优势性。该设计已经调试成功,并作为一个功能模块用于某电子产品上,在产品需要增加新功能和维护系统稳定方面起到了巨大的作用。要注意的是,该程序设计是在Keil下编译通过的,生成的HEX文件不能直接放入SD卡中,因为该文件与通过ISP烧写Flash的文件不一样,要作一定的修改。另外,该方案不仅能用于系统升级,也能用于为程序补丁和写人数据等,也可用于ARM9。因此该设计方案具有广泛的应用前景。
参考文献
[1] 韦文祥, 朱志杰, 车琳娜, 等. 基于LPC2124的一个远程系统软件升级方案[J]. 单片机与嵌入式系统应用, 2006(5): 46-49.
[2] 周立功. ARM嵌入式系统软件开发实例(二) [M]. 北京: 北京航空航天大学出版社. 2006.
[3] 张凯, 姜熙君, 陈磊, 等. MMC卡的文件系统及其实现方法[J]. 单片机与嵌入式系统应用,2006(5): 30-32.
[4] 张天益. 基于ARM的车载播放器的设计[D]. 成都: 电子科技大学. 2007.
[5] 张明亮, 张宗杰. 浅析FAT32文件系统[J]. 计算机与数字工程,2004, 33(1): 56-59.
[6] 陈祖爵, 蒋仕俊.智能遥控器SD卡文件系统的设计与实现 [J]. 计算机与设计, 2007, 28(19): 4716-4718.
[7] 周立功. ARM微控制器基础与实践[M]. 北京: 北京航空航天大学出版社, 2003.
转载自《国外电子元器件》2008年(第10期)
暂无评论