最近在支持客户的时候遇到这样一个问题:客户在做自己的二级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的时候都计算下校验和即可,这里直接给出计算校验和的代码:
adr为编程地址,当adr为0时既编程page0区域,红框内的代码就是计算校验和,并且把校验和填到中断向量表的第8个位置上。
加上这段计算校验和代码后,问题迎刃而解。这个问题普遍存在于除LPC5500系列外几乎所有老的LPC型号上,希望本文章对大家开发LPC MCU有所帮助!
编辑:jq
-
LPC
+关注
关注
8文章
136浏览量
77620 -
IAP
+关注
关注
2文章
163浏览量
24273 -
代码
+关注
关注
30文章
4769浏览量
68474 -
编译
+关注
关注
0文章
655浏览量
32839
发布评论请先 登录
相关推荐
STM32G0B1VC IAP时flash擦除函数进不去是怎么回事?
cdci6214 eepromsel和refsel都置为MID的时候能否正常工作?
TLV320ADC3101可以正确设置和读写PAGE0页的数据,但是读取PAGE4页上的寄存器值都为0,为什么?
进行aic3106的配置时,将0x80写入page0/regster25,读出来却是0x86,为什么?
TLV320AIC3254使用SPI进行设置时,如何设置寄存器?
TLV320AIC3104-Q1如何设置dac的低通滤波器把高频分量去掉?
ESP8266配网失败如何返回消息给APP?
USB读写时,调用WriteFile或者ReadFile时总是返回失败,为什么?
做usb dfu进行iap升级,固件下载完成后,校验不过,very失败的原因?
IAP跳转APP开始可以,如果从APP跳回IAP后再跳到APP失败的原因?
stm32g473 flash擦除失败的原因?
STM32F0 IAP跳转到APP后无法进入中断怎么解决?
关于stm32F4 IAP跳转的疑问求解
GD32 MCU ISP失败的原因

评论