amobbs.com 阿莫电子技术论坛

标题: help,lpc17xx在IAP时机率性出现看门狗复位的情况,帮忙分析 [打印本页]

作者: Edesigner.    时间: 2020-3-2 21:49
标题: 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, [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);
}

作者: Edesigner.    时间: 2020-3-2 21:51
看门狗超时时间是2秒。在主程序喂狗,喂狗时间是足够及时的,我试过把超时时间设置为4秒也会出现这个情况。
作者: Edesigner.    时间: 2020-3-2 22:03
主频率99.5M和72M都试过。效果一样。
作者: Edesigner.    时间: 2020-3-2 22:37
把看门狗关闭了,就直接死机了。
作者: advarx21ic    时间: 2020-3-2 22:40
要关狗的
作者: advarx21ic    时间: 2020-3-2 22:40
也要关中断
作者: Edesigner.    时间: 2020-3-3 08:07
advarx21ic 发表于 2020-3-2 22:40
也要关中断

关闭了中断还是不行,__disable_irq()。执行JMP_Boot后还是死机。
作者: security    时间: 2020-3-3 08:30
IAP 完,重启系统。
作者: Edesigner.    时间: 2020-3-3 08:36
关闭了中断再擦和写flash还是会出现在写flash时死机的情况。
作者: Edesigner.    时间: 2020-3-3 08:37
会不会是频率过高?
        au32Command[4] = SystemFrequency / 1000UL;        /* Core clock frequency in kHz */

SystemFrequency=72M;
作者: Edesigner.    时间: 2020-3-3 13:19
security 发表于 2020-3-3 08:30
IAP 完,重启系统。

冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。
作者: Edesigner.    时间: 2020-3-3 13:19
advarx21ic 发表于 2020-3-2 22:40
也要关中断

冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。
作者: szyusong@163    时间: 2020-3-3 13:23
boot代码放到RAM中运行
作者: Edesigner.    时间: 2020-3-3 13:50
szyusong@163 发表于 2020-3-3 13:23
boot代码放到RAM中运行

擦写的与运行的程序不在同一个扇区
作者: security    时间: 2020-3-3 13:55
Edesigner. 发表于 2020-3-3 13:19
冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。 ...

跳转的代码,参考、比对一下这里:「KEAZ128 UART bootloader跳转应用层程序异常」
中断是要关的,先把一些逻辑整正确了,再来看还有没有问题。
作者: Edesigner.    时间: 2020-3-3 20:24
security 发表于 2020-3-3 13:55
跳转的代码,参考、比对一下这里:「KEAZ128 UART bootloader跳转应用层程序异常」
中断是要关的,先把一 ...


未解决,真是好奇怪。从APP区跳转到IAP区后,再跳转回APP区时死机(不知道是死机还是跑飞了)。更真奇怪的是上电后从IAP区跳转到APP区却是正常的。
作者: Edesigner.    时间: 2020-3-3 20:50
szyusong@163 发表于 2020-3-3 13:23
boot代码放到RAM中运行

从APP区跳转到IAP区不写FLASH等2秒超时后再跳回APP区时也是会死机
作者: Edesigner.    时间: 2020-3-3 23:20
本帖最后由 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;   
}

作者: R8C    时间: 2020-3-19 17:44
这种问题不容易处理
作者: TANK99    时间: 2020-3-21 10:24
用强等看门狗复位啊?为啥不用nvic里的复位?这样就算APP里没用到看门狗也不用特地开了。
作者: Edesigner.    时间: 2020-3-21 10:26
TANK99 发表于 2020-3-21 10:24
用强等看门狗复位啊?为啥不用nvic里的复位?这样就算APP里没用到看门狗也不用特地开了。 ...

如何操作?
作者: lj0755    时间: 2020-3-21 18:59
我是路过的
作者: TANK99    时间: 2020-3-23 13:43
Edesigner. 发表于 2020-3-21 10:26
如何操作?

NVIC_SystemReset( );        // 复位
这个在Cortex-m0/m3/m4 CMSIS中都有的。
作者: Edesigner.    时间: 2020-3-23 13:52
TANK99 发表于 2020-3-23 13:43
NVIC_SystemReset( );        // 复位
这个在Cortex-m0/m3/m4 CMSIS中都有的。

这个能重新初始化寄存器吗?
作者: TANK99    时间: 2020-3-23 14:24
Edesigner. 发表于 2020-3-23 13:52
这个能重新初始化寄存器吗?

会的,全部初始化一遍的。




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4