|
内置看门狗机率性复位。有两个情况出现。第一是写数据到flash时,第二是跳转到应用区的时候。当冷启动没有IAP通信时跳转到应用区是没有问题的。但IAP完后再跳转就会机率性复位。
跳转函数:
#define IMG_START_SECTOR 0x00003000 /* Sector 3 应用程序地址 */
#define IMG_END_SECTOR 0x0000FFFF /* Sector 15 */
/*********************************************************************************************************
** Function name: JMP_Boot
** Descriptions: 跳转到应用程序
** input parameters: address 应用程序地址
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
__asm void JMP_Boot( uint32_t address ){
LDR SP, [R0] ;Load new stack pointer address
LDR PC, [R0, #4] ;Load new program counter address
}
/*********************************************************************************************************
** Function name: Boot
** Descriptions: 跳转到应用程序
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void Boot( void )
{
//DISABLE_INTERRUPT();
SCB->VTOR = IMG_START_SECTOR & 0x1FFFFF80; //修改中断向量表
JMP_Boot(IMG_START_SECTOR);
}
写flash函数:
//正常返回1
static u4t load_image(u4t offset, u1t *data, u2t length)
{
u4t i;
//printf("offset=%d,length=%d,d1=%x,d2=%x,d3=%x\n",offset,length,data[0],data[1],data[2]);
if(length > 0){
if (flag_encode==1)
{
for(i=0; i<length/4; i++)
{
decode_dword2(au8RxBuffer+i*4,data+i*4);
}
}
else
{
memcpy(au8RxBuffer,data,256);
}
/* 准备写扇区操作 */
if(u32IAP_PrepareSectors(START_SECTOR, END_SECTOR) == IAP_STA_CMD_SUCCESS)
{
/* 将RAM内容复制到Flash */
if(u32IAP_CopyRAMToFlash(IMG_START_SECTOR + offset, (u4t)au8RxBuffer, length) == IAP_STA_CMD_SUCCESS)
{
/* 比较复制内容 */
if(u32IAP_Compare(IMG_START_SECTOR + offset, (u4t)au8RxBuffer, length, 0) == IAP_STA_CMD_SUCCESS)
{
return 1;
}
else
{
return 2;
}
}
else
{
return 3;
}
}
else
{
return 4;
}
}
else
return 0;
}
写完后的校验:
total=checksum(IMG_START_SECTOR,IMG_START_SECTOR-1+total);
static u4t checksum(u4t start, u4t end)
{
u4t total=0;
while (start<=end)
{
// printf("%02x,",*((u1t*)start));
WDTFeed();
total=total+*((u1t*)start);
start++;
}
return (total);
}
|
|