一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

电能表软件升级的方法及电能表与流程

2022-05-18 06:52:51 来源:中国专利 TAG:


1.本发明涉及电能表软件升级的方法及电能表,属于电力仪表技术领域,涉及到电能表软件升级功能的实现,本发明是基于单片机的boot程序设计。


背景技术:

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


技术实现要素:

3.本发明所要解决的技术问题总的来说是提供一种电能表软件升级的方法及电能表。部分编译器,比如iar for arm,在编译器配置里,可以选择二进制bin文件进行自动链接,相当于完成了自动拼接,这样也比较方便,但是依赖于编译器自身的功能。发明目的在于设计一个方法来实现boot程序以二进制代码的形式嵌入到应用程序的源代码中,实现统一编译应用。本发明把boot程序代码放在一个常量数组里,存储到代码区,在应用程序的启动文件里进行调用。
4.为解决上述问题,本发明所采取的技术方案是:
5.一种电能表软件升级的方法,基于电能表,电能表的单片机处于通电状态;单片机具有串口用于通讯;单片机电连接有片外存储器;
6.方法包括以下步骤;
7.s1,启动软件升级,
8.s1.1,在单片机的片内flash内预先划分为boot程序区及应用程序区,boot程序区用于给应用程序区升级;
9.其中,boot程序包含升级相关的函数、变量及常量,排除启动文件,在boot程序区对应的boot函数里不允许开启中断,设定boot程序的复位地址的回写跳转指令为zzyyyy,yyyy为启动文件的地址,boot函数入口地址为xxxx,满足(xxxx&0xyyyy)==0xyyyy;boot区升级主函数为boot();
10.s2,进入boot区进行软件升级;首先,把boot程序代码放在一个常量数组里,存储到代码区;然后,应用程序的启动文件从代码区调用boot程序代码,把boot代码以二进制代码的形式嵌入到应用程序的源代码中。
11.在s1中,在s1.1之后,执行s1.2;
12.s1.2,应用程序里发命令,置起升级标志,电表重新启动;
13.s1.2.1,升级状态判断,若判断升级信息区升级启动标志有效和/或若判断地址0x0001代码不为0x04,认为进入升级状态。
14.s1.2.2,首先,通过通讯命令触发升级;然后,升级程序把升级启动标志写到升级信息代码区,主程序检测到升级标志后,进入while(1);其次,等待看门狗复位,系统重新启动;
15.s1.3,从启动文件进入boot主函数;首先,当系统重新启动后,为了之后进入s2,boot区进行软件升级,在启动文件中调用boot入口函数;设置如下:
16.在startup.a51文件头部,添加:extrn code(bootcode);
17.在mov sp,#?stack-1语句之前,添加:lcall bootcode;
18.然后,执行s2,调用boot区函数,进行地址定位。
19.在s2中,处理boot程序,
20.s2.1,首先,进入boot函数中,判断升级标志置是否置起;
21.如果置起,则执行s2.1.1,否则,不置起;
22.s2.1.1,首先,对boot程序以外的片内flash的片区进行擦除;擦除完成之后,进行应用程序写入;然后,强制对boot程序的复位地址的回写跳转指令;其次,回写跳转指令把启动文件的地址换成boot函数的入口地址;其次,在升级完成后,把复位跳转指令恢复为启动文件的地址;
23.s2.2,boot程序接收升级文件,接收到完整的一帧数据,校验正确后,返回

o’,表示接收成功,将数据按地址写入flash;
24.接收升级文件包括两种方案,方案一,进行串口配置,在boot函数里通过串口通讯接收升级文件,并以主循环判断串口发送和接收标志,串口协议可根据需要自定;方案二,在应用程序区,把升级文件下载到片外存储器里,boot程序从片外存储器读出升级文件,再进行升级;
25.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,所以必须保证复位跳转的地址能够写为启动文件的地址;
[0033]
当启动文件定位在0x0400的地址,boot函数定位在0xf400的地址,程序擦除后,flash被擦为全1擦除boot区外的程序代码数据,并把复位地址跳转指令写为02f400,让程序复位后,直接跳转到boot函数,升级完成后,再把复位地址写为020400,恢复启动文件的正常跳转;
[0034]
在s2.3中,针对keil c51的启动文件,再次,在启动文件头加入extrn code(bootcode),并在初始化代码后,加入指令lcall bootcode,mov sp,#?stack-1;之后,先跳转到boot函数,返回后再恢复一下堆栈。
[0035]
一种自动软件升级的电能表,电能表的单片机可处于通电状态;单片机具有串口用于通讯;单片机电连接有片外存储器;
[0036]
在单片机的片内flash内预先划分为boot程序区及应用程序区;
[0037]
boot程序区,用于给应用程序区升级;boot程序包含升级相关的函数、变量及常量,排除启动文件,在boot程序区对应的boot函数里不允许开启中断,设定boot程序的复位地址的回写跳转指令为zzyyyy,yyyy为启动文件的地址,boot函数入口地址为xxxx,满足(xxxx&0xyyyy)==0xyyyy;boot区升级boot主函数为boot();
[0038]
代码区,存有一个存放有boot程序区对应的boot程序代码的设定常量数组;
[0039]
应用程序区,具有启动文件及应用程序的源代码;启动文件用于从代码区调用boot程序代码;应用程序的源代码,嵌入有以二进制代码的形式的boot代码。
[0040]
在应用程序区,具有升级启动标志,在接收到升级命令后置起,并写入到升级信息代码区;
[0041]
boot主函数,从启动文件进入,其中
[0042]
在启动文件中的调用boot入口函数;设置如下:
[0043]
在startup.a51文件头部,添加:extrn code(bootcode);
[0044]
在mov sp,#?stack-1语句之前,添加:lcall bootcode;
[0045]
回写跳转指令,在通过调用boot区函数对地址定位后,强制对boot程序的复位地址的回写跳转指令,回写跳转指令把启动文件的地址换成boot函数的入口地址,并在升级完成后,把复位跳转指令恢复为启动文件的地址;
[0046]
升级文件,作为完整的一帧数据,通过boot程序接收,并校验正确后,返回

o’,表示接收成功,将数据按地址写入flash。
[0047]
本发明有三个优点,第一,boot程序可以从任意地址开始,无需限定在复位地址开始;第二,boot程序里完成升级后,不需进行跳转,只需进行芯片复位即可;第三,boot程序里不需要对中断入口进行跳转处理。这样简化了boot程序的设计,减少了boot程序代码量,可以避免由于某些中断入口未设置跳转导致应用程序跑飞的问题,同时应用起来更加方
便。
附图说明
[0048]
图1为常规的软件升级设计流程。
[0049]
图2为本发明的软件升级流程。
[0050]
图3为本发明的keilc51编译器参照图。
具体实施方式
[0051]
实施例1,如图1-3,本发明基于电能表,电能表的单片机处于通电状态;单片机具有串口用于通讯;单片机电连接有片外存储器;
[0052]
s1,在单片机的片内flash内划分为boot程序区及应用程序区,boot程序区用于给应用程序区升级;
[0053]
boot程序包含升级相关的函数、变量及常量,排除启动文件,在boot程序区对应的boot函数里不允许开启中断,设定boot程序的复位地址的回写跳转指令为zzyyyy,yyyy为启动文件的地址,boot函数入口地址为xxxx,满足(xxxx&0xyyyy)==0xyyyy,
[0054]
s2,首先,把boot程序代码放在一个常量数组里,存储到代码区;然后,应用程序的启动文件从代码区调用boot程序代码,把boot代码以二进制代码的形式嵌入到应用程序的源代码中;
[0055]
实施例2,在s2中,处理boot程序,
[0056]
s2.1,首先,进入boot函数中,判断升级标志置是否置起;
[0057]
如果置起,则执行s2.1.1,否则,不置起;
[0058]
s2.1.1,首先,对boot程序以外的片内flash的片区进行擦除;擦除完成之后,进行应用程序写入;然后,强制对boot程序的复位地址的回写跳转指令;其次,回写跳转指令把启动文件的地址换成boot函数的入口地址;其次,在升级完成后,把复位跳转指令恢复为启动文件的地址;
[0059]
当采用keil c51时,boot程序的复位地址跳转指令为020400,其中0400为启动文件的地址,则回写指令就必须把0400换成boot函数的入口地址,升级完成后,再把复位跳转指令恢复为020400,假设boot函数入口地址为xxxx,那么必须满足(xxxx&0x0400)==0x0400,因为flash只能由1写为0,不能由0写为1,所以必须保证复位跳转的地址能够写为启动文件的地址。比如启动文件定位在0x0400的地址,boot函数定位在0xf400的地址,程序擦除后,flash被擦为全1,在复位地址写入02f400,让程序复位后,直接跳转到boot函数,升级完成后,再把复位地址写为020400,恢复启动文件的正常跳转,可知f400是可以写为0400的。
[0060]
s2.2,boot程序接收升级文件,包括两种方案,方案一,在boot函数里通过串口通讯接收升级文件,并以主循环判断串口发送和接收标志,串口协议可根据需要自定;方案二,在应用程序区,把升级文件下载到片外存储器里,boot程序从片外存储器读出升级文件,再进行升级;
[0061]
s2.3,将boot代码在应用程序区进行嵌入;首先,在s2.1-s2.2中,boot程序调试完成后,把boot程序编译形成二进制代码,并以十六进制的形式放入一预设的常量数组
bootcode[]中,存储为boot.c文件;然后,把boot.c添加到应用程序里,并对bootcode[]进行代码定位,对应修改s2.1.1中的启动文件;其次,在启动文件的初始化代码后,加入所需的外部调用语句;
[0062]
比如keil c51的启动文件,再次,在启动文件头加入extrn code(bootcode),并在初始化代码后,加入指令lcall bootcode,mov sp,#?stack-1;之后,先跳转到boot函数,返回后再恢复一下堆栈。
[0063]
其中,在应用程序里,对启动文件根据执行s2.1.1进行地址定位;
[0064]
s2.4,在执行s2.1.1,升级擦除之前,对应用程序进行备份,如果升级出错,恢复到擦除前的程序,同时要对升级文件进行校验,应用程序写入后,再读出来与升级文件的校验码进行比对,校验一致说明升级成功,否则执行重复升级或者恢复擦除前的程序,以提高程序升级的可靠性及容错性。
[0065]
作为场景实施例:
[0066]
本实施例以矽力杰的71m6543f芯片为例进行软件升级的设计说明,编译器为keilc51,升级过程采用boot函数里通过串口边接收边升级的形式进行。
[0067]
71m6543f为64kb的flash,整体空间规划为:
[0068][0069]
应用程序空间规划为:
[0070][0071]
1)启动软件升级
[0072]
正常运行中,通过通讯命令触发升级,程序把升级启动标志写到升级信息代码区,主程序检测到升级标志后,进入while(1);等待看门狗复位,系统重新启动。
[0073]
2)调用boot区函数
[0074]
系统重新启动后,需要进入boot区进行软件升级,因此需要在启动文件中调用boot入口函数。设置如下:
[0075]
在startup.a51文件头部,添加:extrn code(bootcode)
[0076]
在mov sp,#?stack-1语句之前,添加:lcall bootcode
[0077]
3)地址定位
[0078]
keilc51编译器可参照图3的格式,进行地址定位。
[0079]
4)boot区代码设计
[0080]
boot区升级主函数为boot(),为了保证升级过程的安全性,发完最后一帧数据后要进行整体的数据校验,芯片内部程序校验码和下发的数据校验码一致,表示升级成功,否则执行擦除,重新升级。
[0081]
升级过程如下:
[0082]
4.1应用程序里发命令,置起升级标志,电表重新启动。
[0083]
4.2从启动文件进入boot主函数;
[0084]
4.2.1升级状态判断;
[0085]
4.2.2判断升级信息区升级启动标志有效,认为进入升级状态;
[0086]
4.2.3判断地址0x0001代码不为0x04(执行擦除后该地址会被写为f4,保证升级过程中掉电,能够再次进入boot函数),认为进入升级状态。
[0087]
4.3进行串口配置。
[0088]
4.4擦除boot区外的程序代码数据,并把复位地址跳转指令写为02f400。
[0089]
4.5检测串口接收标志,进行数据接收。
[0090]
4.6接收到完整的一帧数据,校验正确后,返回

o’,表示接收成功,将数据按地址写入flash。
[0091]
4.7升级文件数据收完之后,对整个代码地址数据进行校验比对,比对错误,擦除flash,等待再次升级。
[0092]
4.8升级成功后,0x0001地址回写为0x04,恢复复位跳转地址为启动文件地址0400,系统进入while(1)循环,等待重新启动。
[0093]
5.0升级完成。
[0094]
本发明充分描述是为了更加清楚的公开,而对于现有技术就不再一一列举。
[0095]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;作为本领域技术人员对本发明的多个技术方案进行组合是显而易见的。而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围。本发明未详尽描述的技术内容均为公知技术。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献