|
本帖最后由 t3486784401 于 2015-4-23 16:15 编辑
【背景】
----------
前几年玩AVR的时候接触了 Bootloader,发现可以实现类似 STC 的在线串口下载,省去了每次连接下载器的步骤,确实很方便。
论坛里也有一些项目发起了通用 Bootloader 的编写,我接触的几个都是 GCC-ASM 汇编实现的,充实了我前几年玩 AVR 的时光。
然而近几年用这些 Bootloader 的过程,也积攒了一堆堆不方便的感受,写写大概有这么几点:
1. 毕竟是汇编写的,每次新增器件改起来不是那么方便,尤其现在我换了 win8 系统,连 GCC 都装不上去,更别说改了;
2. 上位机是 Avr Studio 的 AVRPROG.EXE,在 XP 下表现还算稳定,win7/8 下动不动死掉神马的神烦;
3. AVRPROG.EXE 即使点了退出按钮,只要界面不关掉,还是占用着串口句柄的,我要串口通信助手就打不开,神烦;
4. 坛子里最新的 Bootloader 已经是 600+字节 大小了,尺寸非常尴尬,必须要用 512Words 的启动区,
放在 M8/M48 这样的单片机了占用 FLASH 相当可观,眼看着好大一块被占用,而且是浪费,有点不爽。
鉴于此,早就有想法自己写 Bootloader 了,全套上下位机包办,哪里不爽改哪里。
【下位机】
-------------
下位机的话,我手头有 ICCAVR v7.14,在 win8 下表现不错,准备就用这个来搞。要求只有一个:尺寸≤512B
实际编程过程中用 C-ASM 混编的方式,主框架用 C 来搞,细节寄存器操作(SPM指令必需使用 R0/R1/Z 寄存器)用汇编。
为进一步减小尺寸,做了这几部代码优化:
1. 整个FLASH / EEPROM 区循环的控制不再用 16位数比较 了,太浪费指令,改用与运算;
2. 重写了 startup 库文件,删除了 main 函数之前大量的内容,仅保留简单堆栈初始化;
3. 除了 boot_reset 向量外,不适用额外的中断向量;
4. 功能限定在 FLASH 读写、 EEPROM 读写,其他暂时不考虑;
5. 程序应该有足够的能力防止自宫(确保 Bootloader 操作不至于锁片子)。
现在已经写出来了 m8、m328 版的bootloader,烧录时需要使用 BLB 熔丝位限定自宫,特性如下:
fosc= 7.3728 MHz
size= 512 B
led = PB0, PB1(指示用,非必要)
【上位机】
-------------
上位机的话,我用的是经典的 VS2005,用 MFC 开发。要求不多:XP/win7/win8 全兼容
实际编程过程中为了进一步提升稳定性,连 ActiveX 都没用(MSComm拜拜了),用的是 API+多线程实现的串口通信。
这样做的好处是哪天闲来想用 WinCE 搞了,直接 ebd 编译一下就通过了,代码兼容。
为了精简界面,做了这几部分设计:
1. 将FLASH区、EEPROM区单独对待,即同一片单片机,FLASH、EEPROM的操作认为是两个芯片的;
2. 添加了精简的串口控制代码,使用字串实现串口参数设定,简单高效;
3. 计划做一个器件列表方便后期追加的,现在看来还等闲下来再去实现吧。
现在的上位机具备 m8、m328p 的编写功能,支持 hex、bin 格式文件,支持串口重复连接。
实测性能如下:
m328p 全 FLASH 编写时间:<15s
m328p 全 FALSH 读取时间:<3s
m328p 全 EEPROM 编写时间:<3s
m328p 全 EEPROM 读取时间:<1s
m8的还没测,正比于容量的,自行补脑吧
【用法】
----------
用任意一种下载器(我用的是自制AVRISP)把HEX文件烧录入 FLASH,时钟调整为 7.3728M 外部晶振
熔丝设定成从 256WORD 启动区加载,并且编写保护位 BLB12(防止自宫)。
剩下的就是每次复位时有 1s 左右的 BOOT 判决时间,若上位机不连接则跳转 $0000 主程序
【附件】
----------
废话不多说,直接发源码,其他片子的支持等后期闲下来再往里添加吧:
m8下位机(7.3728MHz):
m328p下位机(7.3728MHz):
PC上位机(WinXP/7/8):
附上一张用 m328p-bldr 灌入程序的运行照片,缅怀一下那个撸啊撸的年代
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|