OTA功能
必要功能
必须实现的功能(OTA在更新的时候需要用到的服务):
1.没有OTA事件时,跳转到应用程序区A区。
2.发生OTA事件时,更新应用程序区A区程序。
如果有OTA事件,远程升级先要通过4G模块,联网连接服务器下载最新版本的程序。先将A分区的老程序全部擦掉,再将2.0版本程序写进去,然后跳转到A分区2.0最新版本运转。
如果我们没有做分区,咱们没有BootLoader,如果一来更新,一擦除flash,谁能够帮助你把2.0版本的程序写进A区的?
辅助功能
方便使用的额外功能:
1.串口IAP功能,通过串口更新应用程序区A区程序(和OTA最终的目的相同,都是更新A区的程序)。我们单片机例如GD32、STM32都会有个串口下载,就是先把BOOT0引脚变成高电平然后复位,就可以下载。然后BOOT0引脚变成低电平然后复位可以变成正常运转的模式。但是如果我们做了IAP的这个功能,就方便没有仿真器的人对程序进行更新。
2.设置物联网平台要求的OTA初始版本号。
3.利用外部Flash存放多个程序文件,需要哪个就把哪个更新到应用程序区A区。
解答
一旦我们使用了BootLoader程序,就需要对单片机的Flash进行分区,一旦分了区之后,我们还需要涉及到分区之间的一个跳转,为什么我们要费这个这么大的力气?
如果说不需要BootLoader,也就没有什么所谓的分区了,但是一旦擦除Flash,设备将会变成砖头,因为没人帮助我们把新程序放入单片机中了。
所以说我们把flash分为B区和A区,B在前,A在后,对于单片机而言,它可不管你分了几个区,只要一上电一复位都要从Flash的起始位置开始运行,所以说B在前,A在后,所以单片机一复位就会先进入BootLoader程序。
我们要知道,OTA事件并不是频繁发生的,所以这时候我们设置一个OTA Flag,这个Flag用来标记是否有OTA事件。平时没有OTA事件的时候,查看OTA Flag标志位,如果没有标志位就要通过一个函数指针从B分区跳转到A分区。所以说OTA的第一个任务就是在没有OTA事件时,跳转到应用程序分区。
如果说有了OTA事件了,我们的4G开发板模块通过服务器将2.0版本下载来,这个 时候我们就通过OTA Flag来判断,这时候我们就可以调用NVIC_SystemReset()对单片机进行重启,重启之后就又会从Flash进入B区的BootLoader程序。这时候BootLoader会发现OTA Flag标志位有效,那么就会更新A区的程序。注意,所谓擦除Flash只是擦除A区所占的这一部分扇区,不是说把整个Flash都擦了。
那么我们来说,为什么必须B区在前面,A区在后面呢?
那么如果我们A区在前面,B区在后面,比如现在我们有更新,我们已经把新的程序下载到B区了,然后我们A区的程序检测到OTA Flag有效,然后我们跳转到B区,B区来负责更新A区,现在这样是不是顺眼多了?但是这里有个致命的问题,那就是我们要更新程序,肯定要把该分区给擦除,一旦A区擦除,那么单片机意外重启,就会导致单片机变成砖,因为程序只下载了一部分,但意外终止了,A区无法正常运行了,但单片机只能从开头开始运行。