电能表软件升级的方法及电能表技术

技术编号:33529196 阅读:20 留言:0更新日期:2022-05-19 01:56
本发明专利技术涉及电能表软件升级的方法及电能表,其包括基于电能表,电能表的单片机处于通电状态;单片机具有串口用于通讯;单片机电连接有片外存储器;方法包括以下步骤;S1,启动软件升级,S1.1,在单片机的片内Flash内预先划分为Boot程序区及应用程序区,Boot程序区用于给应用程序区升级;其中,Boot程序包含升级相关的函数、变量及常量,排除启动文件,在Boot程序区对应的Boot函数里不允许开启中断,设定Boot程序的复位地址的回写跳转指令为ZZYYYY,YYYY为启动文件的地址,Boot函数入口地址为XXXX,满足(XXXX&0xYYYY)==0xYYYY;Boot区升级主函数为Boot();本发明专利技术设计合理、结构紧凑且使用方便。方便。方便。

【技术实现步骤摘要】
电能表软件升级的方法及电能表


[0001]本专利技术涉及电能表软件升级的方法及电能表,属于电力仪表
,涉及到电能表软件升级功能的实现,本专利技术是基于单片机的Boot程序设计。

技术介绍

[0002]当前国内的电能表不允许带有软件升级功能,但是国外的DLMS协议标准里已经明确定义了软件升级相关的文件传送流程,并且已经在应用。要实现软件升级功能,通常的做法是把单片机的片内Flash分为两个片区,一个为Boot程序区,另一个为应用程序区,Boot程序负责对应用程序进行升级,升级完成后Boot程序会跳转到应用程序区,进行正常的程序执行,Boot程序地址必须从复位地址开始。为了避免源代码统一编译,造成两个片区有代码耦合的情况,必须用两个工程对Boot程序和应用程序进行独立编译,编译后的代码再进行拼接,就组成了完整的程序。但是代码拼接总是很麻烦,还容易出错,本专利技术找到一种方式能够把Boot代码以二进制代码的形式嵌入到应用程序的源代码里,这样直接生成的文件就不需要再拼接,并且可以避免只烧录应用程序导致程序无法运行的情况。

技术实现思路

[0003]本专利技术所要解决的技术问题总的来说是提供一种电能表软件升级的方法及电能表。部分编译器,比如IAR for ARM,在编译器配置里,可以选择二进制Bin文件进行自动链接,相当于完成了自动拼接,这样也比较方便,但是依赖于编译器自身的功能。专利技术目的在于设计一个方法来实现Boot程序以二进制代码的形式嵌入到应用程序的源代码中,实现统一编译应用。本专利技术把Boot程序代码放在一个常量数组里,存储到代码区,在应用程序的启动文件里进行调用。
[0004]为解决上述问题,本专利技术所采取的技术方案是:
[0005]一种电能表软件升级的方法,基于电能表,电能表的单片机处于通电状态;单片机具有串口用于通讯;单片机电连接有片外存储器;
[0006]方法包括以下步骤;
[0007]S1,启动软件升级,
[0008]S1.1,在单片机的片内Flash内预先划分为Boot程序区及应用程序区,Boot程序区用于给应用程序区升级;
[0009]其中,Boot程序包含升级相关的函数、变量及常量,排除启动文件,在Boot程序区对应的Boot函数里不允许开启中断,设定Boot程序的复位地址的回写跳转指令为ZZYYYY,YYYY为启动文件的地址,Boot函数入口地址为XXXX,满足(XXXX&0xYYYY)==0xYYYY;Boot区升级主函数为Boot();
[0010]S2,进入Boot区进行软件升级;首先,把Boot程序代码放在一个常量数组里,存储到代码区;然后,应用程序的启动文件从代码区调用Boot程序代码,把Boot代码以二进制代码的形式嵌入到应用程序的源代码中。
[0011]在S1中,在S1.1之后,执行S1.2;
[0012]S1.2,应用程序里发命令,置起升级标志,电表重新启动;
[0013]S1.2.1,升级状态判断,若判断升级信息区升级启动标志有效和/或若判断地址0x0001代码不为0x04,认为进入升级状态。
[0014]S1.2.2,首先,通过通讯命令触发升级;然后,升级程序把升级启动标志写到升级信息代码区,主程序检测到升级标志后,进入while(1);其次,等待看门狗复位,系统重新启动;
[0015]S1.3,从启动文件进入Boot主函数;首先,当系统重新启动后,为了之后进入S2,Boot区进行软件升级,在启动文件中调用Boot入口函数;设置如下:
[0016]在STARTUP.A51文件头部,添加:EXTRN CODE(BootCode);
[0017]在MOV SP,#?STACK

1语句之前,添加:LCALL BootCode;
[0018]然后,执行S2,调用Boot区函数,进行地址定位。
[0019]在S2中,处理Boot程序,
[0020]S2.1,首先,进入Boot函数中,判断升级标志置是否置起;
[0021]如果置起,则执行S2.1.1,否则,不置起;
[0022]S2.1.1,首先,对Boot程序以外的片内Flash的片区进行擦除;擦除完成之后,进行应用程序写入;然后,强制对Boot程序的复位地址的回写跳转指令;其次,回写跳转指令把启动文件的地址换成Boot函数的入口地址;其次,在升级完成后,把复位跳转指令恢复为启动文件的地址;
[0023]S2.2,Boot程序接收升级文件,接收到完整的一帧数据,校验正确后,返回

O

,表示接收成功,将数据按地址写入Flash;
[0024]接收升级文件包括两种方案,方案一,进行串口配置,在Boot函数里通过串口通讯接收升级文件,并以主循环判断串口发送和接收标志,串口协议可根据需要自定;方案二,在应用程序区,把升级文件下载到片外存储器里,Boot程序从片外存储器读出升级文件,再进行升级;
[0025]S2.3,将Boot代码在应用程序区进行嵌入;首先,在S2.1

S2.2中,Boot程序调试完成后,把Boot程序编译形成二进制代码,并以十六进制的形式放入一预设的常量数组BootCode[]中,存储为Boot.c文件;然后,把Boot.c添加到应用程序里,并对BootCode[]进行代码定位,对应修改S2.1.1中的启动文件;其次,在启动文件的初始化代码后,加入所需的外部调用语句;
[0026]其中,在应用程序里,对启动文件根据执行S2.1.1进行地址定位;
[0027]S2.4,在执行S2.1.1,升级擦除之前,对应用程序进行备份;
[0028]S2.4.1,如果升级出错,执行本步骤,否则执行步骤S2.4.2;恢复到擦除前的程序,同时要对升级文件进行校验,应用程序写入后,再读出来与升级文件的校验码进行比对,校验一致说明升级成功,否则执行重复升级或者恢复擦除前的程序,以提高程序升级的可靠性及容错性;
[0029]S2.4.2,发完最后一帧数据,升级文件数据收完后进行整体的数据校验,芯片内部程序校验码和下发的数据校验码一致,表示升级成功,否则执行擦除,重新升级;
[0030]S3,升级成功后,0x0001地址回写为0x04,恢复复位跳转地址为启动文件地址
0400,系统进入while(1)循环,等待重新启动,完成升级。
[0031]当采用Keil C51时,
[0032]在S2.1.1中,Boot程序的复位地址跳转指令为020400,其中0400为启动文件的地址,则回写指令把0400换成Boot函数的入口地址,升级完成后,再把复位跳转指令恢复为020400,假设Boot函数入口地址为XXXX,那么必须满足(XXXX&0x0400)==0x0400,因为Flash只能由1写为0,不能由0写为1,所以必须保证复位跳转的地址能够写为启动本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种电能表软件升级的方法,其特征在于:基于电能表,电能表的单片机处于通电状态;单片机具有串口用于通讯;单片机电连接有片外存储器;方法包括以下步骤;S1,启动软件升级,S1.1,在单片机的片内Flash内预先划分为Boot程序区及应用程序区,Boot程序区用于给应用程序区升级;其中,Boot程序包含升级相关的函数、变量及常量,排除启动文件,在Boot程序区对应的Boot函数里不允许开启中断,设定Boot程序的复位地址的回写跳转指令为ZZYYYY,YYYY为启动文件的地址,Boot函数入口地址为XXXX,满足(XXXX&0xYYYY)==0xYYYY;Boot区升级主函数为Boot();S2,进入Boot区进行软件升级;首先,把Boot程序代码放在一个常量数组里,存储到代码区;然后,应用程序的启动文件从代码区调用Boot程序代码,把Boot代码以二进制代码的形式嵌入到应用程序的源代码中。2.根据权利要求1所述的电能表软件升级的方法,其特征在于:在S1中,在S1.1之后,执行S1.2;S1.2,应用程序里发命令,置起升级标志,电表重新启动;S1.2.1,升级状态判断,若判断升级信息区升级启动标志有效和/或若判断地址0x0001代码不为0x04,认为进入升级状态。S1.2.2,首先,通过通讯命令触发升级;然后,升级程序把升级启动标志写到升级信息代码区,主程序检测到升级标志后,进入while(1);其次,等待看门狗复位,系统重新启动;S1.3,从启动文件进入Boot主函数;首先,当系统重新启动后,为了之后进入S2,Boot区进行软件升级,在启动文件中调用Boot入口函数;设置如下:在STARTUP.A51文件头部,添加:EXTRN CODE(BootCode);在MOV SP,#?STACK

1语句之前,添加:LCALL BootCode;然后,执行S2,调用Boot区函数,进行地址定位。3.根据权利要求1所述的电能表软件升级的方法,其特征在于:在S2中,处理Boot程序,S2.1,首先,进入Boot函数中,判断升级标志置是否置起;如果置起,则执行S2.1.1,否则,不置起;S2.1.1,首先,对Boot程序以外的片内Flash的片区进行擦除;擦除完成之后,进行应用程序写入;然后,强制对Boot程序的复位地址的回写跳转指令;其次,回写跳转指令把启动文件的地址换成Boot函数的入口地址;其次,在升级完成后,把复位跳转指令恢复为启动文件的地址;S2.2,Boot程序接收升级文件,接收到完整的一帧数据,校验正确后,返回

O

,表示接收成功,将数据按地址写入Flash;接收升级文件包括两种方案,方案一,进行串口配置,在Boot函数里通过串口通讯接收升级文件,并以主循环判断串口发送和接收标志,串口协议可根据需要自定;方案二,在应用程序区,把升级文件下载到片外存储器里,Boot程序从片外存储器读出升级文件,再进行升级;S2.3,将Boot代码在应用程序区进行嵌入;首先,在S2.1

S2.2中,Boot程序调试完成
后,把Boot程序编译形成二进制代码,并以十六进制的形式放入一预设的常量数组BootCode[]中,存储为Boot.c文件;然后,把Boot.c添加到应用程序里,并对BootCode[]进行代码定位,对应修改S2.1.1中的启动文件;其次,在启动文件的初始化代码后,加入所需的外部调用语句;其中,在应用程序里,对启动文件根据执行S2.1.1进行地址定位;S2.4,在执行S2.1.1,升级擦除之前,对应用程序进行备份;S2.4.1,如果升级出错,执行本步骤,否则执行步骤S2.4.2;恢复到擦除前的程序,同时要对升级文件进行校验,应用程序写入后,再读出来与升级文件的校验码进行比对,校验一致说明升级成功,否则执行重复升级或者恢复擦除前的程序,以提高程序...

【专利技术属性】
技术研发人员:兰召峰刘浩然屠梦涛孙凡刘建垒单宝华李吉林张宇菲张连霞
申请(专利权)人:青岛乾程科技股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1