搜索
bottom↓
回复: 50

分享一个自己写的PIC24的bootloader(可以和原程序整合)。

  [复制链接]

出0入0汤圆

发表于 2012-11-22 15:48:39 | 显示全部楼层 |阅读模式
这是自己最近写的一个串口用BootLoader程序,包含PC程序以及MCU的程序。
之前在用ds30 loader,只是免费版的通讯不能加密,HEX不能加密。并且必须先烧写一次ds30 loader,然后再用ds30 loader烧写程序,实际用起来很是比较麻烦。所以就想自己开发一个解决这些问题。
PC端软件使用python3.2.3+pyqt4.9.4开发。hex文件目前采用3DES加密。
MCU用的是MCC3.3.1开发。不过这个因为要用在自己的产品中,所以代码中删除了加密代码,有需要可以自行添加。
性能上在串口19200速率下,使用加密时,120KB原始大小的HEX文件在24s左右更新完成。
PC端软件分为2部分:
1.生成HEX:这里是用来将编译器生成的原始HEX文件进行格式调整并且加密保存的。
2.写mcu:这部分是用来将前面一步生成的加密hex文件烧写进MCU的。
mcu部分:
直接将char BootLoader(void) 函数放在程序最开头部分即可。
int main(void)
{
    BootLoader(void);
    //其它代码
}

MCU部分使用方法:
1.修改gld文件,开辟bootloader使用区域,并且修改程序空间长度。目前使用的是0xA400之后的所有地址作为bootloader程序空间。
2.修改mcu源文件中.h文件中预定义以及.c文件中初始化。(必须定义对串口的RX脚,这样才能检测烧写信号)
3.编译后用烧写器将此文件烧进MCU即可。注意预配置中GWRP一定要为GWRP_OFF,否则无法串口升级。
PC部分
1.首先修改readHex.py和LoadHex.py两个文件中 desKey = DES3.new("1234567890123456", DES3.MODE_CBC) 的密码。
2.使用LoadHex.py生成需要烧写的HEX文件。
3.用bootMain.py开始烧写HEX文件,根据界面提示操作即可。
目前缺点:
1.配置位不能被跟新
2.bootloader不能被升级。实际就是从0xA400地址之后的空间都不会被更新。所以才需要修改gld文件加以限制。

gld文件
MCU部分代码
PC代码

这个代码主要是以实验性质为主,所以不能排除存在各种问题,如果要大规模使用时还需谨慎。本人水平有限,各位如果有什么意见和建议还望多多提出,谢谢。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2012-11-22 16:59:51 | 显示全部楼层
MARK一下,正好用得上

出0入0汤圆

发表于 2012-11-22 17:57:55 | 显示全部楼层
这个虽然用不上 但绝对是要来顶下的

出0入0汤圆

发表于 2012-11-26 14:23:39 | 显示全部楼层
这个不错  Bootloader,顶一下

出0入0汤圆

发表于 2012-11-27 19:59:27 | 显示全部楼层
支持!是好东西。一直都想自己做一个。(借鉴一下)

出0入0汤圆

发表于 2012-11-27 20:01:41 | 显示全部楼层
mark
刚好需要

出0入0汤圆

发表于 2012-11-27 21:15:04 | 显示全部楼层
不错 MARK

出0入0汤圆

发表于 2013-2-17 17:17:45 | 显示全部楼层
好东西啊!记录!

出0入0汤圆

发表于 2013-12-8 21:59:00 | 显示全部楼层
好东西  标记了  后续用得着

出5入0汤圆

发表于 2013-12-8 23:58:07 来自手机 | 显示全部楼层
顺便问下,pic18f87k90支不支持bootloader

出0入0汤圆

发表于 2014-2-18 14:24:16 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2014-2-19 04:10:26 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-4-16 15:07:20 | 显示全部楼层
   顶一下

出0入0汤圆

发表于 2014-4-17 12:41:41 | 显示全部楼层
mark,也许能用到

出0入76汤圆

发表于 2014-4-17 19:07:24 | 显示全部楼层
不错, 好久没有玩PIC,过来支持一下...

出0入0汤圆

发表于 2014-4-18 08:17:22 来自手机 | 显示全部楼层
plc,很有用

出0入0汤圆

发表于 2014-4-18 14:48:10 | 显示全部楼层
PC端程序怎么运行

出0入0汤圆

发表于 2014-4-18 15:37:21 | 显示全部楼层
顶一下   

出0入0汤圆

发表于 2014-4-21 13:42:27 | 显示全部楼层
好东西,说不定那天就能用上。

出0入0汤圆

发表于 2014-4-23 20:18:39 | 显示全部楼层
不是很明白,单片机也需要bootloader的吗?  有点高端,

出0入0汤圆

发表于 2014-4-28 11:22:26 | 显示全部楼层
路过路过 顺便看看  先收藏吧

出0入0汤圆

发表于 2014-4-28 20:42:04 | 显示全部楼层
好东西,不错,得推荐

出100入101汤圆

发表于 2014-12-19 14:42:44 | 显示全部楼层
LZ,bootloader起始处有一个循环:

for(i=0;i<63;i++)
        {
                if(RX_IO==BREAK)                                        //TX在发送break信号,则RX脚应该持续低电平,如果高则退出
                {
                        RCONbits.SWDTEN=0;                                //退出前关闭看门狗
                        ClrWdt();
                        return(0);                                                //退出
                }
                Sleep();                                                        //休眠,看门狗定时32mS
                if((i%7)==0)                                                //等待指示闪烁
                {
                        //LED指示信号或者其他指示信号
                }
        }

这个是用来做什么的?

出100入101汤圆

发表于 2014-12-19 14:43:21 | 显示全部楼层
本帖最后由 fengyunyu 于 2014-12-19 14:44 编辑

看门狗定时32mS,这个又是怎么来的,系统默认么?

出100入101汤圆

发表于 2014-12-19 16:45:26 | 显示全部楼层
LZ提供的升级方法有个问题,BOOT代码不能独立运行,万一APP区程序擦除了,又没有成功写入,芯片就废了。

出0入0汤圆

发表于 2014-12-25 02:57:13 | 显示全部楼层
好東西!!  收下了~~

出0入0汤圆

发表于 2015-1-13 21:18:06 | 显示全部楼层
好好看看,以后有用,谢谢分享

出0入0汤圆

发表于 2015-7-31 09:55:42 | 显示全部楼层
Thanks you !!

出0入0汤圆

发表于 2015-9-24 10:17:42 | 显示全部楼层
MARK 以后有用,谢谢分享!

出0入0汤圆

发表于 2015-12-1 09:30:08 | 显示全部楼层
楼主,我看了你的.gld文件,你把bootloader()这个函数定位在flash的固定地址,但是我按照你的方法测试了一下,debug的时候,看bootloader()的地址,不是按照.gld 文件设置的,请教一下,你是怎么实现的

出0入0汤圆

 楼主| 发表于 2015-12-19 15:37:50 | 显示全部楼层
一晃三年都过去了!后来这个bootloade在公司的产品里有批量使用用过,没有问题

NM2012 的问题
PIC18,24,33系列的bootloade原理都是共通的,只是读写FLASH的方法略有不同,数据手册上都有例程可以参考的

fengyunyu 的问题
1.循环是在程序开始执行前,通过检测RX引脚上是否有BREAK信号,判断要不要进bootlode的。每隔32mS检测一次,一共64次。
2.32mS的看门狗复位时间是芯片配置字配置的。
3.确实是应用区如果写入失败就必须用烧写器重新烧写,但是在实际中,在bootloade开始时,会将系统中所有功率部分关掉,且通讯速率比较低(19200),同时上位机有数据发送错误重发的功能,所以在批量使用中没有发生过烧录失败的情况。

voto_qiao 的问题
1.gld文件中有两处需要更改的,一处是开始划分bootloade的空间,一段是给这个空间命名,看看是不是都写了;
2.修改后的gld文件必须在IDE里面加入到工程目录里,才能生效;
3.函数声明的时候要指定分配到bootloade段。

出0入0汤圆

发表于 2017-2-1 00:59:29 | 显示全部楼层
不错的bootloade,感谢liansh2002

出0入0汤圆

发表于 2017-2-2 13:02:09 | 显示全部楼层
正在研究bootloader,谢谢分享

出0入0汤圆

发表于 2017-8-19 17:19:58 | 显示全部楼层
我刚参加工作的时候,做了一个usb的bootloader 比串口的快很多,也稳定很多,哈哈。上位下位机都有的。

出0入0汤圆

发表于 2017-8-21 16:12:09 | 显示全部楼层
收藏        

出0入0汤圆

发表于 2017-11-9 14:58:13 | 显示全部楼层

MARK 了

出0入0汤圆

发表于 2018-4-9 18:10:14 | 显示全部楼层
有个问题请教下,BOOTLOADER里的中断跟APP里的中断是不是有差别,

这几天一直在找这个问题,貌似有人说不能在BOOTLOADER加中断,还是BOOTLOADER里的中断向量还是原来向量,APP里的中断要加偏移量。

楼主这个BOOTLOADER里中断需要加偏移量吗?还是因为放在最后面,APP跟BOOTLOADER都可以不用加中断向量偏移。

出0入0汤圆

 楼主| 发表于 2018-4-10 09:42:26 | 显示全部楼层
一心2013 发表于 2018-4-9 18:10
有个问题请教下,BOOTLOADER里的中断跟APP里的中断是不是有差别,

这几天一直在找这个问题,貌似有人说不 ...

这里需要区分是16,18系列还是24,33系列

16,18系列中断入口是固定地址,(高优先级0x08,低优先级0x18)。程序会分别在FLASH中,0x08,0x18地址处放置两条跳转语句,到实际的中断程序中。所以这个是没有办法完成中断重映射的。也就是bootloader中无法使用中断。

24,33系列差不多一样的结构,只是中断入口更多了,且每个入口都有一个备用入口(AIVT 备用中断向量表)。所以只需要定义好备用入口里面的跳转地址,就可以在bootloder中使用中断。

最后为啥这个bootloader要放在最后,是因为如果放在开头的话,必须要重新定义中断向量表跳转地址(因为程序偏后了)。懒得重定义中断向量表,而且bootloader中也没必要用中断,所以放在了最后。

出0入0汤圆

发表于 2018-4-10 10:46:41 | 显示全部楼层
liansh2002 发表于 2018-4-10 09:42
这里需要区分是16,18系列还是24,33系列

16,18系列中断入口是固定地址,(高优先级0x08,低优先级0x18)。 ...

谢谢楼主回复,我昨天也查了大量资料,最终都是不能在BOOTLOADER中使用中断,现在我用的是PIC18F25K80.

再请教下,如果BOOTLOADER放在FLASH前面,比如0X00-0X400,那主程序的中断向量是否要改为0x408和0x418?

我找了下,没找到相关的设置教程,昨天想把BOOTLOADER放到FLASH后半段,结果设置了偏移地址后,一直报错说

Error - section 'InterruptVectorHigh' can not fit the absolute section. Section 'InterruptVectorHigh' start=0x00000008, length=0x0000005c

现在还没解决,楼主有遇到过吗?

出0入0汤圆

 楼主| 发表于 2018-4-10 11:35:30 | 显示全部楼层
一心2013 发表于 2018-4-10 10:46
谢谢楼主回复,我昨天也查了大量资料,最终都是不能在BOOTLOADER中使用中断,现在我用的是PIC18F25K80.

...

18就简单多了,因为中断入口是固定的。下面的isr_high就是你的高优先级中断程序
先说一下18系列中断进入的方法吧,以高优先级中断为例,当中断发生后,MCU会将PC指针强制指到0x08地址(此地址没有任何方法更改)。在0x08处只有一条汇编指令"GOTO isr_high"。执行后MCU跳转到isr_high函数所在地址,开始执行函数里的内容。

这里只说用XC8(PICC18)编译器的方法。
1.在设置了Code offset后,编译器会自动在(code offset + 0x08)处放置"GOTO isr_high",在(code offset + 0x18)处放置"GOTO_isr_low"。所以在APP中,对于中断程序也好,入口向量也好,不需要做任何更改。
2.当bootloader在FLASH最末尾时,如果又不需要上电后先执行bootloader,那其实你什么都不需要做,Code offset都不需要设置。
3.当bootloader在FLASH最开头时,因为中断入口是固定的,你必须手工加入两条跳转语句,在0x08处放置"GOTO code offset + 0x08",在0x18处放置"GOTO code offset + 0x18"。这样当中断触发时才能正常进入中断程序
   我的实现方法是在0x08和0x18处建两个数组,数组内容翻译成机器码就是GOTO语句
  1. #define dCODE_OFFSET 0x0040    //偏移量
  2. //中断地址
  3. #define dISRH_ADD_HIGH (((dCODE_OFFSET+0x08)/2)>>8)
  4. #define dISRH_ADD_LOW (((dCODE_OFFSET+0x08)/2)&0xFF)
  5. #define dISRL_ADD_HIGH (((dCODE_OFFSET+0x18)/2)>>8)
  6. #define dISRL_ADD_LOW (((dCODE_OFFSET+0x18)/2)&0xFF)

  7. volatile const unsigned char vgotoisrh[4] __at(0x0008) = {dISRH_ADD_LOW, 0xef, dISRH_ADD_HIGH, 0xf0};   //GOTO code offset + 0x08
  8. volatile const unsigned char vgotoisrl[4] __at(0x0018) = {dISRL_ADD_LOW, 0xef, dISRL_ADD_HIGH, 0xf0};     //GOTO code offset + 0x18
复制代码

你的那个报错是因为改了中断入口造成的,其实是多余的。

出0入0汤圆

发表于 2018-5-9 10:44:20 | 显示全部楼层
liansh2002 发表于 2018-4-10 11:35
18就简单多了,因为中断入口是固定的。下面的isr_high就是你的高优先级中断程序
先说一下18系列中断进入 ...

楼主,我那BOOTLOADER写好了,按照你说的方法写了。

不过现在上位机写好后,APP下进去了,但GOTO过去后,就是起不来,

我想问一下,是否APP需要修改设置基地址?我现在放在0x5000段,跳过去后程序就死了。

MPLAB貌似没看到基地址的设置地方。

出0入0汤圆

 楼主| 发表于 2018-5-9 11:50:11 | 显示全部楼层
一心2013 发表于 2018-5-9 10:44
楼主,我那BOOTLOADER写好了,按照你说的方法写了。

不过现在上位机写好后,APP下进去了,但G ...

我不太清楚你具体的实现细节,如果是和我一样将Bootloader放在FLASH最末尾,且上电先进Bootloader的话,可以这样排查
1.程序的Code offset需要设置。我设置的是0x40,也就是把FLASH最开头的64字节空出来。

2.程序里有没有手动添加跳转的命令。
我的Bootloader放在0xF800地址,APP从0x40地址起始

3.检查生成的HEX文件对不对
在0x0000,0x0008,0x0018三个地址应该有GOTO语句(xxEFxxxx)

4.直接拿烧录器读取FLASH,看下载的内容对不对。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2018-5-10 10:28:55 | 显示全部楼层
liansh2002 发表于 2018-5-9 11:50
我不太清楚你具体的实现细节,如果是和我一样将Bootloader放在FLASH最末尾,且上电先进Bootloader的话, ...

谢谢楼主回复,可能 我用的编译器版本问题,其实我就想设置个基地址而已,奈何这编译器太差了,优化能力更差,折腾了好久,问题已经基本解决,我再测试下,到时开个贴共享出来。

之前看到有坛友千元酬金求18F25K80的BOOTLOADER,想必这东西比较冷门,应该有些许共享价值。

再次谢谢楼主的分享。

出0入0汤圆

发表于 2018-5-13 13:26:18 | 显示全部楼层
牛.....BootLoader

出0入0汤圆

发表于 2019-8-14 15:34:05 | 显示全部楼层
一心2013 发表于 2018-5-10 10:28
谢谢楼主回复,可能 我用的编译器版本问题,其实我就想设置个基地址而已,奈何这编译器太差了,优化能力 ...

请问下BOOT程序从复位到程序主体的跳转如何写?如从地址0x0000 jmp到Boot的程序主体0x1e00。用的是XC8,跳转短地址如0x500 用 ljmp 0x500可行。请赐教。。

出0入0汤圆

发表于 2019-8-14 16:05:24 | 显示全部楼层
philix 发表于 2019-8-14 15:34
请问下BOOT程序从复位到程序主体的跳转如何写?如从地址0x0000 jmp到Boot的程序主体0x1e00。用的是XC8, ...

我都是直接用GO指令

#define AppDataFlashStartAdd                         0x2000 //第一段APP的起始地址

       
                _asm                                                
                goto         AppDataFlashStartAdd
                _endasm       





出0入0汤圆

发表于 2019-8-26 20:24:49 | 显示全部楼层
一心2013 发表于 2019-8-14 16:05
我都是直接用GO指令

#define AppDataFlashStartAdd                         0x2000 //第一段APP的起始地址

长跳转不行,不知道楼主的Bootloader是否可以开源。。。。

出0入0汤圆

发表于 2019-8-27 08:14:04 | 显示全部楼层
philix 发表于 2019-8-26 20:24
长跳转不行,不知道楼主的Bootloader是否可以开源。。。。

楼主的已经开源了,楼主位有代码…………

出0入0汤圆

发表于 2020-6-29 17:31:35 | 显示全部楼层
感谢分享,刚好用上

出0入0汤圆

发表于 2020-8-23 08:00:27 | 显示全部楼层
Thank you !!!

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-18 19:18

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

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