你好。
我修改了TI的原先使用看门狗进行中断的程序,原先通过WDCR寄存器设置定时时间,等到计数溢出进入中断使得WakeCount自加1,。
现在我修改了它的代码如下所示,使其计数溢出后进入复位代码,即产生WRST信号复位程序,理论上我的LoopCount会不断自加,当没有喂狗(程序中未设置喂狗),就会复位程序,LoopCount就会清零,
但是运行下面代码后LoopCount只变化一次就就固定在一个数值不在变化。我在程序的I函数nitPieVectTable();处打断点,程序点击运行第一次跳到此处,但是理论看门狗复位后应该再次跳到断点处,可是点击后没有反应,运行三角按钮依旧是灰色状态。请教一下这是哪里出了问题?
感谢!
#include "DSP2833x_Device.h" // Headerfile Include File
#include "DSP2833x_Examples.h" // Examples Include File
#include "leds.h"
// Global variables for this example
Uint32 WakeCount;
Uint32 LoopCount;
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
void main(void)
{
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
InitSysCtrl();
// Step 2. Initalize GPIO:
// This example function is found in the DSP2833x_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 DSP2833x_PieCtrl.c file.
InitPieCtrl();
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
// 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 DSP2833x_DefaultIsr.c.
// This function is found in DSP2833x_PieVect.c.
InitPieVectTable();
// Step 4. Initialize all the Device Peripherals:
// This function is found in DSP2833x_InitPeripherals.c
// InitPeripherals(); // Not required for this example
LED_Init();
// 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 = BIT1;
// EDIS;
// Reset the watchdog counter
// ServiceDog();
// Enable the watchdog
EALLOW;
SysCtrlRegs.WDCR = 0x0028;
SysCtrlRegs.SCSR = 0;
EDIS;
//复位程序配置
// ServiceDog();
// MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
// InitFlash();
// 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();
// 检验复位程序;
// if(LoopCount>2000)
// {
// GpioDataRegs.GPACLEAR.bit.GPIO0=1;
// DSP28x_usDelay(100);
// EALLOW;
// SysCtrlRegs.WDCR = 0x0000;
// EDIS;
// }
}
}


