這件事情說來話長,在疫情期間,我做了一個基於TMS320F28377D的雙核bootloader程式,通訊協定選擇的是
CAN通訊。這此期間,我遇到了很多問題,都一一解決了,我遇到的問題,我也會給大家提出來,免得大家踩雷。
1、關於ecc和dataonly的問題:
燒寫flash時,有兩種選擇:
(1)dataonly:這種方式需要關閉ecc,特點是:可以16位元燒寫,適合各種雜亂無章的程式。
關閉ecc的方法:
Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;
(2)ecc燒寫:這種方式需要開啟ecc(暫存器預設開啟),特點是:ecc校驗,可以減少啟動時程式碼出錯的概率,但是必須64位元燒寫,或者128位元燒寫。即:CMD檔案中必須有Align(4)或者Align(8)
我個人是建議選擇ecc校驗!
2、關於EALLOW問題
有一些f021-api函數庫中的函數,在函數結束的時候,會EDIS,就會導致我們最前面的EALLOW失效!請大家一定注意!
3、最後一個是最大的坑!這個坑是我完全沒有想到的!
寫好雙核bootloader程式後,燒寫了一個雙核的流水燈,可以正常工作,但是萬萬別想到,我寫了一個epwm-adc的程式,程式比較大,每次都出錯!,最奇怪的事情是,竟然部分功能是可以使用的。我百思不得其解,我通過以下的方式,做了一些小實驗:1.用模擬器燒寫,用bootloader啟動,可以正常執行。2.用bootloader燒寫,用bootloader啟動,程式無法正常執行。我就尋思,是不是燒進入的程式有問題。我就用肉眼去看,前幾行都是一樣的,但是肉眼能看多少的東西呢。我用uniflash將兩個程式的bin都匯出,用BIN-TXT軟體,將bin檔案轉換為txt,最後用beyond compare 4 對比兩個txt檔案的區別,還真被我找到了,有兩行沒有燒寫進去,這兩行共同的特點是檢驗和是0x00 !
bug出現的原因是因為校驗和,total%0x100 + checksum = 0x100
如果total%0x100 = 0的話,checksum應該是0x100,然而根據hex檔案的格式,checksum只有兩位,所以hex檔案的
checksum為0x00。所以因為這個原因,遇到checksum為0x00的行,全部燒寫不進去。
修改這個Bug後,程式可以正常執行!
碼字不易,偵錯經驗不易,轉發請註明出處,以後給大家分享更多好玩有趣的小玩意。