本发明涉及单片机技术领域,特别涉及一种单片机的iap方法及系统。
背景技术:
iap(in-applicationprogramming,在应用编程),指的是在系统的运行过程中对flashprogrammemory(闪存程序存储区域)和dataeeprom(数据存储区域)进行动态编程,进行app程序的升级和维护。
flash容量为8kbytes的stm8系列单片机不自带boot,因此需要设计人员自主设计bootproject,boot程序一般在单片机上电时启动,内含iap通信协议,可以用来接收app(application,应用程序)。从而实现小容量单片机的iap功能。
目前各个厂商均有自己定制化的实现方式,并且代码不会开源免费共享,因此,如何根据单片机的具体情况,开发一套iap升级程序,使得原本不带boot程序的单片机能够进行iap升级,是本领域技术人员亟待解决的问题。
技术实现要素:
有鉴于此,本发明的目的在于提供一种单片机的iap方法及系统,能够根据单片机的具体情况,开发一套iap升级程序,使得原本不带boot程序的单片机能够进行iap升级。其具体方案如下:
一方面,本发明提供一种单片机的iap方法,包括:
烧写boot程序至单片机;
运行所述boot程序以更新app程序。
优选地,所述烧写boot程序至单片机,包括:
烧写所述boot程序至单片机的起始存储区域。
优选地,在烧写所述boot程序至单片机的起始存储区域之后,还包括:
将所述起始存储区域设置为ubc(用户启动区域)区域。
优选地,所述运行所述boot程序以更新app程序,包括:
通过所述boot程序与flashloaderdemonstrator(程序下载软件)建立通信;
通过所述flashloaderdemonstrator更新app程序。
优选地,所述boot程序与flashloaderdemonstrator建立通信,包括:
关闭中断;
判断是否接收到iap升级信号;
如果是,则初始化时钟和uart;
判断是否接收到flashloaderdemonstrator发送的起始码;
如果是,则解锁存储区域,并向flashloaderdemonstrator发送uart应答。
优选地,所述判断是否接收到iap升级信号之后,还包括:
如果否,则判断所述单片机是否存在app程序;
如果是,则运行该app程序;如果否,则运行所述boot程序。
优选地,所述判断是否接收到flashloaderdemonstrator发送的起始码之后,还包括:
如果否,则发送无应答响应,并锁住所述单片机存储区域;
判断所述单片机是否存在app程序;
如果是,则运行该app程序;如果否,则运行所述boot程序。
优选地,所述flashloaderdemonstrator更新app程序,包括:
所述flashloaderdemonstrator通过get指令和/或rm指令和/或wm指令和/或em指令和/或go指令将新app程序写入所述单片机。
优选地,所述app程序,还用于:
判断是否接收到iap升级信号;
如果是,则启动boot程序。
另一方面,本发明还提供一种单片机的iap系统,包括:
boot程序烧写模块,用于烧写boot程序至单片机;
app程序更新模块,用于运行所述boot程序以更新app程序。
本发明提供一种单片机的iap方法,包括:烧写boot程序至单片机;运行所述boot程序以更新app程序。本发明提供的方法能够自行烧写boot程序至单片机中,运行所述boot程序时,能够与外界的flashloaderdemonstrator建立通信,从而通过flashloaderdemonstrator对单片机中的程序进行iap升级,使得原本不带boot程序的单片机能够进行iap升级。
本发明还提供一种单片机的iap系统,也具有上述有益效果,不再赘述。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明第一种具体实施例所提供的一种单片机的iap方法的流程图;
图2为本发明第一种具体实施方式所提供的boot程序烧写示意图;
图3为本发明第一种具体实施方式所提供的更新app程序示意图;
图4为本发明第二种具体实施方式所提供的一种单片机的iap方法的流程图;
图5为本发明一种具体实施方式提供的boot程序的功能框架图;
图6为本发明一种具体实施方式提供的一种单片机的iap系统组成示意图。
具体实施方式
本发明的核心是自行烧写boot程序至单片机中,运行boot程序对单片机进行iap升级。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
请参考图1,图1为本发明第一种具体实施例所提供的一种单片机的iap方法的流程图,该方法包括:
步骤s11:烧写boot程序至单片机。
为了实现单片机的iap功能,单片机需要具有完整的boot工程。boot工程一般包含两部分,一部分为中断向量表,另一部分为boot代码,代码中含有单片机与flashloaderdemonstrator进行uart通信的协议,用来完成app工程的下载。uart,是一种异步收发传输器,是电脑硬件的一部分。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,uart通常被集成于其他通讯接口的连结上。
flashprogrammemory容量在8kbytes以上的stm8单片机具有rom区,芯片出厂时boot程序就被固化在rom区内。但是容量为8kbytes的单片机没有配置rom区,因此不自带boot程序,需要设计人员自行编写,并设定其存放位置。
进一步地,为了在单片机启动时能够先运行boot程序,所以要烧写所述boot程序至单片机的起始存储区域。
更进一步地,在烧写所述boot程序至单片机的起始存储区域之后,还可以将所述起始存储区域设置为ubc区域。
具体地,如图2所示,图2为本发明第一种具体实施方式所提供的boot程序烧写示意图。当单片机型号具体为stm8s003k3时,其启动时指针指向0x008000(系统复位后的启动地址,由硬件决定),中断向量表紧跟其后,然后跳转至0x008080开始运行程序代码。由于boot程序要先于app程序运行,因此从0x008080开始存放boot程序代码是合理的。在stvd(stvisualdevelop)是免费stmcu工具套件的一部分,从构建和调试应用代码到微控制器编程提供了简便易用且高效的开发环境。在stvd开发环境下编写bootproject,经过cosmic编译后,生成.s19文件,然后通过stvp烧写至单片机中。为了防止boot程序被app程序无意的修改,因此设置boot程序所在区域为ubc区域更加安全,写保护之后,该区域不能随意修改。
值得指出的是,对于型号为stm8s003k3的单片机来说,其中断向量表的地址是硬件固定的,单片机产生中断时,指针首先会跳转到中断向量表(0x008000~0x00807f)中的某个地址(硬件决定),然后执行0x82指令(stm8系列单片机的操作码)跳转到对应的中断函数入口。例如产生tim1update中断,指针跳转至0x008034,然后执行0x82指令跳转至tim1_upd_ovf_trg_brk_irqhandler(),执行该中断函数。
步骤s12:运行所述boot程序以更新app程序。
bootproject通过stvp烧写入单片机之后,就可以利用flashloaderdemonstrator通过uart烧写appproject。app工程同样由两部分构成,分别为中断向量表和app代码。
请参考图3,图3为本发明第一种具体实施方式所提供的更新app程序示意图。
在stvd开发环境下编写appproject,经过cosmic编译后生成.s19文件,然后通过flashloaderdemonstrator将.s19文件转换成一系列0、1数据,按照st公司制定的通信协议通过uart传输至单片机。单片机按照通信协议解析接收到的数据,并存入相应的地址,实现app工程的下载。
值得指出的是,bootproject和appproject为独立的两个工程,各自具有中断向量表。当app程序正常运行时,单片机产生中断后,指针依然会跳转至0x008000~0x00807f中的某个地址,即bootproject的中断向量表,而没有跳转至appproject的中断向量表。因此,需要把bootproject的中断向量表重映射到appproject的中断向量表中来解决该问题。也就是当单片机产生中断时,指针先指向bootproject的中断向量表,然后执行0x82指令跳转至appproject的中断向量表地址(不再是中断函数入口地址),在appproject的中断向量表中执行0x82指令跳转至appproject中对应的中断函数入口。
请参考图4,图4为本发明第二种具体实施方式所提供的一种单片机的iap方法的流程图,该方法包括:
s121:通过boot程序与flashloaderdemonstrator建立通信。
当单片机上电时,首先启动boot程序,由于iap升级需要向flashprogrammemory内写入新的app程序(包括中断服务函数的擦除重写)。因此boot程序与flashloaderdemonstrator之间的uart通信无法使用中断方式,只能采用轮询方式,进入boot程序后先关闭所有中断。
这时,单片机判断是否接收到iap升级信号,具体地,检验是否按下了boot启动键(pb.6是否拉低)作为iap升级的启动信号。如果没有按下boot启动键,则检测单片机是否已经烧录了app程序,如果没有app程序,则跳转至boot程序的起始地址(0x008000)重新运行。一般地,如果单片机没有烧录app程序,那么单片机在boot程序内循环运行并等待iap升级的做法是安全可靠的。如果已经烧录了app程序,那么就跳转至app程序的起始地址(0x009000)开始运行。
如果接收到iap升级信号,也就是boot启动键按下,则进行时钟和uart的初始化操作。例如在一种具体实施方式中可以将时钟设定为内部高速时钟,uart设定为8bit数据位,1bit偶校验,波特率为9600。
判断是否接收到flashloaderdemonstrator发送的起始码,例如可以判断预设时间内,比如5s内,没有接收到flashloaderdemonstrator下发的起始码,单片机就上传无应答指令(0x1f)至flashloaderdemonstrator,然后锁住flashprogrammemory和dataeeprom,以防被无意的擦写。然后根据app程序是否为空来决定程序跳转的地址。
如果在预设时间内,比如5s内,收到flashloaderdemonstrator下发的起始码,单片机就解锁flashprogrammemory和dataeeprom,然后上传应答指令(0x79)至flashloaderdemonstrator,等待flashloaderdemonstrator下发其他指令来对flashprogrammemory和dataeeprom进行相关操作。成功解锁存储区域,并向flashloaderdemonstrator发送uart应答,单片机与flashloaderdemonstrator就建立了通信。
s122:通过所述flashloaderdemonstrator更新app程序。
st公司规定flashloaderdemonstrator和单片机之间可以传递5类指令来进行操作,分别为get指令、rm指令、wm指令、em指令、go指令。下面给出各指令的功能简介。
get指令:flashloaderdemonstrator通过get指令来获得单片机boot程序的版本号和其所支持的操作指令,针对不同的版本号,flashloaderdemonstrator会选择不同的上位机驱动程序来和boot程序匹配。
rm指令:flashloaderdemonstrator通过rm指令来读取单片机中指定地址的数据。在flashloaderdemonstrator的操作界面中,如果选中“verifyafterdownload”选项,当app程序下载完成之后,flashloaderdemonstrator会读取单片机中的程序和下载的程序文件进行对比校验。另外,flashloaderdemonstrator还可以将app程序从单片机中提取出来,并转化成.s19文件。提取程序的过程也需要使用rm指令。
wm指令:flashloaderdemonstrator通过wm指令向单片机的指定地址写入数据,用于程序的下载,是最核心的功能。
em指令:flashloaderdemonstrator通过em指令擦除指定地址的数据。在下载新的app程序之前,可以先擦除存放原有app代码和dataeeprom数据的整个区域,提供一个干净的下载环境。
go指令:单片机接收到go指令后,会先锁住flashprogrammemory和dataeeprom,然后跳转至go指令指定的地址。一般情况下,flashloaderdemonstrator在将程序下载完成后会发送go指令,令程序跳转至app程序的入口地址运行。
通过上述指令就可以完成app程序的iap升级。
值得指出的是,当单片机正常工作时运行的是app程序,这时如果需要进行iap升级,就需要在app程序中加入跳转至boot程序的判断条件:可以规定按下boot启动按键(pb.6引脚拉低)则跳转到0x008000运行boot程序。
app程序中条件跳转代码如下:
更进一步地,为了实现app程序和boot程序的相互跳转,执行如下汇编代码:
_asm("ldwx,sp");
_asm("lda,$ff");
_asm("ldxl,a");
_asm("ldwsp,x");
_asm("jpf$address");
之后,指针会指向address(address为指针跳转的目的地址,例如要跳转至boot程序的起始地址0x008000,则address为8000,要跳转至app程序的起始地址0x009000,则address为9000)。
请参考图5,图5为本发明一种具体实施方式提供的boot程序的功能框架图。
在该框架下,能够与flashloaderdemonstrator建立通信,并对单片机进行iap更新。
请参考图6,图6为本发明一种具体实施方式提供的一种单片机的iap系统组成示意图。
本发明还提供一种单片机的iap系统,包括:
boot程序烧写模块601,用于烧写boot程序至单片机;
app程序更新模块602,用于运行所述boot程序以更新app程序。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的一种单片机的iap方法及系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。