Edesigner. 发表于 2020-3-2 21:49:03

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);
}

Edesigner. 发表于 2020-3-2 21:51:27

看门狗超时时间是2秒。在主程序喂狗,喂狗时间是足够及时的,我试过把超时时间设置为4秒也会出现这个情况。

Edesigner. 发表于 2020-3-2 22:03:43

主频率99.5M和72M都试过。效果一样。

Edesigner. 发表于 2020-3-2 22:37:23

把看门狗关闭了,就直接死机了。

advarx21ic 发表于 2020-3-2 22:40:11

要关狗的

advarx21ic 发表于 2020-3-2 22:40:29

也要关中断

Edesigner. 发表于 2020-3-3 08:07:53

advarx21ic 发表于 2020-3-2 22:40
也要关中断

关闭了中断还是不行,__disable_irq()。执行JMP_Boot后还是死机。

security 发表于 2020-3-3 08:30:26

IAP 完,重启系统。

Edesigner. 发表于 2020-3-3 08:36:52

关闭了中断再擦和写flash还是会出现在写flash时死机的情况。

Edesigner. 发表于 2020-3-3 08:37:49

会不会是频率过高?
        au32Command = SystemFrequency / 1000UL;        /* Core clock frequency in kHz */

SystemFrequency=72M;

Edesigner. 发表于 2020-3-3 13:19:13

security 发表于 2020-3-3 08:30
IAP 完,重启系统。

冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。

Edesigner. 发表于 2020-3-3 13:19:36

advarx21ic 发表于 2020-3-2 22:40
也要关中断

冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。

szyusong@163 发表于 2020-3-3 13:23:31

boot代码放到RAM中运行

Edesigner. 发表于 2020-3-3 13:50:33

szyusong@163 发表于 2020-3-3 13:23
boot代码放到RAM中运行

擦写的与运行的程序不在同一个扇区

security 发表于 2020-3-3 13:55:59

Edesigner. 发表于 2020-3-3 13:19
冷启动IAP完可以跳转到APP区,但从APP区跳转到IAP区后再IAP完成后转到APP区时出现死机。 ...

跳转的代码,参考、比对一下这里:「KEAZ128 UART bootloader跳转应用层程序异常」
中断是要关的,先把一些逻辑整正确了,再来看还有没有问题。

Edesigner. 发表于 2020-3-3 20:24:27

security 发表于 2020-3-3 13:55
跳转的代码,参考、比对一下这里:「KEAZ128 UART bootloader跳转应用层程序异常」
中断是要关的,先把一 ...

未解决,真是好奇怪。从APP区跳转到IAP区后,再跳转回APP区时死机(不知道是死机还是跑飞了)。更真奇怪的是上电后从IAP区跳转到APP区却是正常的。

Edesigner. 发表于 2020-3-3 20:50:12

szyusong@163 发表于 2020-3-3 13:23
boot代码放到RAM中运行

从APP区跳转到IAP区不写FLASH等2秒超时后再跳回APP区时也是会死机

Edesigner. 发表于 2020-3-3 23:20:32

本帖最后由 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:59

这种问题不容易处理

TANK99 发表于 2020-3-21 10:24:04

用强等看门狗复位啊?为啥不用nvic里的复位?这样就算APP里没用到看门狗也不用特地开了。

Edesigner. 发表于 2020-3-21 10:26:12

TANK99 发表于 2020-3-21 10:24
用强等看门狗复位啊?为啥不用nvic里的复位?这样就算APP里没用到看门狗也不用特地开了。 ...

如何操作?

lj0755 发表于 2020-3-21 18:59:37

我是路过的

TANK99 发表于 2020-3-23 13:43:27

Edesigner. 发表于 2020-3-21 10:26
如何操作?

NVIC_SystemReset( );        // 复位
这个在Cortex-m0/m3/m4 CMSIS中都有的。

Edesigner. 发表于 2020-3-23 13:52:31

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

这个能重新初始化寄存器吗?

TANK99 发表于 2020-3-23 14:24:34

Edesigner. 发表于 2020-3-23 13:52
这个能重新初始化寄存器吗?

会的,全部初始化一遍的。
页: [1]
查看完整版本: help,lpc17xx在IAP时机率性出现看门狗复位的情况,帮忙分析