最近做一个新东西, 正好手边有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执行.
想想挺简单的两个小问题, 居然让我折腾了快一天. 汗.
上一篇:ENC28J60学习笔记——AVRNET项目
下一篇:XMEGA128学习笔记7-模数转换ADC
推荐阅读最新更新时间:2024-03-16 15:32