help,lpc17xx在IAP时机率性出现看门狗复位的情况,帮忙分析
内置看门狗机率性复位。有两个情况出现。第一是写数据到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, ;Load new stack pointer address
LDR PC, ;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,data,data);
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);
}
看门狗超时时间是2秒。在主程序喂狗,喂狗时间是足够及时的,我试过把超时时间设置为4秒也会出现这个情况。 主频率99.5M和72M都试过。效果一样。 把看门狗关闭了,就直接死机了。 要关狗的 也要关中断 advarx21ic 发表于 2020-3-2 22:40
也要关中断
关闭了中断还是不行,__disable_irq()。执行JMP_Boot后还是死机。 IAP 完,重启系统。 关闭了中断再擦和写flash还是会出现在写flash时死机的情况。 会不会是频率过高?
au32Command = SystemFrequency / 1000UL; /* Core clock frequency in kHz */
SystemFrequency=72M; security 发表于 2020-3-3 08:30
IAP 完,重启系统。
冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。 advarx21ic 发表于 2020-3-2 22:40
也要关中断
冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。 boot代码放到RAM中运行 szyusong@163 发表于 2020-3-3 13:23
boot代码放到RAM中运行
擦写的与运行的程序不在同一个扇区 Edesigner. 发表于 2020-3-3 13:19
冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。 ...
跳转的代码,参考、比对一下这里:「KEAZ128 UART bootloader跳转应用层程序异常」
中断是要关的,先把一些逻辑整正确了,再来看还有没有问题。 security 发表于 2020-3-3 13:55
跳转的代码,参考、比对一下这里:「KEAZ128 UART bootloader跳转应用层程序异常」
中断是要关的,先把一 ...
未解决,真是好奇怪。从APP区跳转到IAP区后,再跳转回APP区时死机(不知道是死机还是跑飞了)。更真奇怪的是上电后从IAP区跳转到APP区却是正常的。 szyusong@163 发表于 2020-3-3 13:23
boot代码放到RAM中运行
从APP区跳转到IAP区不写FLASH等2秒超时后再跳回APP区时也是会死机 本帖最后由 Edesigner. 于 2020-3-3 23:22 编辑
算了,定案了。问题1:解决方法,把IAP的频率设置为25000K,并且加了关闭中断保护后试了很多测试再没有出现死机现象。问题2:解决方法,由于程序从冷启动或者复位后运行再跳转到APP区是没有死机问题,死机问题只出现在APP区跳转到IAP区再跳转回APP区时才出现,所以要从APP区跳转到IAP时不采用跳转方式,而是直接利用看门狗复位方式。这算是目前最终的解决方案。谢谢上面各位热心网友提供的意见。
void WDT_reboot( void )
{
LPC_WDT->WDTC = 1; /* once WDEN is set, the WDT will start after feeding */
LPC_WDT->WDMOD = WDEN|WDRESET;
LPC_WDT->WDFEED = 0xAA; /* Feeding sequence */
LPC_WDT->WDFEED = 0x55;
}
这种问题不容易处理 用强等看门狗复位啊?为啥不用nvic里的复位?这样就算APP里没用到看门狗也不用特地开了。 TANK99 发表于 2020-3-21 10:24
用强等看门狗复位啊?为啥不用nvic里的复位?这样就算APP里没用到看门狗也不用特地开了。 ...
如何操作? 我是路过的 Edesigner. 发表于 2020-3-21 10:26
如何操作?
NVIC_SystemReset( ); // 复位
这个在Cortex-m0/m3/m4 CMSIS中都有的。 TANK99 发表于 2020-3-23 13:43
NVIC_SystemReset( ); // 复位
这个在Cortex-m0/m3/m4 CMSIS中都有的。
这个能重新初始化寄存器吗? Edesigner. 发表于 2020-3-23 13:52
这个能重新初始化寄存器吗?
会的,全部初始化一遍的。
页:
[1]