NXP ARM Vector Table CheckSum
Signature Creator for NXP Cortex-M Devices
Algorithm for creating the checksum
The reserved Cortex-M3 exception vector location 7 (offset 0x001C in the vector table)
should contain the 2’s complement of the check-sum of table entries 0 through 6.
This causes the checksum of the first 8 table entries to be 0.
The boot loader code checksums the first 8 locations in sector 0 of the flash.
If the result is 0, then execution control is transferred to the user code.
Application integrity check
Following a reset the secondary bootloader checks if there is a valid image contained
within the application flash sectors.
It does this by generating a 16-bit CRC of the application flash sectors
and comparing it to the value stored in the last 2 bytes of flash memory.
If the two values match then the secondary bootloader executes the application,
if not the process of downloading a new application is started.
NXP LPC parts use a word in the vector table of the processor to store a checksum
that is examined by the bootloader to identify a valid image.
For ARM7/ARM9 based parts this checksum word is stored at offset 0x14,
for Cortex-M based parts it is stored at offset 0x1C
Note:
This checksum is calculated from the contents of the vector table, not the whole image.
For more details please see the user manual for the MCU that you are using.
When downloading code via the debugger, this checksum word
will be filled in automatically as the image is downloaded.
When creating a binary file, you will need to ensure that you run the supplied checksum utility
to post-process the binary yourself.
If you modify the supplied post-build step to create your binary
(as per the FAQ Post-processing your linked application,
then this will normally be done automatically by the post-build step:
checksum -p ${TargetChip} -d ${BuildArtifactFileBaseName}.bin;
But if you need to create a hex file for use by FlashMagic care needs to be taken
that you do not run the checksum utility on the hex file itself.
The checksum utility only works on binary files, not hex files.
Therefore, the checksum utilty will corrupt your hex file if you use the hex file as input.
Note that FlashMagic will automatically set the checksum word for you
when you use it to program a hex file to an LPC device.
But if you wish to set the checksum yourself, then the recommend way of creating such a hex file is as follows:
convert to binary
run the checkum utility
convert the binary in hex, using
arm-none-eabi-objcopy -I binary -O ihex myfile.bin myfile.hex
Generating other types of checksum
There are many other different types of checksums that users may want to perform on an image.
A great tool for manipulating image files and generating a variety of checksums is the Open Source SRecord Tool.
ARM: LPC18xx/43xx
On-chip Flash Loader Vector Checksum Calculation
Information in this knowledgebase article applies to:
- MDK-ARM
- LPC18xx/43xx On-chip Flash Loader
SYMPTOM
When I load an example to the internal flash on the LPC18xx/43xx and correctly set the boot pins, the program still won't run.
What could be wrong?
CAUSE
The most likely reason this happens is that the application does not fulfill the criterion for Valid User Code.
Unlike the on-chip flash loaders for other LPC devices, the flash loader for LPC18xx/43xx on-chip flash
does not calculate the NXP specific vector table checksum.
So the on-chip boot loader will not detect valid user code and does not boot from it.
The reason for this different behavior is that LPC18xx/43xx
can boot from different flash banks.
It is up to the user to place the vector table in flash bank A or B.
The generic flash loader must NOT modify the flash bank which does not contain the vector table.
RESOLUTION
Add the checksum to the output file with a user command that runs automatically after the build.
MDK-ARM also supplies the suitable command line tool for this purpose.
In Options for Target — User — Run User Programs After Build/Rebuild add:
$K\ARM\BIN\ELFDWT.EXE !L BASEADDRESS(0x1A000000)
If your application starts from bank A.
Or add:
$K\ARM\BIN\ELFDWT.EXE !L BASEADDRESS(0x1B000000)
if your application starts from bank B.
So the correct vector checksum will be added to the output file
and the NXP on-chip boot loader will recognize it as valid user code.
#include <stdio.h>
#include <stdint.h> #define BLOCK_COUNT 7
#define BLOCK_LENGTH 4
#define BLOCK_TOTAL (BLOCK_COUNT*BLOCK_LENGTH) typedef unsigned char byte_t; int main(int argc, char *argv[])
{
FILE* pf;
byte_t buf[BLOCK_TOTAL];
uint32_t crc = ;
uint32_t block; // Check for required arguments
if (argc < )
{
printf("syntax: lpcrc <firmware.bin>\n");
return ;
} // Try to open the supplied firmware
if ((pf = fopen(argv[],"rb+")) == NULL)
{
printf("error: could not open file [%s] with write access\n",argv[]);
return ;
} // Read out the data blocks used for crc calculation
if (fread(buf,,BLOCK_TOTAL,pf) != BLOCK_TOTAL)
{
printf("error: could not read required bytes\n");
fclose(pf);
return ;
} // Compute the crc value
for (block=; block<BLOCK_COUNT; block++)
{
crc += *((uint32_t*)(buf+(block*BLOCK_LENGTH)));
}
crc = (~crc) + ; // Reposition the file stream indicator to switch between read and write
if (fseek(pf,,SEEK_CUR) != )
{
printf("error: could not switch from read to write mode\n");
fclose(pf);
return ;
} // Write the crc back to the file
if (fwrite((byte_t*)&crc,,BLOCK_LENGTH,pf) != BLOCK_LENGTH)
{
printf("error: could not write crc back to file\n");
fclose(pf);
return ;
} printf("succesfully updated crc to: %08x\n",crc);
fclose(pf); return ;
}
NXP ARM Vector Table CheckSum的更多相关文章
- imx6 Image Vector Table (IVT)
imx6开启启动之后,运行板子上的ROM程序.ROM确定启动的设备,进行一些初始化,然后读取IVT,进行寄存器初始化,最后运行uboot/cpu/arm_cortexa8/start.S中的_star ...
- STM32F4XX devices vector table for EWARM toolchain.
;/******************** (C) COPYRIGHT 2015 STMicroelectronics ******************** ;* File Name : sta ...
- STM32F1XX devices vector table for EWARM toolchain.
;******************** (C) COPYRIGHT 2014 STMicroelectronics ******************* ;* File Name : start ...
- swddude -- A SWD programmer for ARM Cortex microcontrollers.
Introducing swddude I love the ARM Cortex-M series of microcontrollers. The sheer computational po ...
- IAR EWARM Checksum Technical Note
IELFTOOL Checksum - Basic actions EW targets: ARM, RH850, RX, SH, STM8 EW component: General issues ...
- Cortex-M0(NXP LPC11C14)启动代码分析
作者:刘老师,华清远见嵌入式学院讲师. 启动代码的一般作用 1.堆和栈的初始化: 2.向量表定义: 3.地址重映射及中断向量表的转移: 4.初始化有特殊要求的断口: 5.处理器模式: 6.进入C应用程 ...
- Cortex-M3(NXP LPC 1788) 启动代码
startup_LPC177x_8x.s启动代码分析. 参考资料: Cortex-M3 (NXP LPC1788)之启动代码分析 ARM启动过程(Cortex-M3 NXP LPC1768为例) ;/ ...
- 自己用C语言写NXP S32K116 serial bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 每次我有了新的EVA ...
- [ARM] Cortex-M Startup.s启动文件相关代码解释
1. 定义一个段名为CSTACK, 这里: NOROOT表示如何定义的段没有被关联,那么同意会被优化掉,如果不想被优化掉就使用ROOT. 后面的括号里数字表示如下: (1):这个段是2的1次方即2字节 ...
随机推荐
- 记webpack下引入vue的方法(非.vue文件方式)
直接script引入下载静态的vue.js文件则最后用copy-webpack-plugin复制到一样的目录即可 使用npm安装的vue无法直接用 import vue from "vue& ...
- 判断线段之间的关系(D - Intersecting Lines POJ - 1269 )
题目链接:https://vjudge.net/contest/276358#problem/D 题目大意:每一次给你两条直线,然后问你这两条直线的关系(平行,共线,相交(输出交点)). 具体思路:先 ...
- linux笔记_day10_shell编程
1.shell编程 编程语言 静态语言:编译型语言 强类型(变量在使用前,必须事先声明) 事先转换成可执行语言 动态语言:解释型语言 弱类型(变量用时声明,拿来直接用,甚至不区分数据类型,一般默认都为 ...
- python实现两个经纬度点之间的距离和方位角
from:http://blog.csdn.net/zhuqiuhui/article/details/53180395 1. 求两个经纬点的方位角,P0(latA, lonA), P1(latB, ...
- MYSQL 添加外键报错
2014年6月16日 10:48:51 出错的部分提示摘录: #1452 - Cannot add or update a child row: a foreign key constraint fa ...
- LeetCode(10):正则表达式匹配
Hard! 题目描述: 给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整 ...
- java Set(集合)
set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常 ...
- MySql存储过程中limit传参
最近做项目用到了MySQL数据库,感觉还是蛮好用的,但是有同事前几天写存储过程的时候老调不通,我看了看后发现把limit语句后面带的参数随便改成一个数字就调试通过了,不知道是MySql当初就这么设计的 ...
- .NetCore 下使用多个DbContext
一个项目中使用多个DbContext 或者种数据库的多个DbContext 业务需要 单个DbContext使用不需要给出说明 1.dotnet ef migrations add migration ...
- .NetCore下B/S结构 初探基于遗传学算法的中学自动排课走班(二)
分析下染色体基因 这里用 老师 课程 班级 教室 周天 上下晚 课时作为染色体编码我封装了如下类 /// <summary> /// NP 授课事件 由教室.课程.班级 时间片段构成 li ...