0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

編程sector0中的page0時候總是失敗問題

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:恩智浦MCU加油站 ? 2021-10-20 10:56 ? 次閱讀

本篇文章是《LPC技術(shù)小貼士-自動添加中斷向量校驗(yàn)位》的番外篇。

最近在支持客戶的時候遇到這樣一個問題:客戶在做自己的二級boot loader,并且在使用LPC54608 IAP功能,編程sector0中的page0時候總是失敗(返回0x21錯誤碼),但是編程任何其他page的時候,都沒有問題(客戶的代碼在最后一個sector里,不編程)。

問題乍一看比較詭異,因?yàn)橹挥衟age0會出問題,對其他page的操作都是沒有問題的,并且擦除page/sector也沒有問題,只有編程操作會出錯。

經(jīng)過了一段短暫的討論,最后把問題鎖定在了LPC中斷向量表的check sum校驗(yàn)機(jī)制上:LPC(除比較新的LPC5500系列外)基本都需要在中斷向量表的第8個位置上填入前7個中斷向量的校驗(yàn)和,關(guān)于校驗(yàn)和的具體內(nèi)容可以參考開篇提到的文章。

Keil編譯出來的.bin文件中,默認(rèn)并沒有自動添加這個校驗(yàn)和,所以每當(dāng)調(diào)用IAP變成page0的時候,IAP程序內(nèi)部都會檢查這個校驗(yàn)和,一旦校驗(yàn)和錯誤(比如全0) 就會返回失敗。

解決方法也很簡單,就是在每次編程page0的時候都計算下校驗(yàn)和即可,這里直接給出計算校驗(yàn)和的代碼:

213df384-30e7-11ec-82a8-dac502259ad0.png

adr為編程地址,當(dāng)adr為0時既編程page0區(qū)域,紅框內(nèi)的代碼就是計算校驗(yàn)和,并且把校驗(yàn)和填到中斷向量表的第8個位置上。

加上這段計算校驗(yàn)和代碼后,問題迎刃而解。這個問題普遍存在于除LPC5500系列外幾乎所有老的LPC型號上,希望本文章對大家開發(fā)LPC MCU有所幫助!

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • plc
    plc
    +關(guān)注

    關(guān)注

    5014

    文章

    13353

    瀏覽量

    464532
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3634

    瀏覽量

    93876

原文標(biāo)題:LPC工程小貼士:IAP編程page0返回失敗的問題

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    調(diào)試ADS1256,到了讀轉(zhuǎn)換結(jié)果的時候結(jié)果總是0,為什么?

    最近一直在調(diào)試ADS1256,目前讀寫寄存器沒有問題,但是到了讀轉(zhuǎn)換結(jié)果的時候 結(jié)果總是0,我做的是單端測量,AINp選的通道3,AINn選的是AINCOM 但總是讀不出結(jié)果來,哪
    發(fā)表于 01-09 08:12

    Master讀取tca8418時候,發(fā)送寄存器地址沒有ACK是什么原因呢?

    Master讀取tca8418時候,先是發(fā)送地址0x68,可以得到ACK,然后繼續(xù)發(fā)送寄存器地址,但是就沒有ACK? 是什么原因呢?
    發(fā)表于 12-23 06:45

    ADS1263獲取ID總是失敗,為什么?

    器件獲取ID總是失敗,數(shù)據(jù)手冊標(biāo)明的ID是1,總是得到0, 波形圖如下,應(yīng)該如何做? 為何器件的回復(fù)數(shù)據(jù)會延后 CS 以及 SCLK ? 感謝~ 圖中,
    發(fā)表于 11-21 07:09

    cdci6214 eepromsel和refsel都置為MID的時候能否正常工作?

    配置寫入寄存器,然后copy到eeprom page0了,第二次上電不是應(yīng)該自動直接從eeprom page0里面讀出數(shù)據(jù),然后產(chǎn)生波形嗎? 我想知道我們這個流程是正確的嗎?
    發(fā)表于 11-11 06:39

    TLV320ADC3101可以正確設(shè)置和讀寫PAGE0頁的數(shù)據(jù),但是讀取PAGE4頁上的寄存器值都為0,為什么?

    如題,通過csl庫提供的程序,可以正確設(shè)置和讀寫PAGE0頁的數(shù)據(jù),但是讀取PAGE4頁上的寄存器值都為0,很奇怪,數(shù)據(jù)手冊好像也沒有說讀取PAGE4與讀取其他頁面上的寄存器有什么不
    發(fā)表于 10-30 08:02

    使用TLV320AIC3256時候,當(dāng)音樂暫停時候,耳機(jī)可以聽到“滋滋”的聲音,為什么?

    使用TLV320AIC3256時候,當(dāng)音樂暫停時候,耳機(jī)可以聽到“滋滋”的聲音。
    發(fā)表于 10-24 07:15

    TLV320AIC3106配置執(zhí)行完之后,讀寄存器94值為0XC0,結(jié)果與理論不一致是哪里出了問題?

    。 第一個圖是配置,第二個圖是數(shù)據(jù)路徑的選擇,第三個圖是page0的94寄存器; 問題是: 當(dāng)配置執(zhí)行完之后,讀寄存器94值為0XC0,理論結(jié)果應(yīng)該是0XD8,這個結(jié)果與理論結(jié)果不一致,可能是什么原因,各位給分析分析,謝謝 方
    發(fā)表于 10-21 07:38

    進(jìn)行aic3106的配置時,將0x80寫入page0/regster25,讀出來卻是0x86,為什么?

    我在進(jìn)行aic3106的配置時,將0x80寫入page0/regster25,讀出來卻是0x86,該寄存器的低4位為保留值,請問是否會影響我mic輸入的聲音?
    發(fā)表于 10-15 06:49

    在imotion解決方案設(shè)計器中使用不同的參數(shù)集,為什么總是加載參數(shù)集0嗎?

    總是會加載參數(shù) 集 0。 在配置向?qū)?b class='flag-5'>中,我選擇了 多參數(shù)輸入模式:UART。 知道為什么總是加載參數(shù)集 0 嗎?
    發(fā)表于 06-03 08:13

    三菱串口 fx0N編程口如何使用?

    1 驅(qū)動簡介 三菱F X0N P****LC 使用 自帶的P LC 串口 通訊,默認(rèn)為編程口協(xié)議,網(wǎng)關(guān)使用 F X0N 編程口 驅(qū)動,按照下述過程操作即可實(shí)現(xiàn)網(wǎng)關(guān)與PLC直接通訊。 默
    的頭像 發(fā)表于 04-16 11:50 ?725次閱讀
    三菱串口 fx<b class='flag-5'>0</b>N<b class='flag-5'>編程</b>口如何使用?

    STM32f407 FLASH_EraseSector 0-4 sector卡死的原因?怎么解決?

    STM32f407 FLASH_EraseSector 0-4 sector卡死問題
    發(fā)表于 04-03 06:28

    stm32f407 FLASH_EraseSector 0-4 sector卡死怎么解決?

    我代碼運(yùn)行啟動是使用的stm32f407內(nèi)部flash,我燒錄完程序運(yùn)行起來后,代碼區(qū)占內(nèi)部sector 0-4扇區(qū)。我現(xiàn)在需要在程序運(yùn)行期間在線升級軟件。但是我用FLASH_EraseSector
    發(fā)表于 04-03 06:19

    stm32g473 flash擦除失敗的原因?

    在跑ucosii的時候進(jìn)行OTA升級擦除失敗,關(guān)掉系統(tǒng)調(diào)度可以擦除成功。單獨(dú)建立一個裸機(jī)工程,跑page擦除程序,Jlink單步調(diào)試概率性出現(xiàn)擦除失敗,上電一直跑可以擦除成功。這是芯片
    發(fā)表于 03-26 08:11

    S6J3300的FLASH_If_Erase_Sector(1)擦除不掉是什么原因?

    0E00_0000)的時候, Sector=GetSector(0x0E001100U); FLASH_If_Erase_Sector(
    發(fā)表于 02-22 06:07

    在TLE9879上從代碼擦除Code Flash Page時出現(xiàn)問題求解

    ]; for (i = 0; i < flashPageSize; i++) { page_data [i] = i; } wdt1_sow_Service (1u
    發(fā)表于 01-30 07:24