AVR通用Bootloader折騰記
最近做一個新東西, 正好手邊有ATMega128的芯片, 資源也足夠用, 于是決定就用它了. 考慮到以后PCB會裝到外殼中, 導(dǎo)致軟件升級困難, 而正好在電路中會用到藍(lán)牙串口, 于是決定使用串口更新程序. 于是乎在網(wǎng)上找到”AVR通用Bootloader“, 打算折騰一番.
不得不說作者很牛X, 考慮的也很周到, 特意制作了一個兼下載與圖形化配置的軟件, 直接生成配置頭文件, 和編輯的批處理文件, 相當(dāng)方便, 所以這一部分很簡單, 配置了一下, 編譯, 然后使用ISP下載到MCU中, 嗯, 別忘記還要配置一下Boot相關(guān)的熔絲.
完成之后寫了一個簡單的程序使用Bootloader下載到芯片中進(jìn)行測試. 程序的內(nèi)容很簡單, 就是讓一個外接端口的LED不停的閃爍. 程序下載很順利, 但是結(jié)果卻讓人很憂傷. 程序會正常運行, 但是LED閃爍幾下之后會再次進(jìn)入Bootloader, 再進(jìn)入用戶程序, 閃幾下LED, 再進(jìn)行Bootloader, 如此往復(fù).
我很抓狂, 熔絲檢查了一遍又一遍, 沒問題, 使用ISP將程序讀出來, 也沒發(fā)現(xiàn)有什么諸如程序未全部下載或者出現(xiàn)錯誤等問題, 沒辦法, 認(rèn)真的讀完作者提供的使用說明, 還是無果. 懷疑編譯器優(yōu)化太厲害導(dǎo)致出錯, 于是更改優(yōu)化等級, 還是依舊. 手邊沒有調(diào)試器, 無法跟蹤, 事情至此陷入僵局. 無奈只好又配置了一遍參數(shù), 再試了幾次, 打算再不行就啃源代碼了. 在進(jìn)行配置的時候忽然注意到看門狗的選項, 恍然大悟:在Bootloader中配置了看門狗, 但在程序跳轉(zhuǎn)到用戶程序后沒有進(jìn)行喂狗操作, 看門狗餓死后直接復(fù)位了系統(tǒng), 然后MCU又從Bootloader開始執(zhí)行…..如此往復(fù), 造成程序不斷在Bootloader和用戶程序間跳轉(zhuǎn)的錯覺.
知道原因后就好解決了, 在用戶程序中進(jìn)行喂狗操作, 然后就正常了. 正如你猜的, 這事情還沒完. 使用Bootloader能正常下載后又發(fā)現(xiàn)一個問題: 第一次使用Bootloader下載是正常的, 但是從第一次下載后就再沒法下載了!
我很奇怪, 怎么可能出現(xiàn)這樣的問題!? 再一次檢查熔絲, 重新配置下載, 問題依舊. 至此我已經(jīng)在電腦前坐了快5個小時了, 暗罵了幾句后決定出去走走.
回來之后又試了一次, 不過這次鬼使神差的拔掉了GND線, 再接上, 居然能正常下載了!
仔細(xì)一想, 也想通了: 這個AVR的板子是我自己做了, 因為空間有限, 沒有使用復(fù)位按鈕. 因為調(diào)試的時候電源線和GND線是通過杜邦線連接上去的, 所以重啟的時候拔一下電源線就好了, 卻沒料到這次居然栽了! 具體原因可能是我拔線后再插上的時間太短, 濾波電容里存儲的電量和串口線上電流(因為串口在不停的發(fā)送連接密碼)使得MCU沒有完全復(fù)位, 所以使得再次接上電源后程序沒從Bootloader執(zhí)行.
想想挺簡單的兩個小問題, 居然讓我折騰了快一天. 汗.