arm芯片,远程空中升级程序技术方案

arm芯片,远程空中升级程序技术

背景

产品上线之后,若程序存在bug或者需要增加新功能模块,在现场升级维护特别困难,需要维护人员取出控制板,来升级程序。为了方便维护人员在现场升级产品,我们做这个升级产品。不用拆装设备,实现远程升级产品。

需求分析

所谓远程空中升级,就是利用无线网络给指定MCU更新程序。在这里的无线设备我使用的是蓝牙(CC2541芯片或者CC2542芯片),使用的MCUarm核的一款芯片。升级工具的终端设备是手机。当然了,手机中装了专门升级的apk

系统介绍

keil 或者 iar 软件生产的 hex 文件,加载到手机的 apk 软件, apk 通过手机蓝牙发生给中转器蓝牙设备,蓝牙设备接受到手机发生过来的数据,通过 usb spi iic 或者 uart 中的某个接口再将数据发送给 mcu 芯片, mcu 芯片接受到数据后,将数据依次烧写到 flash 指定的位置,待到 hex 文件全部烧写到 mcu 芯片后,重启 mcu 芯片,下次上电,若满足一定的条件,则运行新的程序 , 这就完成了整个空中升级的过程。

 

手机(升级APK)

这个升级apk实现的主要功能很简单,就是将编译生成的hex文件,分成几百个小块数据包,然后将这些小块数据包封装成规定的帧格式,发送给中转器蓝牙设备。

当然了,在产品中,升级apk还包括一些和产品相关的功能,比如不允许每个客户随便升级产品,必须有权限才能升级,就算允许客户升级产品,外界环境也必须是安全才能升级,这就涉及到安全模式,普通模式切换等等。作为学习的demo,不需要了解这么多。了解主要功能就行了。

 

中转器(蓝牙)

中转器的主要功能就更简单了,就是透传数据,它就是一个中介的角色。它负责将手机上的数据,发送给MCU芯片。

实际中,这个中转器,配有电池,不使用的情况下,保持低功耗,耗电很少,要使用的时候,通过按键去唤醒低功耗,操作结束后,又会进入低功耗。所以,这个中转器也是一个低功耗的可穿戴设备。哈哈。

MCU(ARM芯片)

升级过程中,MCU实现的功能也很简单,就是将接收到的升级数据,烧写进指定的flash里面,然后重启,校验刚烧写进去程序的正确性,如果正确则运行新程序。

虽然mcu升级的过程简单,但是明白MCU升级的原理,就不是很容易了。

在这里我将详细的对这个过程进行说明,会解答一些困惑。

一般情况下,我们更新程序,都是通过jtag接口或者SWD接口在线烧写程序,这个烧写程序的过程,就是将keil或者iar软件编译生成的hex文件烧写进flash指定的位置。所以swd烧写工具里面,一般带有先擦除flash,再写flash的操作。更新程序的原理,大家要懂的。

(说个题外话,有些人会通过jtag接口,读取flash里面的数据,从而获取你的程序代码,你的东西轻而易举的就被别人复制了,所以一些加密芯片没有jtag接口。防止窃取。而且加密芯片里面flash数据是加密的,就算你读取了,也是乱码。这里推荐北京同方公司的加密芯片)

明白了,更新程序原理之后,现在讲如何升级。

大家要知道实现升级程序的功能,MCU芯片必须有两套程序,比如运行程序A的时候,可以通过烧写flash更新程序B,同理,运行程序B的时候,可以通过烧写flash更新程序A,是不是有些人会疑问,为什么不能运行程序A的时候,就更新程序A,这当然是不行的,芯片正在运行程序A,你却重写了程序A区域对应的flash数据,这就会使程序跑飞的。其实对于我们来说,没有必要用两套一模一样的用户代码程序,这会增加flash占用空间的,我们只需要一套用户代码程序,另一套是简单的操作flash的程序代码就行(行业中叫bootloader)。升级过程中会涉及到两套程序进行切换。       

MCU芯片一上电,就是从首地址开始运行的,所以首地址存的是异常中断向量表,运行了向量表,向量表里面存的是程序执行的地址,运行了相应的向量表,就会运行相应的程序代码。

下面的就是设计的升级过程,

如图1的初始态,flash首页地址存的是uart bootloader的向量表,flash地址区[0x0003 8000 - 0x0003 D000]存的是uart bootloader的代码,所以一上电,就运行的是uartbootloader的程序。flash地址区[0x0000 0200 - 0x0000 0400]存的是用户cos的向量表,flash地址区[0x0000 0400 - 0x0001 0000]存的是用户cos的代码,当运行uart bootloader程序的时候,如满足一定条件,则会跳转到用户cos区域运行。相对于要升级的用户新cos,初始态的用户cosOld User cos, 将要更新的cosNew User cos

下面详细介绍一下升级时候,各个状态。

1.       初始态:出厂后的设备中,芯片运行着用户程序,flash首页[0x0000 0000 - 0x0000 0200]的向量表指向old user  s cos区。这是出厂态。芯片出厂的时候,UARTbootloder已经烧写在fash地址区[0x0003 8000 - 0x0003 D000]

芯片一上电,根据首地址的向量表指向,运行uartbootloader程序,如箭头1。若        满足条件,uartbootloader程序重新映射启动向量表,如箭头2。更改后的向量表        指向新的程序区域,运行新程序,如箭头3

2.       下载态:要烧写新的用户程序(new user s cos)就得先处于下载态,下载态的时候,芯片运行uartbootloader程序。芯片一上电就处于下载态,如果900ms内,接受到升级请求,就能升级芯片。如果芯片运行用户程序,先通过升级命令重启thk88,使其在下载态。当MCU芯片被复位后,MCU芯片就运行UART bootloader程序。因为UART bootloader程序的功能是通过串口接口,操作flash擦除 and 读写。所以通过串口接口,按照规定的协议发送新cos的代码部分给MCU芯片的flash区,更新数据。

3.       用户态:当用户cos的代码部分下载结束后,将最后更新0x0000 0400地址处的向量表,当MCU芯片被复位后,满足一定条件后,MCU芯片将从flash中的新程序(new user s cos)运行,芯片运行在用户态。

状态图

 

 

 

升级还涉及到了稳定通信,安全模式and代码续传问题。比如像这些敏感的操作必须在安全模式下进行。还有升级升到一半的话,断电了,下次上电,准备继续升级,又如何操作。下一篇博客再讲。

你可能感兴趣的:(技能)