stm32L071xx使用其双bank功能实现升级备份功能

一、升级备份的需求

单片机的升级备份功能,主要是解决升级时断电导致系统永久死机的问题。一般的做法是使用IAP方式升级+用户Bootloade方式切换启动地址。网上的例子也很多,这里先说一下另外一种升级方式(ISP)和切换方式(SystemRom),关于单片机的IAP升级方式,后面会出一篇单独的文章来解释。

二、升级方式

IAP即在应用编程,说白了就是依靠单片机的应用程序来对单片机进行升级。当然了这个应用程序需要单片机工程师自己实现,可以通过wifi或者sd卡或者串口等其他可以获取升级包的接口接收数据,然后将接受到的数据包写到单片机的flash里面去。                      ISP即在系统编程,说白了就是依靠单片机的系统程序来对单片机进行升级。升级过程中应用程序是不运行。需要外界通讯接口(uart/spi)按照系统升级定义的通讯协议传数据到系统,系统自身会自动去烧录flash。

stm32L071xx支持ISP方式升级,几乎所有单片机都支持此种升级方式。stm官网AN2606介绍了那些型号的单片机支持isp功能,即片上bootloader升级方式。

stm32L071xx使用其双bank功能实现升级备份功能_第1张图片

上图为AN2606中截取的支持isp升级的单片机型号。我们使用的stm32L071CB没有列出来,难道是支持STM32L0全系列吗?

stm32L071xx使用其双bank功能实现升级备份功能_第2张图片

stm32L071xx使用其双bank功能实现升级备份功能_第3张图片

从上图中看到,我们的猜测是对的,STM32L0全系列支持ISP升级。并且我们的STM32L071CB支持多种升级接口(uart/spi/i2c/usb)。

stm32L071xx使用其双bank功能实现升级备份功能_第4张图片

上图中我们又可以发现,使用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特有的启动方式:stm32L071xx使用其双bank功能实现升级备份功能_第5张图片

双bank特有的启动流程:stm32L071xx使用其双bank功能实现升级备份功能_第6张图片

但是,但是,但是,我的升级方式与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不变;

 

升级流程图:stm32L071xx使用其双bank功能实现升级备份功能_第7张图片

 

stm32L071CB的地址空间如下:

stm32L071xx使用其双bank功能实现升级备份功能_第8张图片

 

双bank功能开启后的地址空间:stm32L071xx使用其双bank功能实现升级备份功能_第9张图片

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.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(单片机)