最近在支持客戶的時(shí)候遇到這樣一個(gè)問題:客戶在做自己的二級boot loader,并且在使用LPC54608 IAP功能,編程sector0中的page0時(shí)候總是失敗(返回0x21錯(cuò)誤碼),但是編程任何其他page的時(shí)候,都沒有問題(客戶的代碼在最后一個(gè)sector里,不編程)。
問題乍一看比較詭異,因?yàn)橹挥衟age0會出問題,對其他page的操作都是沒有問題的,并且擦除page/sector也沒有問題,只有編程操作會出錯(cuò)。
經(jīng)過了一段短暫的討論,最后把問題鎖定在了LPC中斷向量表的check sum校驗(yàn)機(jī)制上:LPC(除比較新的LPC5500系列外)基本都需要在中斷向量表的第8個(gè)位置上填入前7個(gè)中斷向量的校驗(yàn)和,關(guān)于校驗(yàn)和的具體內(nèi)容可以參考開篇提到的文章。
在Keil編譯出來的.bin文件中,默認(rèn)并沒有自動(dòng)添加這個(gè)校驗(yàn)和,所以每當(dāng)調(diào)用IAP變成page0的時(shí)候,IAP程序內(nèi)部都會檢查這個(gè)校驗(yàn)和,一旦校驗(yàn)和錯(cuò)誤(比如全0) 就會返回失敗。
解決方法也很簡單,就是在每次編程page0的時(shí)候都計(jì)算下校驗(yàn)和即可,這里直接給出計(jì)算校驗(yàn)和的代碼:
adr為編程地址,當(dāng)adr為0時(shí)既編程page0區(qū)域,紅框內(nèi)的代碼就是計(jì)算校驗(yàn)和,并且把校驗(yàn)和填到中斷向量表的第8個(gè)位置上。
加上這段計(jì)算校驗(yàn)和代碼后,問題迎刃而解。這個(gè)問題普遍存在于除LPC5500系列外幾乎所有老的LPC型號上,希望本文章對大家開發(fā)LPC MCU有所幫助!
編輯:jq
-
LPC
+關(guān)注
關(guān)注
8文章
136瀏覽量
77739 -
IAP
+關(guān)注
關(guān)注
2文章
164瀏覽量
24402 -
代碼
+關(guān)注
關(guān)注
30文章
4835瀏覽量
69117 -
編譯
+關(guān)注
關(guān)注
0文章
662瀏覽量
33066
發(fā)布評論請先 登錄
相關(guān)推薦
STM32G0B1VC IAP時(shí)flash擦除函數(shù)進(jìn)不去是怎么回事?
cdci6214 eepromsel和refsel都置為MID的時(shí)候能否正常工作?
TLV320ADC3101可以正確設(shè)置和讀寫PAGE0頁的數(shù)據(jù),但是讀取PAGE4頁上的寄存器值都為0,為什么?
TLV320ADC3101某個(gè)通道無輸出,是什么原因?qū)е拢?/a>
進(jìn)行aic3106的配置時(shí),將0x80寫入page0/regster25,讀出來卻是0x86,為什么?
TLV320AIC3254使用SPI進(jìn)行設(shè)置時(shí),如何設(shè)置寄存器?
TLV320AIC3104-Q1如何設(shè)置dac的低通濾波器把高頻分量去掉?
ESP8266配網(wǎng)失敗如何返回消息給APP?
USB讀寫時(shí),調(diào)用WriteFile或者ReadFile時(shí)總是返回失敗,為什么?
做usb dfu進(jìn)行iap升級,固件下載完成后,校驗(yàn)不過,very失敗的原因?
IAP跳轉(zhuǎn)APP開始可以,如果從APP跳回IAP后再跳到APP失敗的原因?
stm32g473 flash擦除失敗的原因?
STM32F0 IAP跳轉(zhuǎn)到APP后無法進(jìn)入中斷怎么解決?
關(guān)于stm32F4 IAP跳轉(zhuǎn)的疑問求解
GD32 MCU ISP失敗的原因
![GD32 MCU ISP<b class='flag-5'>失敗</b>的原因](https://file1.elecfans.com/web2/M00/C1/B2/wKgZomXeix-AYt0QAAA9fb4pF5E360.png)
評論