基于LPC2378的IAP功能实现配变监测终端程序远程更新

发布者:MysticSerenade最新更新时间:2023-05-16 来源: elecfans关键字:LPC2378  IAP功能  配变监测终端  程序  远程更新 手机看文章 扫描二维码
随时随地手机看文章

本文采用Philips公司的32位微处理器LPC2378进行配变监测终端的开发,并利用该芯片自带的IAP功能实现了终端程序的远程更新。为了降低通信流量和终端的存储空间,本文还将LZW压缩算法应用到程序更新中。

1  LPC2378芯片介绍

LPC2378是一款基于ARM7TDMI-S的32位处理器。它具有512 KB的片内Flash程序存储器、32 KB的静态RAM(SRAM),以及在系统编程(In-System Programming,ISP)和在应用编程(In-Application Program-ming,IAP)功能。由于程序对内存需求比较大,所以外扩了一片64 KB的SRAM。

通常,程序的下载可通过3种方式实现:

①采用嵌入式实时操作系统。该方法加大了系统对存储容量的要求,增加了硬件和软件成本。

②采用增加外控制烧录系统的方法。该方法同样增加了系统的复杂度和成本,且降低了系统本身的可靠性。

③采用IAP技术。该方法充分利用芯片本身的功能,不增加外围器件,是一种最佳的实现方案。

1.1  LPC2378的FIash扇区

IAP命令以“扇区”为单位进行操作,操作时需要指定扇区号。LPC2378的扇区分布如表1所列。IAP、ISP和RealMonitor程序都位于Boot区,Boot区位于地址0x000TE000~0x0007FFFF处。IAP命令不允许对Boot扇区执行写/擦除/运行操作。



1.2  LPC2378的IAP功能

IAP程序是Thumb代码,位于地址0x7ffffff1。IAP功能可用下面的C代码来调用。

定义IAP程序的入口地址:
# define IAP_ENTER_ADR 0x7ffffff1
定义函数类型指针:
Typedef void(* IAP)(uint32[ ],uint32[ ])
IAP iap_entry;
设置函数指针:
Iap_entry=(IAP) IAP_ENTER_ADR;
使用下面的语句来调用IAP:
Iap_entry(command,result);

IAP功能主要通过调用iap_entry()函数来实现。IAP命令和定义的函数如表2所列。



在进行片内Flash修改时,首先需要读取器件的ID和Boot代码命令版本;确认无误后,选择准备编程的扇区;然后擦除扇区并执行扇区查空,将RAM内容复制到Flash中;最后进行RAM内容与Flash的比较,检查是否复制成功。

2  远程更新的实现

2.1  程序分区

软件开发采用ADS1.2集成开放环境。ADS全称为ARM Developer Suite,是ARM公司推出的ARM集成开发工具。在ADS链接选项ARM Linker中选择Scattered方式后,通过修改.scf文件可以将程序编译成应用程序和更新程序两部分。其中,应用程序占用0~21扇区,用于实现终端的功能;更新程序占用22~27扇区,在终端出厂后不再进行修改。当进行程序更新时,利用IAP功能对应用程序部分进行擦除改写,以实现终端应用程序的更新。链接用的.scf文件定义如下:



在.scf文件中,RO表示程序代码数据内容,RW和ZI表示该程序部分中定义的通用数据变量和需进行零初始化的数据变量。ROM_MAIN部分主要包括应用程序部分和其定义的数据。ROM_EXEC是应用程序的代码区域,位于片内Flash,地址从0开始。IRAM中是程序运行的堆栈,位于片内RAM中。ERAM是应用程序定义的数据变量,位于片外RAM中。LOADER部分是更新程序的代码区域,位于片内Flash,地址从0x78000开始。程序编译、链接完成后,ADS会生成两个名为ROM_MAIN和LOADER的十六进制文件。在需要程序更新时,主站将完成二进制提取的ROM_MAIN文件通过有线或无线的方式发送给终端,终端全部收到后调用更新程序进行程序更新。但由于提取完的二进制文件仍然比较大,需要对其进行压缩,以降低通信费用。

2.2  程序更新的实现方法

程序运行流程如图1所示。终端在程序启动时,先检查是否需要程序更新,如果不需要则正常进入main()函数运行。在运行过程中,当遇到主站发过来的压缩程序包时,首先需要对压缩程序包进行检查,如果无误,则将其存到对应位置的外部Flash中。当收到主站的程序更新命令时,终端需要对接收到的全部压缩程序包进行检查,确认无误后置位程序更新标志,保存当前数据并复位。当终端程序再次启动,发现有程序更新标志时,则调用更新程序。在更新程序中,首先从外部Flash中取出压缩的程序包,然后对其进行解压缩,并将压缩后的程序复制到对应的内部Flash扇区中。当所有的压缩程序包都解压复制后,清除程序更新标志,然后复位。终端再次启动后,运行的就是更新之后的应用程序了。



2.3  解压缩算法在更新程序里的实现

在程序编译、链接完后,对应用程序生成的ROM_MAIN.hex文件进行二进制提取。虽然可以使文件大大减小,但所生成的文件仍然很大,需要进一步压缩。本文采用LZW压缩算法对其进行压缩,LZW(Lempel-Ziv-Welch)压缩算法是一种串表式无损压缩技术,支持流式解压缩,可以根据内存大小选择合适的最大字典串长。表3显示了对ROM_MAIN.hex文件(940 KB)进行二进制提取,以及提取后对其进行LZW压缩各阶段的文件大小。



当需要进行程序更新时,将压缩后的文件发送给终端。终端收到全部程序压缩包并确认无误后,进行复位并调用更新程序。在更新程序中,由于内存的限制,每次从外部Flash读取1 024字节进行解压缩。当解压出的字节数达到512时,调用IAP功能函数,并将这512个字节复制到内部Flash中,继续进行解压缩。之前读取的1 024个字节解压完毕后,再重新从外部Flash进行读取解压,直到对应用程序完全解压并复制完为止。

结  语

本文介绍了基于LPC2378的IAP功能实现配变监测终端程序远程更新的方法,并将LZW压缩算法应用于程序更新中。该产品投入运行一年多以来,取得了良好的运行效果。此项技术具有一定普遍性,略加修改可以应用到其他同类产品中。

关键字:LPC2378  IAP功能  配变监测终端  程序  远程更新 引用地址:基于LPC2378的IAP功能实现配变监测终端程序远程更新

上一篇:采用LPC2294四路CAN控制器实现智能通信卡系统的设计
下一篇:ARM LPC2103定时器中断方式寄存器设置

推荐阅读最新更新时间:2024-11-21 10:57

PLC编程优化设计使程序运行提速
  通过本方法优化可以极大的减少程序语句数,使plc程序更简洁、可读性更好,由于不需要做耗时的类型转换,程序运行效率也得到提高。且数学运算量越大,效率提高越明显。   缺点是要多占用两字节的内存,以后程序中不能使用VW0。但S7-200的RAM空间很大,一般是用不完的,以226为例,有多达10K的RAM,偶从来没有超过1K。这些RAM都是花钱买来的,不用白不用,不用也是浪费了。   同理,如果有字节型变量经常需要与字类型变量相互转换,让字节变量占用一个字的内存宽度浪费一个字节,避免类型转换。具体步骤如下:   1:根据工程实际需求,进行功能块规划,编写子程序   在PLC中子程序是为一些特定的控制目的编制的相对独立的程
[嵌入式]
单片机LED动态显示程序
;***************************************************************************** ;: 描述:此51单片机led动态显示程序的电路很简单这里我就不画出来,就是p2口,通过470欧姆的电阻接led灯然后连到正5v电源。请http://www.51hei.com 的读者自行装配好电路,加电阻的目的是限流保持单片机正常运行 ;****************************************************************************** include reg52.h #include intrins.h #def
[单片机]
按键程序 PORT中断程序
MSP 430里面 P1口和P2口有中断功能。 我们的项目里面,P1口的1-7管脚做键盘,0脚做风速传感器的输入。P2口的0-4做键盘,5-7做其他用。 //键盘引脚配置 P1DIR=0x00; // P1 口为输入(0:风速传感器输入,1-7中断信号输入) P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4); //把P2.0-P2.4设为输入 //下降沿触发是指按下的时候进入中断,上升沿触发是在放开按键的时候进入中断 P1IES|=BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+
[单片机]
oled显示温度报警的51单片机程序
温度报警限制上下值 由oled显示 制作出来的实物图如下: 单片机源程序如下: #include #include oled.h #define uchar unsigned char #define uint unsigned int unsigned char set=0; unsigned char code table = 0123456789 ; uchar shi,bai,ge,xiaoshu; sbit DSPORT=P3^7; sbit k1=P2^7; sbit k2=P2^6; sbit k3=P3^2; bit N_flag; int shangxian=22; int xiaxian=10;
[单片机]
oled显示温度报警的51单片机<font color='red'>程序</font>
8051单片机抢答器C程序
#include REG51.h /****************************************************************** * 自定义Macro *******************************************************************/ //编码的均为反向编码 #define CLEAR 0x7f //定义清空的反码 #define LED_BEGIN 0x01 // 定义开始时数码管的显示 #define LED_FOUL 0x38 // 犯规后显示字母 F ,数码管编码 #define LED_
[单片机]
ICC-AVR DS1821S温度报警程序
用DS1821的测温报警输出功能,已经过实测,可以用的,已批量用于产品。 //ICC-AVR application builder : 2015-10-8 14:15:46 // Target : M8 // Crystal: 8.0000Mhz /*新片烧录程序,电容加热温度高低设置成0x14,0x13;化雪板设置成0X02,0X00*/ #include iom8v.h #include macros.h #define uchar unsigned char #define uint unsigned int #define sint short int #define uint8
[单片机]
tiny4412 裸机程序 一、说明
首先、我想说明为什么我写这个文档?我自己想学点东西,过于求成,又过于自信,直接买了Tiny4412的板子,但网上关于4412的资料太少,我一直没办法啃动,只能尽可能找来各种相关资料进行参考分析。我想在U-Boot程序中加入LCD显示功能,但始终都没有正常点亮LCD,放弃的心都有了,后来在网上找到一份《Linux平台下Mini210S裸机程序开发指南》的文档,我觉得写的挺清楚的,我也只能二一点了,先把4412当单片机玩吧,也给自己树点信心吧,我想能参考完成这些裸机程序后,再来搞U-Boot的LCD功能应会有新的收获吧,所以我就参考着这份文档,进行了一些裸机程序实验。写这份文档中,一是给自己学习用,二是希望能帮助到一些像我一样的朋友。
[单片机]
嵌入式Linux操作系统的驱动程序开发要点
在Linux操作系统下有3类主要的设备文件类型:块设备、字符设备和网络设备。这种分类方法可以将控制输入/输出设备的驱动程序与其他操作系统软件分离开来。 字符设备与块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般紧接着发生。块设备则不然,它利用一块系统内存作为缓冲区,若用户进程对设备的请求能满足用户的要求,就返回请求的数据;否则,就调用请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,以免耗费过多的CPU时间用来等待。网络设备可以通过BSD套接口访问数据。 每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有2个设备号,第一个是主设备号,标识驱动程序;第二个是
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved