在第二章有提到,SPI Flash预留了2MB来存储目标单片机的固件以及配置信息的,那么相对应的SPI Flash前面会有一个区域用来存储这些信息.
T-FLASH_HEAD_INFO结构体描述:
typedef struct {
char exec[8];
unsigned int headlength;
char devicename[64];
unsigned int flashsize;
unsigned int flashorg;
unsigned int flashpagesize;
unsigned char mcutype; //avr or arm
unsigned char interface_type; //0:ISP 1:PDI 2:SWD 3:JTAG
// unsigned int fuseopt; //by xu removed 2017 12.05
unsigned int program_info;
unsigned int year;
unsigned int month;
unsigned int day;
unsigned int hour;
unsigned int minute;
unsigned char section_count;
unsigned short header_crc;
}T_FLASH_HEAD_INFOTT;
下面是相关成员的介绍:
exec[8]: 有效标识符 "ARMPLINK" ,
headlength: sizeof(T_FLASH_HEAD_INFOTT)
devicename[64]: 目标单片机的型号,比如"STM32F205RCT6"
flashsize:目标单片机的flash容量
flashorg:目标单片机flash memory起始地址
flashpagesize: 目标单片机flash一个page的大小
mcutype: 不同厂家索引,比如Atme,STM,Nordic,Dialog,FreeScale等
interface_type:烧录接口,SWD,JTAG,ISP
program_info: 不同Bit代表不同的涵义,分别代表,是否擦除整个Chip,是否需要编程校验,是否需要编程熔丝位置,
是否需要配置EEPROM,是否需要烧写加密位。
year,month,day,hour,minute:Windows将固件信息下载到P-LINK的时间,用来后续追踪固件版本号。
section count:T-FLASH_HEAD_INFO后面的struct,用来标识固件是否存在分段烧录以及固件的地址,固件的长度信息,
目标单片机配置信息,eeprom配置信息等。
header_crc: T-FLASH_HEAD_INFO CRC校验,用来确保Header完整性。
相关函数如下:
unsigned short GetCRC(unsigned char*buf,int len)
{
unsigned short result=0;
int i;
for(i=0;i<len;i++)
{
result+=buf[i];
}
return result;
}
Section 相关结构体描述:
typedef struct{
unsigned char type; //0 code, 1 eeprom, 2 userpage 3,usersignnature 4,fuse
unsigned int size;
unsigned int addressorg;
unsigned int address;
}T_SECTION_STRUCT;
type: 0 固件,1 eeprom配置信息,2,userpage,3,usersignnature 4,目标单片机配置信息
size:固件或者配置信息的大小
addressorg: 固件或者配置信息所在的SPI Flash Address
address: 烧录到目标单片机的位置.