AVR通用Bootloader折腾记
扫描二维码
随时随地手机看文章
最近做一个新东西, 正好手边有ATMega128的芯片, 资源也足够用, 于是决定就用它了. 考虑到以后PCB会装到外壳中, 导致软件升级困难, 而正好在电路中会用到蓝牙串口, 于是决定使用串口更新程序. 于是乎在网上找到”AVR通用Bootloader“, 打算折腾一番.
不得不说作者很牛X, 考虑的也很周到, 特意制作了一个兼下载与图形化配置的软件, 直接生成配置头文件, 和编辑的批处理文件, 相当方便, 所以这一部分很简单, 配置了一下, 编译, 然后使用ISP下载到MCU中, 嗯, 别忘记还要配置一下Boot相关的熔丝.
完成之后写了一个简单的程序使用Bootloader下载到芯片中进行测试. 程序的内容很简单, 就是让一个外接端口的LED不停的闪烁. 程序下载很顺利, 但是结果却让人很忧伤. 程序会正常运行, 但是LED闪烁几下之后会再次进入Bootloader, 再进入用户程序, 闪几下LED, 再进行Bootloader, 如此往复.
我很抓狂, 熔丝检查了一遍又一遍, 没问题, 使用ISP将程序读出来, 也没发现有什么诸如程序未全部下载或者出现错误等问题, 没办法, 认真的读完作者提供的使用说明, 还是无果. 怀疑编译器优化太厉害导致出错, 于是更改优化等级, 还是依旧. 手边没有调试器, 无法跟踪, 事情至此陷入僵局. 无奈只好又配置了一遍参数, 再试了几次, 打算再不行就啃源代码了. 在进行配置的时候忽然注意到看门狗的选项, 恍然大悟:在Bootloader中配置了看门狗, 但在程序跳转到用户程序后没有进行喂狗操作, 看门狗饿死后直接复位了系统, 然后MCU又从Bootloader开始执行…..如此往复, 造成程序不断在Bootloader和用户程序间跳转的错觉.
知道原因后就好解决了, 在用户程序中进行喂狗操作, 然后就正常了. 正如你猜的, 这事情还没完. 使用Bootloader能正常下载后又发现一个问题: 第一次使用Bootloader下载是正常的, 但是从第一次下载后就再没法下载了!
我很奇怪, 怎么可能出现这样的问题!? 再一次检查熔丝, 重新配置下载, 问题依旧. 至此我已经在电脑前坐了快5个小时了, 暗骂了几句后决定出去走走.
回来之后又试了一次, 不过这次鬼使神差的拔掉了GND线, 再接上, 居然能正常下载了!
仔细一想, 也想通了: 这个AVR的板子是我自己做了, 因为空间有限, 没有使用复位按钮. 因为调试的时候电源线和GND线是通过杜邦线连接上去的, 所以重启的时候拔一下电源线就好了, 却没料到这次居然栽了! 具体原因可能是我拔线后再插上的时间太短, 滤波电容里存储的电量和串口线上电流(因为串口在不停的发送连接密码)使得MCU没有完全复位, 所以使得再次接上电源后程序没从Bootloader执行.
想想挺简单的两个小问题, 居然让我折腾了快一天. 汗.