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