搜索
bottom↓
回复: 138

STM8 TinyBoot V5.3 源码

  [复制链接]

出0入0汤圆

发表于 2014-9-11 20:05:44 | 显示全部楼层 |阅读模式
本帖最后由 way2888 于 2014-9-12 19:39 编辑

MCU里面的工程用CD-EWSTM8-1311编译生成,如果1422生成的代码估计有问题的,大致看了下反汇编,貌似1422版本下的把RET指令跳到FLASH里再返回的
增加了用户程序和BOOTLOADER合并生成HEX文件,供下载器一次烧写完成完整编程

大概介绍一下使用方法吧:
合并HEX文件:
打开用户的HEX文件,并设置好BOOTLOADER配置,然后点击文件菜单里的合并HEX固件即可让BOOTLOADER和用户程序合为一个文件

用户程序下载:
首先运行软件,根据自己的编程要求设置好Bootloader的选项,其中包括选择芯片型号,芯片容量,和使用的UART(针对S207,S208,因为它有2个UART),以及使用的通信波特率.
如果使用UART自定义接口的,在未保证你的程序一定能响应就绪命令而跳转到Bootloader之前,建议保留使用IO状态进入Bootloader(只在芯片上电的时候,IO状态判定是否进入),
如果你设置的Bootloader是禁止IO状态进入的话,而你的应用程序又未调通UART时,这样的情况下升级是会变砖的.因为Bootloader没有强制延时等待升级的功能.
当设置好你要求的Bootloader后,点击文件菜单里的保存Bootloader,这样就生成你刚才设置的Bootloader文件.再通过下载器(ST-LINK)下载到芯片中.
此后,你若需要下载程序只需要打开本软件,打开你要下载的文件,确认当前的Bootloader设置与写进芯片里的设置要一致后,点击下载即可.
如果是使用UART自定义接口跳转到Bootloader的话,在点击下载之前,先在帮助里的就绪文本框里输入你应用程序需要的十六进制数据.再点击下载即可.

Bootloader更新:
首先设置好新的Bootloader设置,除CHIP和SIZE外,其余的可以和芯片里的设置可以不相同(CHIP和SIZE绝对要和写进芯片里的设置要一致)
通信里的波特率(记住,不是Bootloader的BPS)必须与芯片内的设置一致,然后点击文件的更新Bootloader,则可更新新设置的Bootloader.
更新Bootloader后,再下载用户程序即可(方法见上)
举个例子吧:
         原来写到芯片的UART的BPS是115200,现在希望新Bootloader使用9600通信
        1.先设置Bootloader的BPS为9600,选择通信的波特率要与芯片的115200一致,
         2.确认其他设置都匹配,和就绪命令都设置好了,点击更新Bootloader.
         3.当显示更新完成后,更改通信设置的波特率为9600,再打开你的应用程序升级即可

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-9-11 20:31:56 | 显示全部楼层
谢谢 下来看看啦

出60入85汤圆

发表于 2014-9-11 20:38:37 | 显示全部楼层
正好项目中要弄STM8的Bootloader,参考一下

出0入0汤圆

发表于 2014-9-11 20:48:29 | 显示全部楼层
这个需要占用多大flash空间,下来学学

出20入118汤圆

发表于 2014-9-12 06:30:39 来自手机 | 显示全部楼层
这个必须mark 终于开源了

出0入0汤圆

发表于 2014-9-12 08:44:07 | 显示全部楼层
楼主,我是你的忠实粉丝,楼主有空能不能再搞个STM32的,或者,STM8&STM32合二为一的

出150入0汤圆

发表于 2014-9-12 10:11:10 | 显示全部楼层
等这个等很久了 有谁做个离线串口烧写器

出0入0汤圆

发表于 2014-9-12 10:54:19 | 显示全部楼层
stm8 bootloader,mark一下。

出0入0汤圆

发表于 2014-9-12 11:34:11 | 显示全部楼层
hello LZ5.3有什么新特性么?

出0入0汤圆

 楼主| 发表于 2014-9-12 19:43:16 | 显示全部楼层
yanyi103 发表于 2014-9-11 20:48
这个需要占用多大flash空间,下来学学

只占芯片FLASH最高地址的256字节,用户编程则按平常一样编程即可,不用做中断向量重定向

出0入0汤圆

 楼主| 发表于 2014-9-12 19:45:45 | 显示全部楼层
大风起兮 发表于 2014-9-12 10:11
等这个等很久了 有谁做个离线串口烧写器

论坛里有高手用STM32已做STM8的SWIM离线下载器了,功能还挺强的,你可以搜索一下

出0入0汤圆

 楼主| 发表于 2014-9-12 19:51:25 | 显示全部楼层
xyz2008 发表于 2014-9-12 08:44
楼主,我是你的忠实粉丝,楼主有空能不能再搞个STM32的,或者,STM8&STM32合二为一的 ...

STM32的FLASH和RAM都足够大了,再这么做就没什么意义了,一个扇区都1K~2K了,再说TINYBOOT没有做加密的,如果是你,我想都会情愿多用1K~2K空间加上自己的加密算法吧

出0入0汤圆

发表于 2014-9-12 19:54:53 | 显示全部楼层
STM8 bootloader,下来看看。

出150入0汤圆

发表于 2014-9-12 21:30:00 | 显示全部楼层
way2888 发表于 2014-9-12 19:45
论坛里有高手用STM32已做STM8的SWIM离线下载器了,功能还挺强的,你可以搜索一下 ...

楼主能不能画一个示意图,主机发送什么,从机接收什么,直到下载完毕。 有示意图有空我叫我们公司做软件的搞个串口离线烧写器

出0入0汤圆

发表于 2014-9-13 08:57:54 来自手机 | 显示全部楼层
楼主,什么时候支持stm32啊?

出0入0汤圆

发表于 2014-9-13 10:35:35 | 显示全部楼层
谢谢,上次下载的好像不能用.不知为啥

出0入0汤圆

发表于 2014-9-13 10:36:00 | 显示全部楼层
今天再学习一下

出150入0汤圆

发表于 2014-9-16 10:02:48 | 显示全部楼层
本帖最后由 大风起兮 于 2014-9-16 10:12 编辑

我使用就绪码  显示下载引导程序。。。。过一会提示通讯失败,难道是ram区太小了 不够用了?  还有个问题是,下载失败有时候提示端口占用,得重启电脑才行

出0入0汤圆

 楼主| 发表于 2014-9-16 12:10:31 | 显示全部楼层
大风起兮 发表于 2014-9-16 10:02
我使用就绪码  显示下载引导程序。。。。过一会提示通讯失败,难道是ram区太小了 不够用了?  还有个问题是 ...

这种情况应该是升级过程中,usb转串口ic复位导致,你试试更换usb转串口线看看

出150入0汤圆

发表于 2014-9-16 12:46:36 | 显示全部楼层
way2888 发表于 2014-9-16 12:10
这种情况应该是升级过程中,usb转串口ic复位导致,你试试更换usb转串口线看看 ...

恩 换了一个可以用了,但是我如果使用pin脚使能的话就没问题,还有一个问题,如果app程序本身使用了串口,正好接收了A4(就绪码),程序就停留在了bootloader的入口 死机了 上次跟你讨论过这个事,今天实践了一下,用串口调试软件给stm8发送一个就绪码,直接就死在那了。

出0入0汤圆

发表于 2014-9-16 12:48:44 | 显示全部楼层
感谢分享

出150入0汤圆

发表于 2014-9-16 12:49:39 | 显示全部楼层
大风起兮 发表于 2014-9-16 12:46
恩 换了一个可以用了,但是我如果使用pin脚使能的话就没问题,还有一个问题,如果app程序本身使用了串口 ...

还有串口被占用的问题,好像是点击下载后,在下载过程中再点一次下载按钮,就会出现串口被占用的情况,且只能重启电脑来解决。现在我在VB程序中在下载过程中将下载按钮变灰 好像解决了

出0入0汤圆

 楼主| 发表于 2014-9-16 13:02:09 | 显示全部楼层
大风起兮 发表于 2014-9-16 12:46
恩 换了一个可以用了,但是我如果使用pin脚使能的话就没问题,还有一个问题,如果app程序本身使用了串口 ...

就绪跳转bootloader是用户程序决定,所以你可以设置就绪命令足够安全才跳转就好了,比如连续20个字节指定的数据,这样就不可能轻易碰巧触发进入bootloader

出150入0汤圆

发表于 2014-9-18 13:13:50 | 显示全部楼层
way2888 发表于 2014-9-16 13:02
就绪跳转bootloader是用户程序决定,所以你可以设置就绪命令足够安全才跳转就好了,比如连续20个字节指定 ...

AAD08300204000000081C30543E404E7048581891E017B05F7858189F61A05F78581897B0543F4F7858189CC
                        :2081C3000543E404E7048581891E017B05F7858189F61A05F78581897B0543F4F7858189F5
上面一行是主机发送完bootloader给mcu后发送的数据,下面一行是我发送的hex文件的内容
其中AA和CC好理解  D08300204000000081C30这一段不知道怎么理解

AA4C4C000540FE000000000000000000CC
这一段是发完程序后发送的,也不好理解

楼主能解释下D08300204000000081C30各数的含义吗

出150入0汤圆

发表于 2014-9-18 13:19:38 | 显示全部楼层
大风起兮 发表于 2014-9-18 13:13
AAD08300204000000081C30543E404E7048581891E017B05F7858189F61A05F78581897B0543F4F7858189CC
          ...

能不能搞个界面 用于显示串口输出的内容

出0入0汤圆

发表于 2014-9-18 14:34:05 | 显示全部楼层
MARk一下。

出0入0汤圆

 楼主| 发表于 2014-9-18 19:37:03 | 显示全部楼层
本帖最后由 way2888 于 2014-9-18 19:51 编辑
大风起兮 发表于 2014-9-18 13:13
AAD08300204000000081C30543E404E7048581891E017B05F7858189F61A05F78581897B0543F4F7858189CC
          ...


这些数据你代入以下数据类型就知道了
typedef union
{   struct
    {   u16 Crc16;
        s16 Number;
        u8  BlockSize;
        u8  Cmd;
        u32 Addr;
        u8  Data[128];
    };
}UartType;

就以你的数据举个例子
AA                 帧头
4C4C              Crc16
0005              Number指的是Data个数
40                 BlockSize  S103:0x40  S105,S207:0x80                             Data数据为82xxxxxxaa,表示编程复位向量82xxxxxx就是用户程序的复位向量地址
FE                 Cmd FE:编程用户复位向量地址(当用户升级只升级数据是Data数据为0000000000,表示不编程复位向量)
00000000        Addr
0000000000     Data
CC                 帧尾

其他的你可以参考BOOT文件里的程序对照一下应该就知道了
至于为什么最后发AA4C4C000540FE000000000000000000CC
这些数据是为了当编程升级过程中失败或断电,再上电时判断是否已完整编程,如果非完整编程则停留在loader程序里等待直至升级完成为止

最近用来调试,发现每次改动同一个用户程序的时候,老是要打开文件比较麻烦,上传这一个版本V5.3.1,添加重载功能,应该还是比较好使的,使用还是一样,
只要之前打开过文件,之后只需点击下载就可以了,如果曾经保存BOOTLOADER文件或更新BOOTLOADER文件则要重新打开用户程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出150入0汤圆

发表于 2014-9-18 20:23:08 | 显示全部楼层
way2888 发表于 2014-9-18 19:37
这些数据你代入以下数据类型就知道了
typedef union
{   struct

AA4C4C000540FE000000000000000000CC 这个crc16对应的是哪几个字符计算得到的 我组合了几种都不对

出0入0汤圆

 楼主| 发表于 2014-9-19 08:00:32 | 显示全部楼层
大风起兮 发表于 2014-9-18 20:23
AA4C4C000540FE000000000000000000CC 这个crc16对应的是哪几个字符计算得到的 我组合了几种都不对 ...

boot.c文件里有计算方法,vb里也有,找找看吧

出150入0汤圆

发表于 2014-9-19 13:54:22 | 显示全部楼层
本帖最后由 大风起兮 于 2014-9-19 13:56 编辑

有没有人愿意做个离线串口烧写器
我用逻辑分析仪分析了下 暂时只能做到这个程度了
主机PC    从机mcu
就绪码        a0
ccdd          a9
bootloader(cc结束)  Ac
app          a7(校检出错发送AD)
。。。。
结束         ab
            

校检出错 重新连接PC发送内容:AA 3F D9 00 00 80 FA5 00 00 00 00 CC CC DD


bootloader的内容

3B0008AE03FF94A6ACCD006C3F002004350100003F085F35AA50E0720B5230F7C65231A1AA27E9A1CC260B3D0027E8CD01093F0020E03D0027DD3D082714A40FB7014EBA013F08D703605CA3008A25C720C4A1EE26F13501000820BB9D9D9D9DC75231720D5230FB9D9D9D9D817213505F8192BD0001819093721C505B721D505C35040000CD00AB4AB70026F8720D505FFB721D505B721C505C8190F692BD0001905CCD00B9B600815F5C72BB0002BF0281CD00C6813556506235AE50628190935F975858585858585858BF005101B80101B80001513508000093585102A480024F0251905D270702A81602A821029093B6004AB70026E281905F3F033F02200F1C0362F693CD00CF9093BE025CBF02CE03621C0008BF00BE02B30025E390C303602703CC022BC60365A1FE262DC6036EA1AA2618CD00C6AE036A9093AE9FF8CD0248A6A5BD009FF77213505FA6ABCD006C725F5235AC009FF881A1F52605AC009FFC81AE036ABF06203AB6054CB705C60364B700B605B10024165F4192C606D702E0BE065CBF06CE03625ACF036226DAB600CD0230CD0251C603645F97CD027B7213505FCE0362A300012F69C60364AE0366CD02BFB705C60364CD0230CD02A0CD00C6CD0233BE002605BE02A38000269EA6FFBD009FF73F04C603644444B700B604B10024BA3D04270EBE0690935F4158581C8000CD0248BE061C0004BF06AE0004CD027BCE03621CFFFCCF0362B6044CB70420C4A6A7CC006CA6ADCC006CAE02E0550366000055036700015503680002550369000381BF025FBF0093CC00879093B7047210505B7211505C3F002006CD00AB4CB700B600B10425F4720D505FFB7211505B7210505C81BF025FBF00AE0366D60003BB03D70003D60002B902D70002D60001B901D70001F6B900F7819093B7043F00201092BC000190F7CD00B9905CB6004CB700B600B10425EA814AB7001C0003F6B702B600B402B7013300B600B402F7B60181AA  CC
12 10 9 5 0

app
typedef union
{   struct
    {   u16 Crc16;
        s16 Number;
        u8  BlockSize;
        u8  Cmd;
        u32 Addr;
        u8  Data[128];
    };
}UartType;

AA   D083   0020    40            00                       000081C3
帧头 Crc16  Data数 BlockSize      Cmd                       Addr
                   S103:0x40      FE:编程用户复位向量地址
                  S105,S207:0x80  (当用户升级只升级数据是
                                  Data数据为0000000000,
                                  表示不编程复位向量)
0543E404E7048581891E017B05F7858189F61A05F78581897B0543F4F7858189      CC
Data                                                                                                              帧尾
:2081C300   0543E404E7048581891E017B05F7858189F61A05F78581897B0543F4F7858189F5         
结束
AAE5F6000540FE0000000082008129EEEACC

用stm单片机的串口去模拟PC端,发送接收没问题,bootloader下载到mcu里面也没问题,现在做大的应该问题是bin文件如何变成bootloader认识的格式,本人能力有限,楼主貌似也比较忙,不知有没有人愿意解决这个问题。做个软件,打开bin文件后另存为一个txt文件,内容为app[]={AA,BB,CC....},app的内容与bootloader识别的一致

出0入0汤圆

 楼主| 发表于 2014-9-19 18:11:56 | 显示全部楼层
大风起兮 发表于 2014-9-19 13:54
有没有人愿意做个离线串口烧写器
我用逻辑分析仪分析了下 暂时只能做到这个程度了
主机PC    从机mcu

为什么不生成hex格式,而用bin格式,你可以修改一下vb增加输出文本格式就好了,其实我的程序已做了这部分工作了,只是只识别hex格式,
你在vb增加保存profile这个字符串就是了,当然该值只有打开了用户程序之后才可以保存

出150入0汤圆

发表于 2014-9-19 19:52:27 | 显示全部楼层
way2888 发表于 2014-9-19 18:11
为什么不生成hex格式,而用bin格式,你可以修改一下vb增加输出文本格式就好了,其实我的程序已做了这部分 ...

这个我输出来了 输出的是@xxxxx  后面是数据  跟串口输出的值不一样,hex文件也行的,我现在修改vb 在下载的时候让串口输出的值保存到txt文件中,可惜遇到00,或者01的值时,输出会变成0和1,高位地位都不为0可以正常输出,与串口输出内容相符

出0入0汤圆

发表于 2014-9-20 08:35:08 | 显示全部楼层
下载下来,试一下。谢谢共享

出0入0汤圆

发表于 2014-10-9 17:09:02 | 显示全部楼层
非常感谢耐心回复。
下午亲测,很好很强大。
而且用stvp写了rop, 读保护之后,用stvp不允许读写了,但是用tinyboot还可以更新程序,太赞了!!!!

出0入4汤圆

发表于 2014-11-2 09:53:51 | 显示全部楼层
楼主你好  我使用的编译器是1411的 为什么我只能烧定一次?
具体操作是先用ST-LINK烧录生成好的bootload,然后可以升级软件 ,但只能升级一次
直接生成合并hex用st-link烧录后一次都无法更新  
不只道这个对应用程序是否有要求?

出0入0汤圆

发表于 2014-11-2 10:02:10 | 显示全部楼层
楼主说了要用1.311的

出0入0汤圆

发表于 2014-11-2 16:44:35 | 显示全部楼层
谢谢 下来看看啦

出0入0汤圆

 楼主| 发表于 2014-11-2 16:48:51 | 显示全部楼层
yanggexiaosa 发表于 2014-11-2 09:53
楼主你好  我使用的编译器是1411的 为什么我只能烧定一次?
具体操作是先用ST-LINK烧录生成好的bootload, ...

1.411的版本我没试过,估计多半是不可以的,因为后来的版本编译器优化后,返回都先跳到FLASH再返回的,而这个BOOTLOADER是全部在RAM运行的,所以就会出问题的,
你可以用生成的软件来试试看能否可以连续升级,因为软件生成的代码都是在1.31下编译的,不会有这个问题

出0入0汤圆

发表于 2014-11-2 17:14:40 | 显示全部楼层
标记了!

出0入4汤圆

发表于 2014-11-3 13:51:12 | 显示全部楼层
way2888 发表于 2014-11-2 16:48
1.411的版本我没试过,估计多半是不可以的,因为后来的版本编译器优化后,返回都先跳到FLASH再返回的,而这个 ...

看了楼主的贴才对bootloader有些了解,昨天研究了一天现在 我使用PIN进入BOOT是可以无限下载了。
可能无法接收到就绪码吧。
我是小白 我看了楼主的代码 是将boot引导到720字节的RAM中,掉电后仍然回到boot,就是回到boot和中转到应用程序这边真是迷迷糊糊。
我查看了HEX文件发现0x00ff00这个地方存放的是BOOT但是看代码执行0x00ff00-0x0ff0c这前的是转到应用程序  而之后则是升级APP。就是不明白是怎么转到应用程序的。

顺便问下楼主,在使用ROP后再对其解锁是不是UBC FLASH都会被清除也就是说只要是用户写的BOOTLOADER之后如需要进行升级都无法也不能使用ROP?
最后我想问一下楼主文件中BOOT.ICF内的内容是怎么去实现的  看不懂不知道查阅哪些书籍。

出0入0汤圆

 楼主| 发表于 2014-11-3 19:47:45 | 显示全部楼层
本帖最后由 way2888 于 2014-11-3 19:58 编辑
yanggexiaosa 发表于 2014-11-3 13:51
看了楼主的贴才对bootloader有些了解,昨天研究了一天现在 我使用PIN进入BOOT是可以无限下载了。
可能无 ...



__root const u32 AppRoutine @ ".reset"         这条相当于记忆用户程序的复位向量跳转,位于FLASH的最后8字节处,通过软件升级后把用户原来在0x8000的数据记忆在这处,当不需要进入BOOTLOADER或升级完成后跳转到这个地址就等于运行用户程序的0x8000的跳转地址

__root const u32 Vector @ ".intvec"         这条相当于在0x8000有一条跳转到BOOTLOADR指令

__root const u32 Entry @ ".entry"                 这条就是给用户跳转到BOOTLOADER用的,位于FLASH的最后4字节,当在用户程序中运行_run(BOOT)相当于跳转到FLASH最后4字节,而这4字节的内容是跳转到LOADER判断进入条件以后,即_cli();处,
                                为什么要这么做呢?这是因为不同IC的_cli();处不是同一个地址,为了方便用户记忆则只需跳到最后4个字节,剩下由LOADER根据自身芯片位置跳转到_cli();处

而FLASH的倒数第9字节是在进入升级程序后,当需要升级时,先把此处内容擦除,直至升级完成后才写为0xa5,表示完整编程,当升级过程中断电后重新上电,检测这里不是0xa5则停留在LOADER里直至新的程序升级完成为止,所以即使升级过程中断电的话,只要重新上电升级就可以继续正常执行用户程序了

整个思路大致就是这样了

另UBC不能设置,因为你加了写保护后,这个bootloader就无法对0x8000处写入用户程序了,至于ROP是读保护则不受影响,当ROP设置后一样可以升级程序,一样是不可以用下载器读出的

出0入0汤圆

发表于 2014-11-3 22:03:37 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-12-14 23:14:44 | 显示全部楼层
这个好,这下升级不用烧写器了

出0入0汤圆

发表于 2014-12-15 00:02:10 | 显示全部楼层
谢谢 下来看看啦

出0入0汤圆

发表于 2014-12-31 08:57:57 | 显示全部楼层
好,不错,谢谢。学习

出0入0汤圆

发表于 2015-1-3 17:38:15 | 显示全部楼层
不错。我在STM32上做了。但STM8芯片容量小。没有试过。好好学习一下。

出0入0汤圆

发表于 2015-1-3 17:55:50 | 显示全部楼层
谢谢 下来看看啦

出0入0汤圆

发表于 2015-1-24 11:23:36 | 显示全部楼层
那么问题来了.... 这种通过RAM来加载真正的BootLoader的做法, ROP白给了...
只需要自己做个读取全部FLASH的伪BootLoader即可破解...
代码中仅仅识别是否BL代码用了固定的两个字节而已
"if(*ptr == 0xaacc)          //判别Boot程序"

就算不来个RSA, 好歹做个CRC16识别吧, 即ram加载区代码含有BOOTLOADER的实际长度和CRC16, CRC16多项式别用太常用的那几种

出150入0汤圆

发表于 2015-1-24 11:40:33 | 显示全部楼层
能否搞个stm32的

出0入0汤圆

 楼主| 发表于 2015-1-24 12:22:19 来自手机 | 显示全部楼层
snoopyzz 发表于 2015-1-24 11:23
那么问题来了.... 这种通过RAM来加载真正的BootLoader的做法, ROP白给了...
只需要自己做个读取全部FLASH的 ...

这个不会的,当然,只要禁止上电io状态进入,这种只是方便调试而已,使用串口命令进入bootloader,当用户程序在跳转之前,先擦除重要的程序部分和信息,当然还要保证用户程序还能跳转和串口通信,之后再跳转到bootloader即可。

出0入0汤圆

 楼主| 发表于 2015-1-24 12:37:12 来自手机 | 显示全部楼层
snoopyzz 发表于 2015-1-24 11:23
那么问题来了.... 这种通过RAM来加载真正的BootLoader的做法, ROP白给了...
只需要自己做个读取全部FLASH的 ...

识别码只有2个是因为当时把bootloader控制在128字节内,后来增加了rs485控制的功能,已经超出128字节了,如果想要多加几个识别码,估计还有空间,这个你自己稍微修改一下就可以了,当然pc软件也要对应修改,至于什么rsa,crc则看你打算用多少flash空间了,在只有4到8k的空间,你打算只做bootloader而不考虑用户还有多少事要干吗?

出0入0汤圆

发表于 2015-1-24 14:14:53 | 显示全部楼层
本帖最后由 snoopyzz 于 2015-1-24 14:16 编辑
way2888 发表于 2015-1-24 12:37
识别码只有2个是因为当时把bootloader控制在128字节内,后来增加了rs485控制的功能,已经超出128字节了, ...


哦, 我做的BL是预留给用户远程升级的, 不光是调试用的, 所以固件本身有特殊加密还有校验,

我做的BL是在前端的, 向量表跳转模式, 这种好处是刷不死BL本身永远不会出意外, 用了101x字节吧...

这种RAM加载式的的确是省Flash, 但防止破解上还得想想办法...不能让用户从通讯数据中看出文章来实现破解

出0入0汤圆

发表于 2015-4-6 19:34:17 | 显示全部楼层
多谢楼主,这个还是比较方便的。

出20入118汤圆

发表于 2015-4-8 22:57:10 | 显示全部楼层
mark  楼主开源了

出0入13汤圆

发表于 2015-4-24 07:20:04 来自手机 | 显示全部楼层
好软件,支持了

出0入0汤圆

发表于 2015-4-24 08:47:30 | 显示全部楼层
谢谢楼主分享,有时间好好研究一下!

出0入0汤圆

发表于 2015-7-21 14:01:02 | 显示全部楼层
yanggexiaosa 发表于 2014-11-2 09:53
楼主你好  我使用的编译器是1411的 为什么我只能烧定一次?
具体操作是先用ST-LINK烧录生成好的bootload, ...

怎么看编译器是1411的??
是用IAR看的吗

出0入0汤圆

 楼主| 发表于 2015-7-21 20:51:23 | 显示全部楼层
eryueniao 发表于 2015-7-21 14:01
怎么看编译器是1411的??
是用IAR看的吗

看安装包,或在软件里查看相关的编译器信息就知道了

出0入0汤圆

发表于 2015-7-28 17:05:07 | 显示全部楼层
顶一下,楼主能将boot做这么小

出0入0汤圆

发表于 2015-7-29 08:57:54 | 显示全部楼层
非常不错的,感谢分享

出0入25汤圆

发表于 2015-9-3 00:38:56 | 显示全部楼层
测试成功,真好用。

谢谢楼主。

出0入25汤圆

发表于 2015-9-3 14:36:09 | 显示全部楼层
本帖最后由 hecat 于 2015-9-3 23:12 编辑

非常感谢楼主设计的Tinyboot,非常好用。

这两天,把作者的关于Tinyboot相关的帖子翻了个遍,阅读了每个网友的回复,整理了下面的说明文档,方便新人入手。

概述:
  Tinyboot是一个适用于STM8S系列的微小Bootloader,单片机端仅占用256B Flash空间。
  Flash中的这256B代码,和上位机程序配合,实现完整的引导加载程序功能。

  256B的Flash代码,我们称它为Bootloader,实际是一个加载器。它从上位机接收真正的
  引导加载程序,放入RAM中运行。RAM中的引导加载程序与上位机通讯,实现用户程序及
  Bootloader自身的更新。
  
  "TinyBoot For STM8 Vx.x.exe"是上位机程序,负责生成单片机端的256B Bootloader
  HEX文件、下载引导加载程序到RAM中,下载用户程序和Bootloader到单片机。还可以将
  用户程序与Bootloader合并成一个HEX文件,适合批量生产。

使用方法:
1.生成Bootloader HEX文件,并写入单片机
  A.运行上位机程序,配置“设置Bootloader”区域的信息。
    a.CHIP,选择单片机型号。
    b.SIZE,选择单片机Flash容量。
    c.UART,选择使用哪个串口作为Bootloader通讯端口。
    d.BPS,串口波特率
    e.使能PIN进入BOOT,上电时,对应端口与这里配置一致时,进入Bootloader
    f.使能PIN控制RS485
  B.菜单-文件-Bootloader-保存Bootloader,即生成Bootloader HEX文件。
  C.使用ST Visual Programmer或其他方法将HEX文件写入单片机。

2.下载用户程序
  用户程序与Bootloader的配合说明:
  A.Bootloader会自己初始化串口。参数在上位机生成HEX文件时设置,使用该参数与上位
    机程序通讯,与用户程序对串口的初始化无关。
  B.Bootloader修改了复位向量,使复位向量指向自己。单片机每次上电都首先运行
    Bootloader。下载用户程序时,不会更新复位向量,用户的复位向量保存在
    Bootloader的256B内,不会丢失。Bootloader由这个入口运行用户程序。
  C.Bootloader会判断上次用户程序下载状态,如果上次没有正常更新完成,不再跳转到
    用户程序,保持在Bootloader,等待再次下载用户程序。
  D.如果配置了“使能PIN进入BOOT”,Bootloader会在上电时检测对应端口状态,满足条
    件会进入用户程序下载状态,等待下载用户程序,否则跳转到用户程序。这种模式是
    刷不死模式,不会因为用户程序出问题导致不能启动Bootloader。
  E.Bootloader开放了入口,可以由用户程序直接进入。上位机程序,菜单-帮助,汇编代
    码“asm("JPF $8ffc");”等,就是进入方法。用户将这个入口代码放在程序合适的位
    置,就可以启动Bootloader。这种方式比较灵活,可以放在菜单里面,或检测组合键
    等,完全由用户自由发挥。
  F.上位机也提供了自定义的就绪命令,仅通过串口就可以触发启动Bootloader。预设一
    个就绪命令字串,在用户程序串口接收处设置代码,一旦检测到这个字串就启动
    Bootloader。上位机在菜单-帮助-就绪命令文本框,输入预设的就绪命令字串,联机
    下载的时候,上位机会发送这个字串,触发单片机启动Bootloader。这时候要求用户
    程序串口设置的波特率与Bootloader一致,否则无法正常下载用户程序。

  下载用户程序:

  A.首次写入的Bootloader
    a.运行上位机程序,菜单-文件-打开HEX固件,载入用户程序HEX文件。通讯设置,COM
      选对应的端口号,BPS设成与Bootloader一致。
    b.给单片机上电。
    c.上位机程序,菜单-下载,即开始下载用户程序。
    注:首次写入的Bootloader,单片机上电之后无条件直接进入Bootloader。
  
  B.Bootloader配置为“使能PIN进入BOOT”
    a.运行上位机程序,菜单-文件-打开HEX固件,载入用户程序HEX文件。通讯设置,COM
      选对应的端口号,BPS设成与Bootloader一致。
    b.将使能PIN设置为有效状态,给单片机上电。(单片机会进入Bootloader)
    c.上位机程序,菜单-下载,即开始下载用户程序。
  
  C.Bootloader使用就绪命令下载
    a.运行上位机程序,菜单-文件-打开HEX固件,载入用户程序HEX文件。通讯设置,COM
      选对应的端口号,BPS设成与Bootloader一致。
    b.设置上位机就绪命令,菜单-帮助-就绪命令文本框,输入就绪命令
    c.给单片机上电,让单片机能检测到就绪命令。(单片机会进入Bootloader)
    d.上位机程序,菜单-下载,即开始下载用户程序。
  
  D.用户程序直接进入Bootloader下载
    a.运行上位机程序,菜单-文件-打开HEX固件,载入用户程序HEX文件。通讯设置,COM
      选对应的端口号,BPS设成与Bootloader一致。
    c.给单片机上电,操作单片机(菜单或按键组合等),进入Bootloader
    d.上位机程序,菜单-下载,即开始下载用户程序。

3.Bootloader的更新
  由于片内已经有Bootloader,Bootloader的更新与下载用户程序差不多,只要单片机以
  任何一种方式进入Bootloader,通过上位机直接更新。
  A.运行上位机程序,配置新的Bootloader。
    a.CHIP,选择单片机型号,与之前保持一致。
    b.SIZE,选择单片机Flash容量,与之前保持一致。
    c.UART,可修改。
    d.BPS,可修改
    e.使能PIN进入BOOT,可修改
    f.使能PIN控制RS485,可修改
  B.通讯设置,COM选对应的端口号,BPS设成与旧版本(单片机内)的Bootloader一致。
  C.用“2下载用户程序”的任意一种方法使单片机进入Bootloader。
  D.菜单-文件-Bootloader-更新Bootloader,Bootloader就更新完成了。
  E.按照“2下载用户程序”即可用新的Bootloader下载用户程序。

4.用户程序与Bootloader的合并
  A.开打上位机软件,菜单-文件-打开HEX固件,载入用户的HEX文件
  B.设置好BOOTLOADER配置
  C.菜单-文件-合并HEX固件,保存合并文件即可

其他问题:
  1.用编译器,如IAR、STVP或下载器等直接写入程序,会冲掉Bootloader。
  2.Bootloader调用用户程序之前,不会初始化CPU寄存器。为防止非掉电系统多次下载造
    成用户程序崩溃(比如堆栈溢出),用户程序需要自己初始化CPU寄存器。一般的C编译
    器都会自动做这个工作,汇编用户需要自己初始化。

出0入0汤圆

发表于 2015-9-3 16:20:52 | 显示全部楼层
这个也是要mark

出0入0汤圆

 楼主| 发表于 2015-9-3 20:16:45 | 显示全部楼层
hecat 发表于 2015-9-3 14:36
非常感谢楼主设计的Tinyboot,非常好用。

这两天,把作者的关于Tinyboot相关的帖子翻了个遍,阅读了每个网 ...

哈哈,使用方法还是你写的有水平。

出0入25汤圆

发表于 2015-9-3 20:24:41 | 显示全部楼层
way2888 发表于 2015-9-3 20:16
哈哈,使用方法还是你写的有水平。

见笑了。

这个Bootloader对没有需求的人来说没用,对有需求的人来说就是宝贝。

我有个滑板车,换了非原装电池,不能电量显示,于是用003模拟了一个。
每次改程序都要接SWIM,觉得太麻烦,就想到bootloader。
准备接个蓝牙串口,加上bootloader,可以无线升级了。

真心感谢你的这个Bootloader,非常好用。

出10入0汤圆

发表于 2015-9-3 21:06:56 | 显示全部楼层
stm8 bootloader,mark一下。

出0入25汤圆

发表于 2015-9-3 21:47:41 | 显示全部楼层
way2888 发表于 2015-9-3 20:16
哈哈,使用方法还是你写的有水平。

Bootloader下载完用户程序,跳转到用户程序之前,有没有重新初始化CPU?

如果是一个不掉电的系统,多次升级之后,堆栈会不会溢出?

如果在Bootloader里没有重新初始化CPU,这个工作就需要用户程序自己做。

出0入0汤圆

 楼主| 发表于 2015-9-3 22:26:00 | 显示全部楼层
hecat 发表于 2015-9-3 21:47
Bootloader下载完用户程序,跳转到用户程序之前,有没有重新初始化CPU?

如果是一个不掉电的系统,多次 ...

是的,一般用户程序都是独立存在的,通常情况下都会第一时间重新初始化堆栈,IAR就是这样的,如果是汇编的话,建议程序上电先初始化就可以了

出0入25汤圆

发表于 2015-9-3 22:50:32 | 显示全部楼层
way2888 发表于 2015-9-3 22:26
是的,一般用户程序都是独立存在的,通常情况下都会第一时间重新初始化堆栈,IAR就是这样的,如果是汇编 ...

刚才做实验也是,多次下载,每次读得的堆栈寄存器是同一个值。
也就是说IAR在程序开始时已经初始化了相关寄存器。
不用担心了。

出0入0汤圆

发表于 2015-9-3 23:04:50 | 显示全部楼层
先标记,以后再学,谢谢分享

出0入0汤圆

发表于 2015-9-4 10:38:09 | 显示全部楼层
way2888 发表于 2015-9-3 22:26
是的,一般用户程序都是独立存在的,通常情况下都会第一时间重新初始化堆栈,IAR就是这样的,如果是汇编 ...

请问way2888,针对 新版 IAR 编译器的改变,有没有什么应对的办法?

出0入0汤圆

 楼主| 发表于 2015-9-4 11:58:21 来自手机 | 显示全部楼层
FireHe 发表于 2015-9-4 10:38
请问way2888,针对 新版 IAR 编译器的改变,有没有什么应对的办法?

不用IAR自带的库,自己编写,要么直接汇编。这些都不现实,没什么大改动的话直接用软件做好的生成就好了,你的用户程序用什么版本都没关系

出0入25汤圆

发表于 2015-9-18 15:23:41 | 显示全部楼层
今天终于把蓝牙串口环境搭起来,用超级终端可以通过蓝牙串口访问单片机。

我的蓝牙串口,在超级终端里没有可配置项目,自然没法设置波特率,不知道别的蓝牙串口和蓝牙适配器是啥情况,是不是也不能设置波特率。

用Tinyboot的时候,通讯设置里,端口号选蓝牙端口号,波特率设115200。然后开始下载,稍等片刻就报“通信超时错误”。

这时候,不能判断是Tinyboot不支持蓝牙串口,还是下位机没有进入Bootloader模式。

于是,把Tinyboot的通信串口号改成PC的原生串口,再下载,一切OK。看来是Tinyboot不支持蓝牙串口。

下位机串口,物理结构是:TX一分二,一路送RS232电平转换到PC,一路送蓝牙RX。下位机的RX,采用线与结构,同时接收PC和蓝牙的TX。
开两个超级终端,一个连原生串口,一个连蓝牙串口,两边都可以与单片机正常通信,收发均可。
明显感觉,蓝牙串口的延时比原生串口大。

不知道楼主有没有时间和条件研究下这个问题?谢谢了!

出0入0汤圆

发表于 2015-9-18 15:36:59 | 显示全部楼层
多谢分享  !!! 刚好在找

出0入25汤圆

发表于 2015-9-18 22:38:10 | 显示全部楼层
TTL串口-蓝牙从机-蓝牙主机-TTL串口-USB串口,解决问题。

出0入0汤圆

发表于 2015-12-9 14:33:21 | 显示全部楼层


   mark……

出10入95汤圆

发表于 2016-2-20 23:34:09 | 显示全部楼层
谢谢楼主的无私奉献,
多谢65楼 hecat的整理!!

出0入0汤圆

发表于 2016-2-21 00:52:45 | 显示全部楼层
mark一下,好久不写妈妈了

出0入0汤圆

发表于 2016-2-22 22:30:45 | 显示全部楼层
多谢分享了

出0入0汤圆

发表于 2016-4-10 18:07:32 | 显示全部楼层
看了会,工程没看明白,怎么有BOOT ,LOAD , APP 三个工程。具体我是要怎么移植呀。(003S可以无缝移植么)

出0入0汤圆

发表于 2016-7-11 15:43:47 | 显示全部楼层
就好丢失,注册新号,冒名而来

出0入0汤圆

发表于 2016-7-11 16:14:04 | 显示全部楼层
刚买了片stm8l152准备测试下自己做的st-link能不能仿真,多谢楼主共享

出0入25汤圆

发表于 2016-8-7 22:41:19 | 显示全部楼层
anyway132874 发表于 2016-7-11 15:43
就好丢失,注册新号,冒名而来

你是原来的way2888?

出0入0汤圆

发表于 2016-8-15 10:22:45 | 显示全部楼层
这个东西不错~~

出0入0汤圆

发表于 2016-8-15 10:53:21 | 显示全部楼层
STM8 Bootloader mark

出0入0汤圆

发表于 2016-8-15 11:16:46 | 显示全部楼层
谢谢分享。

出0入4汤圆

发表于 2016-9-28 20:17:19 | 显示全部楼层
这个支持stm8S003f3吗

出0入0汤圆

 楼主| 发表于 2016-9-28 20:47:41 | 显示全部楼层
bbandpp 发表于 2016-9-28 20:17
这个支持stm8S003f3吗

支持的,选103就可以了

出0入4汤圆

发表于 2016-9-29 09:11:25 | 显示全部楼层
way2888 发表于 2016-9-28 20:47
支持的,选103就可以了

好的,谢谢。

出0入0汤圆

发表于 2016-10-17 20:03:45 | 显示全部楼层
Error[Lp004]: actual size (0x84) exceeds maximum size (0x80) for block "INTVEC"  直接下下来编译报错,求群里支持下. 把80改成84?

出0入0汤圆

发表于 2016-10-17 20:13:12 | 显示全部楼层
好东西,感谢分享

出0入0汤圆

发表于 2016-10-17 22:11:06 | 显示全部楼层
太有才了,要认真看一下

出0入0汤圆

发表于 2016-10-18 20:18:23 | 显示全部楼层
楼主的boot工程大家都能编译通过么, 我编译的时候报 Error[Lp004]: actual size (0x84) exceeds maximum size (0x80) for block "INTVEC" . 遇到该问题的帮忙解决下!

出0入0汤圆

发表于 2016-11-6 19:02:27 | 显示全部楼层
楼主,最近一直在用你写的bootloader, 在此先表示非常感谢,但是由于水平有限,且平时工作比较忙,没有能完成将其移植到ST8L上的修改,不知道您是否有时间将其加入8L的支持,并且485我是不用的,如果能得到原先128字节的loader则最好了,能否提供增强到5.4或者有偿指导呢,再次感谢。

出0入0汤圆

发表于 2016-11-6 19:03:20 | 显示全部楼层
楼主,最近一直在用你写的bootloader, 在此先表示非常感谢,但是由于水平有限,且平时工作比较忙,没有能完成将其移植到ST8L上的修改,不知道您是否有时间加入8L的支持,并且485我是不用的,如果能得到原先128字节的loader则最好了,能否提供增强到5.4或者有偿指导呢,再次感谢。

出0入0汤圆

发表于 2017-4-14 23:15:03 | 显示全部楼层
牛逼的一塌糊涂

出0入0汤圆

发表于 2017-4-19 16:28:28 | 显示全部楼层
hecat 发表于 2015-9-3 14:36
非常感谢楼主设计的Tinyboot,非常好用。

这两天,把作者的关于Tinyboot相关的帖子翻了个遍,阅读了每个网 ...

膜拜下楼主,赞下你的总结

出0入0汤圆

发表于 2017-4-21 14:27:01 | 显示全部楼层
谢谢楼主分享!!!

出0入0汤圆

发表于 2017-4-21 14:47:35 | 显示全部楼层
感谢分享!!

出0入0汤圆

发表于 2017-4-21 17:33:34 | 显示全部楼层
感谢楼主的分享,正好有项目要用到stm8,先收藏
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 11:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表