This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

watchdog not reset in f28027,help

when i use f28027, watchdog not reset . the code in follow:

...

 EALLOW;
 //WDENINT = 1 -> The WDRST output signal is disabled and the WDINT is enabled.
// SysCtrlRegs.SCSR = BIT1; 
 SysCtrlRegs.SCSR = BIT2; //wdrst 
 EDIS;

 // Reset the watchdog counter
 ServiceDog(); 

 EALLOW;
 SysCtrlRegs.WDCR = 0x0028; //WDFLAG.7 WDDIS.7 WDCHK.5-3 WDPS.2-0
 EDIS;
...

while(1){}

this code from example,when runing in wakeup interrupt mode(SysCtrlRegs.SCSR = BIT1), it is normal. but when SysCtrlRegs.SCSR = BIT2, reset at 0x3ff7e7, not right.

  • Hi zhixu,

    It is hust a wild guess.... You enable the watchdog to run in interrupt mode, but did you assign an interrupt method to the wakeint? something like


    EALLOW;
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    PieVectTable.WAKEINT = &WAKEINT_ISR;
    PieCtrlRegs.PIEIER1.bit.INTx8 = 1;
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
    IER |= M_INT1;
    EINT;
    EDIS;

    No guarantee that this code is complete, but I think this is missing.

    BR Andreas

  • I know, this issue happen in debug. when I remove the JTAP plug, and power up, it run in normal.

  • I know, this issue happen in debug. when I remove the JTAG plug, and power up, it run in normal.

  • Hi,

    I am afraid, but I think I (and others of the forum) don't exactly understand where your problem is. Please give us a bit more details...

    BR Andreas

  • hi,

    I test watchdog reset occurs, so i use examples,'Example_2802xWatchdog'. please see:

    #include "DSP28x_Project.h"     // Device Headerfile and Examples Include File

    // Prototype statements for functions found within this file.
    interrupt void wakeint_isr(void);

    // Global variables for this example
    Uint32 WakeCount;
    Uint32 LoopCount;

    void main(void)
    {

    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the DSP2802x_SysCtrl.c file.
       InitSysCtrl();

    // Step 2. Initalize GPIO:
    // This example function is found in the DSP2802x_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    // InitGpio();  // Skipped for this example

    // Step 3. Clear all interrupts and initialize PIE vector table:
    // Disable CPU interrupts
       DINT;

    // Initialize PIE control registers to their default state.
    // The default state is all PIE interrupts disabled and flags
    // are cleared.
    // This function is found in the DSP2802x_PieCtrl.c file.
       InitPieCtrl();

    // Disable CPU interrupts and clear all CPU interrupt flags:
       IER = 0x0000;
       IFR = 0x0000;

    // Initialize the PIE vector table with pointers to the shell Interrupt
    // Service Routines (ISR).
    // This will populate the entire table, even if the interrupt
    // is not used in this example.  This is useful for debug purposes.
    // The shell ISR routines are found in DSP2802x_DefaultIsr.c.
    // This function is found in DSP2802x_PieVect.c.
       InitPieVectTable();

    // Interrupts that are used in this example are re-mapped to
    // ISR functions found within this file.
       EALLOW; // This is needed to write to EALLOW protected registers
       PieVectTable.WAKEINT = &wakeint_isr;
       EDIS;   // This is needed to disable write to EALLOW protected registers

    // Step 4. Initialize all the Device Peripherals:
    // This function is found in DSP2802x_InitPeripherals.c
    // InitPeripherals(); // Not required for this example

    // Step 5. User specific code, enable interrupts:

    // Clear the counters
       WakeCount = 0; // Count interrupts
       LoopCount = 0; // Count times through idle loop

    // Connect the watchdog to the WAKEINT interrupt of the PIE
    // Write to the whole SCSR register to avoid clearing WDOVERRIDE bit
       EALLOW;
       SysCtrlRegs.SCSR = BIT2;  //change by zhixu = BIT1;
       EDIS;

    // Enable WAKEINT in the PIE: Group 1 interrupt 8
    // Enable INT1 which is connected to WAKEINT:
       PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
       PieCtrlRegs.PIEIER1.bit.INTx8 = 1;   // Enable PIE Gropu 1 INT8
       IER |= M_INT1;                       // Enable CPU INT1
       EINT;                                // Enable Global Interrupts

    // Reset the watchdog counter
       ServiceDog();

    // Enable the watchdog
       EALLOW;
       SysCtrlRegs.WDCR = 0x0028;
       EDIS;

    // Step 6. IDLE loop. Just sit and loop forever (optional):
       for(;;)
       {
          LoopCount++;

          // Uncomment ServiceDog to just loop here
          // Comment ServiceDog to take the WAKEINT instead
          // ServiceDog();
       }


    }

    // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
    // If local ISRs are used, reassign vector addresses in vector table as
    // shown in Step 5

    interrupt void wakeint_isr(void)
    {
     WakeCount++;

     // Acknowledge this interrupt to get more from group 1
     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
    }

    When I load the code, and run in debug.  reset at 0x3ff7e7, it is incorrect.

    but when i remove JTAG plug, and power up, run in normal. this I use my code to test.

    so, the result is simulate issue.

     

  • Hi,

    I believe that the adress where it stops in debug mode is part of the boot rom. So the question would be why you reset.

    • Does the device reset immediately after you start the code?
    • Is it really the watchdog that issues the reset? (you could test it by defining a "long" watchdog interval)
    • Does the code reset even when you uncomment the servicedog routine in main?

    Furthermore I think that your debug boot options are wrong, so if a reset occurs the device is not able to boot again.

    BR Andreas

  • Yes,

    We focus on the debug boot options. I think so.

    But I don't know how to set debug boot options, I load code to flash to debug it with CCS3.3. I hope that WDG reset at right address. not at 0x3ff7e7

  • Hi,

    This wiki site is a good resource for information about boot modes.

    Best regards

    Andreas

  • OK,

    I modify the code,

    .....

    OnReset(int nErrorCode)
    {

    /* liu 20110124
        C28x_Mode();
        Unlock_CSM();
        Device_Cal();
    */
     C28x_Mode();
        Unlock_CSM();
        Device_Cal();
    //    CLA_Clock_Enable();             /* Enable CLA clock - allows to debugger to set CLA breakpoints after reset */

    //    EMU_BOOT_SARAM();               /* Set EMU Boot Variables - Boot to SARAM */
     EMU_BOOT_FLASH();               /* Set EMU Boot Variables - Boot to flash */
    }

    ...

    The WDG reset at right position.

    Best regards

    ZhiXu