Yahoo Groups archive

Lpc2000

Index last updated: 2026-04-28 23:31 UTC

Message

Re: Problem with watchdog

2005-12-09 by Ken Wada

Basically, your method works fine...
UNTIL: you start adding interrupt service routines!

This is why:
void WDOG_pet()
{
WDFEED = 0xAA;
/*             Interrupt occurs here...> dog will NOT pet properly!!! 
***/
WDFEED = 0x55;
}

/**** example uses Keil compiler directives ***/
/********** The following is what I wound up doing, (gotta avoid that 
spurious interrupt issue with the ARM also!!! ***/

/**** The actual interface that everybody uses ***/
void WDOG_pet (void)
{
    SYSSWI_service (12,0,0,0);
}

/***** How the SYSSWI_service works, (based on SWI) ***/
unsigned SYSSWI_service (SYSSWI opcode, int id, void *pObj, unsigned 
_user1) __swi(12)
{
    switch (opcode)
    {
      case SYSSWI_WDOGPET:
        SYSSWI_watchDogPet ();
        break;
      ...
    }
    return (0);
}

/***** How the SYSSWI_watchDogPet () works ***/
static void SYSSWI_watchDogPet (void)
{
    ARM_disableFIQ ();                /* make sure FIQ is disabled     
     */
    WDFEED  = 0xAA;
    WDFEED  = 0x55;
    ARM_enableFIQ ();                 /* re-enable the FIQ             
     */
}

/***** The IRQ is automatically disabled by vectoring to the SWI...
however, you need to make the operation atomic with respect to FIQ, 
which is NOT disabled ***/

PUBLIC  ARM_disableFIQ?A ; interface is ARM mode

ARM_disableFIQ?A  PROC  CODE32
      MRS   R0,CPSR
      ORR   R0,R0,#0x0040                   ; Mask just the FIQ
      MSR   CPSR_c,R0
      BX    R14

      ENDP

PUBLIC  ARM_enableFIQ?A ; interface is ARM mode

ARM_enableFIQ?A  PROC  CODE32
      MRS   R0,CPSR
      BIC   R0,R0,#0x0040                   ; Enable just the FIQ
      MSR   CPSR_c,R0
      BX    R14

      ENDP
END


--- In lpc2000@yahoogroups.com, "Ake Hedman, eurosource" <akhe@b...> 
wrote:
>
> Hi all.
> 
> I am trying to enable the watchdog but the result is a total hang of 
the 
> board. Not even the bootloader is possible to reach after the crash 
and 
> I have to reapply power with P0.14 low to get access to the 
botloader 
> again. Reset is not enough.
> 
> The code to initialize the watchdog is
> 
>     // initialize the watchdog timer
>     WDTC = 0xffffffff; // 15000000;                        // One 
second 
> = 15000000
>     WDMOD = WDEN | WDRESET;                    // Activate watchdog
>     WDFEED = 0xAA; WDFEED = 0x55;
> 
> I must have misunderstood the WD functionality. What am I doing 
wrong? 
> In the above code the watchdog should not trigger until 5 minutes 
> elapsed so even if a vector should be wrong the code that follow 
should 
> run for a while but as soon as I write to the WDMOD register I get a 
hang.
> 
> /Ake
> 
> -- 
>  ---
> Ake Hedman (YAP - Yet Another Programmer)
> eurosource, Brattbergavägen 17, 820 50 LOS, Sweden
> Phone: (46) 657 413430 Cellular: (46) 73 84 84 102
> Company home: http://www.eurosource.se      
> Kryddor/Te/Kaffe: http://www.brattberg.com
> Personal homepage: http://www.eurosource.se/akhe
> Automated home: http://www.vscp.org
>

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.