NXP Cortex-M系列MCU用户代码有效性验证问题
问题描述
用Jflash烧写LPC程序时提示错误:Your program data does not contain a valid checksum. Without a valid checksum your application will not run. ![校验和出错提醒](https://img-blog.csdnimg.cn/e3b48ef2f3e246d9ae2494c349fd852c.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAT25lUHVuY2hQ,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) 如果选否,不添加校验和,则烧录校验失败。 ![烧录失败](https://img-blog.csdnimg.cn/ac4f1878ddf84f5b8dac533a967f66ec.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAT25lUHVuY2hQ,size_19,color_FFFFFF,t_70,g_se,x_16) 选择是,则会自动补上校验和。 ![自动补充校验和](https://img-blog.csdnimg.cn/1490a7716f924b29899add34b622d98e.png#pic_center)
原因分析
查阅NXP Cortex-M系列MCU用户手册,有这么一段对用户代码有效性验证的描述: ![校验和要求](https://img-blog.csdnimg.cn/9d411eea8931491fbc1576efd517ed61.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAT25lUHVuY2hQ,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) NXP Cortex-M系列MCU的Boot Block在芯片的控制权交给用户程序之前,要先判断用户程序是否有效,否则不运行用户程序。 中断向量表中第8个双字节(Dword7,位于0x001C)保存前7个双字节(Dword0-6)之和的二进制补码Checksum,Boot Block判断到Checksum和前7个双字节的和为0是判断用户代码有效,否则无效。
解决方法
Checksum可人为添加,也可通过软件自动添加,比如以上Jflash烧写时弹框提醒后点击“是”自动添加。 使用Keil编译程序时可通过调用用户命令添加,操作方法为: 在After Build/Rebulid Run#1添加命令 $K\ARM\BIN\ELFDWT.EXE !L BASEADDRESS(0x1A000000) ![添加用户命令](https://img-blog.csdnimg.cn/66f04de5e59f4948a218abf62bb96e09.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAT25lUHVuY2hQ,size_20,color_FFFFFF,t_70,g_se,x_16)
注意事项
-
建议引用相对路径 程序地址从0开始时,无需BASEADDRESS(0x1A000000),即 $K\ARM\BIN\ELFDWT.EXE !L 不推荐用一些教程使用的 $K\ARM\BIN\ELFDWT.EXE #L 因为!L引用的是.axf文件的相对路径,而#L引用的是.axf文件的绝对路径 -
绝对路径名称不能有空格 当引用绝对路径时,允许路径名称中有中文,但不允许有空格,否则用户命令执行会报错
延伸阅读
- 校验和计算方法
- ELFDWT.EXE用法
详见Keil里的Books->Complete User’s Guide Selection ![在这里插入图片描述](https://img-blog.csdnimg.cn/7f7c79030f5e4f7aa03b80f803692752.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAT25lUHVuY2hQ,size_20,color_FFFFFF,t_70,g_se,x_16) - 命令行中的特殊符号定义
详见Keil里的Books->Complete User’s Guide Selection ![命令行中的特殊符号定义](https://img-blog.csdnimg.cn/daf15a9365344c07b533b43fb6047d76.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAT25lUHVuY2hQ,size_20,color_FFFFFF,t_70,g_se,x_16)
参考资料
- 校验和自动填充实现方法
- KEIL生成的bin文件如何通过代码有效性检测
- 用J_Flash Arm烧写程序时提示错误
- 解决mdk生成bin烧录lpc1343无法运行问题
|