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

2020-02-06 09:48发布

这是自己最近写的一个串口用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文件.zip (9.41 KB, 下载次数: 181) 2012-11-22 15:24 上传 点击文件名下载附件
gld
gld文件
MCU.zip (3.24 KB, 下载次数: 200) 2012-11-22 15:24 上传 点击文件名下载附件
mcu代码
MCU部分代码
PC.zip (13.77 KB, 下载次数: 165) 2012-11-22 15:24 上传 点击文件名下载附件
pc端代码
PC代码

这个代码主要是以实验性质为主,所以不能排除存在各种问题,如果要大规模使用时还需谨慎。本人水平有限,各位如果有什么意见和建议还望多多提出,谢谢。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
47条回答
craigtao
1楼-- · 2020-02-08 19:32
不是很明白,单片机也需要bootloader的吗?  有点高端,
xuanfong1
2楼-- · 2020-02-08 23:41
 精彩回答 2  元偷偷看……
sqbl
3楼-- · 2020-02-09 00:43
好东西,不错,得推荐
fengyunyu
4楼-- · 2020-02-09 05:42
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指示信号或者其他指示信号
                }
        }

这个是用来做什么的?
fengyunyu
5楼-- · 2020-02-09 07:18
本帖最后由 fengyunyu 于 2014-12-19 14:44 编辑

看门狗定时32mS,这个又是怎么来的,系统默认么?
fengyunyu
6楼-- · 2020-02-09 12:55
LZ提供的升级方法有个问题,BOOT代码不能独立运行,万一APP区程序擦除了,又没有成功写入,芯片就废了。

一周热门 更多>