一、升级备份的需求
单片机的升级备份功能,主要是解决升级时断电导致系统永久死机的问题。一般的做法是使用IAP方式升级+用户Bootloade方式切换启动地址。网上的例子也很多,这里先说一下另外一种升级方式(ISP)和切换方式(SystemRom),关于单片机的IAP升级方式,后面会出一篇单独的文章来解释。
二、升级方式
IAP即在应用编程,说白了就是依靠单片机的应用程序来对单片机进行升级。当然了这个应用程序需要单片机工程师自己实现,可以通过wifi或者sd卡或者串口等其他可以获取升级包的接口接收数据,然后将接受到的数据包写到单片机的flash里面去。 ISP即在系统编程,说白了就是依靠单片机的系统程序来对单片机进行升级。升级过程中应用程序是不运行。需要外界通讯接口(uart/spi)按照系统升级定义的通讯协议传数据到系统,系统自身会自动去烧录flash。
stm32L071xx支持ISP方式升级,几乎所有单片机都支持此种升级方式。stm官网AN2606介绍了那些型号的单片机支持isp功能,即片上bootloader升级方式。
上图为AN2606中截取的支持isp升级的单片机型号。我们使用的stm32L071CB没有列出来,难道是支持STM32L0全系列吗?
从上图中看到,我们的猜测是对的,STM32L0全系列支持ISP升级。并且我们的STM32L071CB支持多种升级接口(uart/spi/i2c/usb)。
上图中我们又可以发现,使用ustat接口升级方式为ISP时可以参考AN3155文档。这样就直接调到AN3155就可以了。
AN3155中主要描述了使用USART进行ISP方式升级时涉及到的通讯格式个指令以及host和slave端的状态机。
按照文档来就好了,有什么问题可以留言。
至此ISP方式升级也介绍完毕!接下来是双bank功能!!!
三、双bank功能
双bank功能在stm系列中支持的并不多,但是我们选择的STM32L071CB就是其中一个带有双bank功能的小甜心。双bank Flash,可以在执行程序的同时对另一个bank进行擦除和编程的操作。也可以对两个bank进行switch,switch后的flash的bank地址就会做交叉变换。还有一个特点就是带有双bank功能的stm32有其特有的启动方式(重点)。带有双bank功能的stm32可以更加轻松地实现备份升级,请参考AN4767的介绍。除了文档之外,还有一个空中升级双bank的demo叫X-CUBE-DBFU,写的很详尽了。需要的同学可以自行下载。后面会单独出一篇写X-CUBE-DBFU的文章。
带有双bank功能的mcu特有的启动方式:
双bank特有的启动流程:
但是,但是,但是,我的升级方式与X-CUDE-DBFU还不一样。X-CUDE-DBFU采用的是IAP的升级方式,一个bank在运行的时候,直接接收串口数据,然后写到另一个bank中去,接收完毕并且写完成后就设置UFB位,切换到另一个bank中去运行,这样乒乓操作,就实现了升级备份功能。
四、具有特色的升级备份方式
下面是我自己的升级备份方式:
借助于双bank单片机特有的启动方式,将BFB2置1。每次系统都从ROM启动,然后尝试从bank2启动,失败后从bank1启动。正常情况下都是从bank2启动就ok。升级时只升级bank2,升级失败导致bank2损坏的情况下从bank1启动,再一次升级时还是对bank2升级,直至升级成功。自动切换到bank2运行。
这一过程需要确认的问题点如下: 1.isp升级模式下,bank地址空间是否做了交换? 答:没有交换,因为Boot0为1进入Bootloader时UFB一直为0; 2.双bank如何做乒乓切换呢?答:不需要做乒乓操作,正常启动从Bank2,异常启动从Bank1,无论正常异常都烧录Bank2; 3.如何从正常启动模式进入烧录模式?答:拉高Boot0然后复位单片机就好了; 4.烧录到bank2的程序,程序的基地址应该是0x08000000还是0x08010000?答:bank2上程序运行的前提是bank1和bank2做了地址交换,bank2的地址是0x080000000了,cpu要取bank2的数据必须到0x08000000上获取,so程序的基地址应该保持0x08000000不变;
升级流程图:
stm32L071CB的地址空间如下:
双bank功能开启后的地址空间:
UFB:是一个很关键的点,全称是User Flash Bank,UFB=1就会将bank1和bank2的地址空间做交换,UFB=0 bank1和bank2保持其物理顺序上排续的地址空间,此bit掉电为0。在Boot0被拉高时,复位mcu就会进入ISP升级模式,此时UFB为0,所以bank没有被交换地址空间。
五、遇到的问题点
1.bank1和bank2烧录正确的程序后,系统无法启动?答:从systemRom启动会关闭stm32中断,导致systick中断死机。请参照http://www.eemaker.com/stm32l0-iap-no-bootloader.html 讲解的非常好
2.