最近在支持客戶(hù)的時(shí)候遇到這樣一個(gè)問(wèn)題:客戶(hù)在做自己的二級(jí)boot loader,并且在使用LPC54608 IAP功能,編程sector0中的page0時(shí)候總是失敗(返回0x21錯(cuò)誤碼),但是編程任何其他page的時(shí)候,都沒(méi)有問(wèn)題(客戶(hù)的代碼在最后一個(gè)sector里,不編程)。
問(wèn)題乍一看比較詭異,因?yàn)橹挥衟age0會(huì)出問(wèn)題,對(duì)其他page的操作都是沒(méi)有問(wèn)題的,并且擦除page/sector也沒(méi)有問(wèn)題,只有編程操作會(huì)出錯(cuò)。
經(jīng)過(guò)了一段短暫的討論,最后把問(wèn)題鎖定在了LPC中斷向量表的check sum校驗(yàn)機(jī)制上:LPC(除比較新的LPC5500系列外)基本都需要在中斷向量表的第8個(gè)位置上填入前7個(gè)中斷向量的校驗(yàn)和,關(guān)于校驗(yàn)和的具體內(nèi)容可以參考開(kāi)篇提到的文章。
在Keil編譯出來(lái)的.bin文件中,默認(rèn)并沒(méi)有自動(dòng)添加這個(gè)校驗(yàn)和,所以每當(dāng)調(diào)用IAP變成page0的時(shí)候,IAP程序內(nèi)部都會(huì)檢查這個(gè)校驗(yàn)和,一旦校驗(yàn)和錯(cuò)誤(比如全0) 就會(huì)返回失敗。
解決方法也很簡(jiǎn)單,就是在每次編程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)和代碼后,問(wèn)題迎刃而解。這個(gè)問(wèn)題普遍存在于除LPC5500系列外幾乎所有老的LPC型號(hào)上,希望本文章對(duì)大家開(kāi)發(fā)LPC MCU有所幫助!
編輯:jq
-
LPC
+關(guān)注
關(guān)注
8文章
137瀏覽量
79106 -
IAP
+關(guān)注
關(guān)注
2文章
166瀏覽量
25838 -
代碼
+關(guān)注
關(guān)注
30文章
4947瀏覽量
73291 -
編譯
+關(guān)注
關(guān)注
0文章
689瀏覽量
34971
發(fā)布評(píng)論請(qǐng)先 登錄
AS32A601型MCU芯片如何進(jìn)行IAP升級(jí)?
檢查函數(shù)返回值的錯(cuò)誤和異常處理方法
如何在CW32F030上實(shí)現(xiàn)IAP功能實(shí)現(xiàn)遠(yuǎn)程升級(jí)?
?LMK61E0M可編程振蕩器技術(shù)文檔總結(jié)
AT32 MCU如何使用IAP
AT32 IAP using the USART
rtt only系統(tǒng)下程序運(yùn)行失敗: [FATAL ERROR] Exception 13:Load Page Fault,怎么解決?
請(qǐng)問(wèn)CY68013上位機(jī)發(fā)送的返回值到底代表什么意思?
FX3 RAM編程因定制板而失敗怎么解決?
I2C EEPROM編程失敗的原因?
使用mbedtls進(jìn)行ECDSA簽名驗(yàn)證失敗的原因?
使用STM32L476RCT6 HAL_FLASHEx_Erase()函數(shù),擦除失敗的原因?
2024年AI編程技術(shù)與工具發(fā)展總結(jié)

IAP編程page0返回失敗的問(wèn)題總結(jié)
評(píng)論