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
    +关注

    关注

    4974

    文章

    12231

    浏览量

    454790
  • 编程
    +关注

    关注

    88

    文章

    3439

    浏览量

    92368

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

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

收藏 人收藏

    评论

    相关推荐

    stm32g030f6p6 flash快速编程总是失败的原因?

    使用stm32g030f6p6 对flash快速编程总是第一次可以正常的写,第二次写就失败失败地方总在 HAL_FLASH_Program这条函数,这个地方卡了好几个星期了,现在请
    发表于 04-07 07:32

    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

    FLM下载算法FlashDevice成员参数定义的超时时间如何计算?

    0x0400, 0x000000,// Sector Size 1kB (128 Sectors) SECTOR_END }; #endif 复制代码 100, // Prog
    发表于 03-19 06:16

    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

    请问ADE7880读取基波成分的有效值为什么总是0

    软件电压、电流有效值,谐波失真等数据读取都很正常,唯独读取谐波成分的有效值FVRMS、FIRMS,基波成分的有功功率FWATT,基波成分的无功功率FVAR的时候总是读到全0,数据不
    发表于 12-26 06:32

    为什么AD7606有时候读的数据全为0,有时候正常采集?

    AD7606为什么有时候读的数据全为0,有时候正常采集。我重新上电,也不行,重启电脑就可以啦。很奇怪的现象。 我的项目是用USB通信,AD7606来采集模拟信号。在批量生产中,总是
    发表于 12-18 07:15

    Arduino编程的端口为什么总是奇怪的消失?

    Arduino编程的端口为什么总是奇怪的消失,要重新选择一次
    发表于 11-07 06:23

    OTP零位磁编码零位编程案例分享

    以一个8页的OTPSD3012为例,页数从page0~page7,每页32字节,其中page0是系统配置,包括工作模式,Z脉冲宽度,UVW级数等系统配置,Page1~3厂家使用不对用户
    的头像 发表于 10-25 15:52 262次阅读
    OTP零位磁编码零位<b class='flag-5'>编程</b>案例分享

    keil总是显示p0未定义应该怎么解决?

    keil总是显示p0未定义应该怎么解决?
    发表于 10-18 07:34

    关于STM32G0 flash擦除失败问题求解

    (); 程序如上,flash分了APP1和APP2,擦除APP1是没问题,擦除APP2就失败,且打印出来的PageError=0
    发表于 09-20 07:06

    请问FLM下载算法FlashDevice成员参数定义的超时时间如何计算的?

    ,// Programming Page Size 0,// Reserved, must be 0 0xFF,// Initial Content of Erased Memory
    发表于 08-07 07:06

    为什么我的slave设备总是收到“Master : 0”?

    项目描述: 1.CY8CKIT-059为主站,ESP8266 mini d1为从站。 2.Master每2秒通过SPI与Slave通信,每次值增加1. 问: 我不知道为什么我的slave设备总是收到“Master : 0”。值每次都没有增加。
    发表于 05-10 12:05