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.

在进入看门狗中断后,写什么指令可以实现系统复位?



在进入看门狗中断后,写什么指令可以实现系统复位?

  • 为什么不直接配置看门狗产生复位呢?

  • 谢谢你的回答,实际上我是开了看门狗中断的,并没有直接配置成看门狗复位,我希望在进入看门狗中断后,通过写程序来实现系统复位,请问可以这么实现吗?如果可以的话应该如何写呢??

  • 一般建议将系统看门狗打开就行,没必要自己写复位程序

  • 大哥,我接受你的意见,现在出现了新问题,我现在关闭中断,直接配置复位输出,配置了看门狗计数周期,为了观察是否实现系统复位,

    我在程序开始处加一断点,然后运行至一个死循环,让它自由运行,配置使能了看门狗且不喂狗,结果并没有实现复位,PC指针并没有指向断点处。  代码没问题,请问会不会是硬件问题? 我用的是F28377D的开发板

  • 代码如下  

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

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

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

    void main(void)
    {
    asm (" ESTOP0");
    // unsigned long delay;
    // Step 1. Initialize System Control:
    // PLL, WatchDog, enable Peripheral Clocks
    // This example function is found in the F2837xD_SysCtrl.c file.
    InitSysCtrl();
    asm (" ESTOP0");
    // Step 2. Initialize GPIO:
    // This example function is found in the F2837xD_Gpio.c file and
    // illustrates how to set the GPIO to it's default state.
    // InitGpio();

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

    // Initialize the 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 F2837xD_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 F2837xD_DefaultIsr.c.
    // This function is found in F2837xD_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.WAKE_INT = &wakeint_isr; 
    //EDIS; // This is needed to disable write to EALLOW protected registers

    // Step 4. 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;
    WdRegs.SCSR.all = 0x00; 
    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 Group 1 INT8
    //IER |= M_INT1; // Enable CPU INT1
    //EINT; // Enable Global Interrupts

    // Reset the watchdog counter
    ServiceDog();
    //EALLOW;
    // WdRegs.SCSR.all = 0; //使能了看门狗中断输出,禁止了看门狗复位输出
    // EDIS;
    // Enable the watchdog
    EALLOW;
    WdRegs.WDCR.all = 0x0028; //使能看门狗,并且设置看门狗中断周期
    EDIS;

    // Step 6. IDLE loop. Just sit and loop forever (optional):
    for(;;)
    {
    // LoopCount++;
    //DELAY_US(36000); // 设置12毫秒延时,然后喂狗

    //asm (" ESTOP0");
    // LoopCount++;
    //ServiceDog(); //喂狗
    // asm (" ESTOP0");
    // 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++;
    //asm (" ESTOP0");
    // EALLOW;
    // WdRegs.WDCR.all = 0; //使能看门狗,并且设置看门狗中断周期
    // EDIS;
    //EALLOW;
    //WdRegs.SCSR.bit.WDENINT=0;
    //WdRegs.SCSR.bit.WDENINT=1;

    //WdRegs.WDCR.bit.WDCHK=0x000;
    //EDIS;

    //asm (" ESTOP0");


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