[STM8]

对于boot IAP的UBC的资料学习心得

[复制链接]
1449|14
手机看帖
扫描二维码
随时随地手机跟帖
buzhichi|  楼主 | 2014-11-30 22:13 | 显示全部楼层 |阅读模式
本帖最后由 buzhichi 于 2016-4-13 21:40 编辑

1.整个flash可以分为UBC和非UBC,就是用户区和应用程序区。看到这里,就会觉得有难度了,分成两个区还要,用一个区升级另一个区,那么我要先搞清楚怎么分成两个区,两个区主要是UBC区到底有什么特性,有什么要注意的地方,这时,我开始查阅资料。并且觉得很难。

2.经过一通查资料后发现,其实所谓UBC,完全可以忽视掉,flash就是一整片,我们随意规定,比如前面4K当做自己的boot,然后后面的当做应用程序,只要在前面4K去写后面应用程序区域的flash就可以了。写flash都是库函数,忘掉UBC,并且把UBC设置为0,不会设置就用默认就是0.

3.为什么flash要划分出UBC呢,其实UBC就是保护级别高,所谓高就是不会被擦写,你设置成UBC的区域,在应用程序中是无法擦写UBC区域的数据,这样保证即使你的程序跑飞或者bug去误操作boot程序所在的flash也很安全。设置为UBC,用swim也无法擦写,要想擦写要先改选项字 。如果不用boot并且应用程序中没有对flash的擦写操作,可以把整个flash定义为UBC区域,所谓定义成UBC区域,也就是说提高一下安全级别。

4.到这里,可以换一个概念,flash分为UBC区域和应用程序区,其实可以说成把一片flash分成两个安全级别,一个安全级别高,就理解为不能被擦写,放boot程序,一个安全级别较低,falsh可以给擦写,放应用程序。如果你不在意安全级别保证应用程序不会去擦写boot区域的数据就完全可以不用管安全级别,所以UBC不是必要的。

5.所以建议刚开始搞IAP,先不要分析UBC了,就是一整片flash。用前面的更新后面的。


以上是我对于UBC的理解,跟大家分享一下,刚开始搞的时候对这些有些迷惑,最后发现花了很多时间都是不必要的,希望可以帮到和我一样的初学者。

我用的型号是STM8S105C6 32K的程序量,我把boot放在了前面4K的程序。在boot程序中做了中断向量映射如下
__root const long reintvec[]@".intvec"=

       {   0x82008080,0x82009004,0x82009008,0x8200900c,

           0x82009010,0x82009014,0x82009018,0x8200901c,

           0x82009020,0x82009024,0x82009028,0x8200902c,

           0x82009030,0x82009034,0x82009038,0x8200903c,

           0x82009040,0x82009044,0x82009048,0x8200904c,

           0x82009050,0x82009054,0x82009058,0x8200905c,

           0x82009060,0x82009064,0x82009068,0x8200906c,

           0x82009070,0x82009074,0x82009078,0x8200907c,

       };

大家注意下,从第二个开始0x82009004,改成了9,因为应用程序是从9000开始的,前面的8000到8fff留给了boot
boot跳转指令如下
inline void JumpToApp(void)
{
        if(*(u16*)(0x9000) == 0x8200)
        {
                asm("LDW X,  SP ");
                asm("LD  A,  $FF");
                asm("LD  XL, A ");
                asm("LDW SP, X ");
                asm("JPF $9000");
        }
}




在应用程序中,修改icf文件如下:

define region NearFuncCode = [from 0x9000 to 0xFFFF];

define region FarFuncCode = [from 0x9000 to 0xFFFF];

define region HugeFuncCode = [from 0x9000 to 0xFFFF];



对上面的修改做点说明,在boot中做了中断向量映射,其实这时的中断向量是给应用程序用的,对于boot是错的,但是我在boot中没有用到任何中断,所以就没问题。如果想在boot和应用程序中都用中断,可能会复杂。

mmuuss586| | 2014-12-1 12:12 | 显示全部楼层

谢谢楼主分享;

使用特权

评论回复
wmslecz| | 2014-12-1 19:22 | 显示全部楼层
感谢楼主分享..准备先把手上的项目完成后开始搞IAP..O(∩_∩)O~~

使用特权

评论回复
GERALDWONG| | 2014-12-15 11:13 | 显示全部楼层
请问楼主有用过STM8的自带bootloader么,就是BOOT ROM里面的代码。

使用特权

评论回复
小班儿| | 2014-12-15 11:25 | 显示全部楼层
感谢楼主分享!!!

使用特权

评论回复
buzhichi|  楼主 | 2016-8-5 10:10 | 显示全部楼层
GERALDWONG 发表于 2014-12-15 11:13
请问楼主有用过STM8的自带bootloader么,就是BOOT ROM里面的代码。

用过串口的,我还分析了协议,自己写了一个上位机直接用官方的boot协议。  
当需要升级程序时:
1.PC软件发送指令给stm8S105应用程序,应用程序接收到命令后修改选项字,打开官方的boot通过uart下载,给PC软件回应,然后看门狗重启。
2.看门狗重启后上电是有先运行一下官方的boot的,因为选项字里面已经打开了,如果未收到指令则执行应用程序,这个世间好像是1秒。
3.PC软件发送完升级指令并得到返回后就一直发送链接boot的命令,这时候stm8看门狗重启运行官方的boot,就开始下载程序了。
4.下载完boot后mcu会自动跳转到应用程序执行,在应用程序中检测自己是否正常,如果正常则取消boot选项字。下次上电不会运行官方boot。如果不正常则取消不了,下次上电还是运行boot程序,不会把板子更新成砖头。

使用特权

评论回复
buzhichi|  楼主 | 2016-8-5 10:13 | 显示全部楼层
请教一下大家,怎么在ram中更新flash,程序怎么定义到ram中运行的。一直没搞懂啊,更新flash比较慢。

使用特权

评论回复
yinhaix| | 2016-8-5 11:23 | 显示全部楼层

使用特权

评论回复
buzhichi|  楼主 | 2016-8-6 09:14 | 显示全部楼层

程序怎么在ram中写flash呢,我现在用自己写的boot,更新一个要十几秒,超过15秒了,是用的字写入的方式。一次四个字节。

使用特权

评论回复
zhuotuzi| | 2016-8-6 16:19 | 显示全部楼层
用到了编程的指令,内部在系统编程。

使用特权

评论回复
奔牛滚滚| | 2016-8-6 21:02 | 显示全部楼层
楼主用的什么编译器?

使用特权

评论回复
buzhichi|  楼主 | 2016-8-11 17:42 | 显示全部楼层
奔牛滚滚 发表于 2016-8-6 21:02
楼主用的什么编译器?

IAR  STM8

使用特权

评论回复
80x86abc| | 2016-8-26 17:38 | 显示全部楼层
bucuode fenxiang

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

65

帖子

1

粉丝