0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

编程sector0中的page0时候总是失败问题

恩智浦MCU加油站 来源:恩智浦MCU加油站 作者:恩智浦MCU加油站 2021-10-20 10:56 次阅读

本篇文章是《LPC技术小贴士-自动添加中断向量校验位》的番外篇。

最近在支持客户的时候遇到这样一个问题:客户在做自己的二级boot loader,并且在使用LPC54608 IAP功能,编程sector0中的page0时候总是失败(返回0x21错误码),但是编程任何其他page的时候,都没有问题(客户的代码在最后一个sector里,不编程)。

问题乍一看比较诡异,因为只有page0会出问题,对其他page的操作都是没有问题的,并且擦除page/sector也没有问题,只有编程操作会出错。

经过了一段短暂的讨论,最后把问题锁定在了LPC中断向量表的check sum校验机制上:LPC(除比较新的LPC5500系列外)基本都需要在中断向量表的第8个位置上填入前7个中断向量的校验和,关于校验和的具体内容可以参考开篇提到的文章。

Keil编译出来的.bin文件中,默认并没有自动添加这个校验和,所以每当调用IAP变成page0的时候,IAP程序内部都会检查这个校验和,一旦校验和错误(比如全0) 就会返回失败。

解决方法也很简单,就是在每次编程page0的时候都计算下校验和即可,这里直接给出计算校验和的代码:

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

adr为编程地址,当adr为0时既编程page0区域,红框内的代码就是计算校验和,并且把校验和填到中断向量表的第8个位置上。

加上这段计算校验和代码后,问题迎刃而解。这个问题普遍存在于除LPC5500系列外几乎所有老的LPC型号上,希望本文章对大家开发LPC MCU有所帮助!

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • plc
    plc
    +关注

    关注

    5011

    文章

    13297

    浏览量

    463295
  • 编程
    +关注

    关注

    88

    文章

    3615

    浏览量

    93722

原文标题:LPC工程小贴士:IAP编程page0返回失败的问题

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Master读取tca8418时候,发送寄存器地址没有ACK是什么原因呢?

    Master读取tca8418时候,先是发送地址0x68,可以得到ACK,然后继续发送寄存器地址,但是就没有ACK? 是什么原因呢?
    发表于 12-23 06:45

    ADS1263获取ID总是失败,为什么?

    器件获取ID总是失败,数据手册标明的ID是1,总是得到0, 波形图如下,应该如何做? 为何器件的回复数据会延后 CS 以及 SCLK ? 感谢~ 图中,
    发表于 11-21 07:09

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

    配置写入寄存器,然后copy到eeprom page0了,第二次上电不是应该自动直接从eeprom page0里面读出数据,然后产生波形吗? 我想知道我们这个流程是正确的吗?
    发表于 11-11 06:39

    TLV320ADC3101可以正确设置和读写PAGE0页的数据,但是读取PAGE4页上的寄存器值都为0,为什么?

    如题,通过csl库提供的程序,可以正确设置和读写PAGE0页的数据,但是读取PAGE4页上的寄存器值都为0,很奇怪,数据手册好像也没有说读取PAGE4与读取其他页面上的寄存器有什么不
    发表于 10-30 08:02

    使用TLV320AIC3256时候,当音乐暂停时候,耳机可以听到“滋滋”的声音,为什么?

    使用TLV320AIC3256时候,当音乐暂停时候,耳机可以听到“滋滋”的声音。
    发表于 10-24 07:15

    TLV320AIC3106配置执行完之后,读寄存器94值为0XC0,结果与理论不一致是哪里出了问题?

    。 第一个图是配置,第二个图是数据路径的选择,第三个图是page0的94寄存器; 问题是: 当配置执行完之后,读寄存器94值为0XC0,理论结果应该是0XD8,这个结果与理论结果不一致,可能是什么原因,各位给分析分析,谢谢 方
    发表于 10-21 07:38

    进行aic3106的配置时,将0x80写入page0/regster25,读出来却是0x86,为什么?

    我在进行aic3106的配置时,将0x80写入page0/regster25,读出来却是0x86,该寄存器的低4位为保留值,请问是否会影响我mic输入的声音?
    发表于 10-15 06:49

    TLV320AIC3254使用SPI进行设置时,如何设置寄存器?

    3254寄存器有两页,PAGE0PAGE1,地址为0x00和0x01,问:使用SPI该如何设置寄存器?
    发表于 10-12 07:19

    在imotion解决方案设计器中使用不同的参数集,为什么总是加载参数集0吗?

    总是会加载参数 集 0。 在配置向导,我选择了 多参数输入模式:UART。 知道为什么总是加载参数集 0 吗?
    发表于 06-03 08:13

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

    1 驱动简介 三菱F X0N P****LC 使用 自带的P LC 串口 通讯,默认为编程口协议,网关使用 F X0N 编程口 驱动,按照下述过程操作即可实现网关与PLC直接通讯。 默
    的头像 发表于 04-16 11:50 678次阅读
    三菱串口 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卡死问题
    发表于 04-03 06:28

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

    我代码运行启动是使用的stm32f407内部flash,我烧录完程序运行起来后,代码区占内部sector 0-4扇区。我现在需要在程序运行期间在线升级软件。但是我用FLASH_EraseSector
    发表于 04-03 06:19

    stm32g473 flash擦除失败的原因?

    在跑ucosii的时候进行OTA升级擦除失败,关掉系统调度可以擦除成功。单独建立一个裸机工程,跑page擦除程序,Jlink单步调试概率性出现擦除失败,上电一直跑可以擦除成功。这是芯片
    发表于 03-26 08:11

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

    0E00_0000)的时候Sector=GetSector(0x0E001100U); FLASH_If_Erase_Sector(
    发表于 02-22 06:07

    在TLE9879上从代码擦除Code Flash Page时出现问题求解

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