Hi,
目前一个案子现在用PIC32MX250128D,器件ID版本 = A1
在使用WDT 时遇到了一些问题;
产品要做低功耗处理,每4S左右,通过WDT超时唤醒MCU,用来闪烁LED,之后继续sleep;
当有按键按下,通过电平变化唤醒MCU,或是有UART数据时,也唤醒MCU;这里要运行一会儿,有LED灯指示,
一段时间没有任何操作,进入sleep;
在没有加入WDT功能前,电平唤醒,和UART唤醒,都正常; (开机的LED,运行时的LED,进入休眠的LED,唤醒的LED)
加入WDT后,问题来了;
WDT 是超时复位而唤醒MCU,但我们想MCU再次初始化,所以加了个判断;
1 参看文件,用下的方法,但不能让WDT复位返回到上次sleep的程序下一条语句;请问有这样的方法吗?
或是这里有什么问题
if( (RCON & 0X18) ==0X18 ) // WDT wake up from sleep mode
{
__asm__ __volatile__ ("eret");
// RCON = RCON&(~0x18);
app.wdt_flag |= 0x01 ;
}
2 上面方法不行,我就自己判断RCON来确定要不要开机初始化,但是,看门狗还是不正常;
所以,我初始化了MCU部分设置;但是,还是存在问题,问题是时有过一次看门狗超时唤醒后,
之后用电平或UART唤醒MCU,LED指示不正常了(只有唤醒的LED,没有运行时的LED),
并且,之后,看门狗复位也没有了;LED一直关;
if(app.wdt_flag == 0)
{
MAIN_Initialize ( ); // initialize
MAIN_DeviceInterfaceDetect();
#ifdef SYS_DEBUG_TEST //定义的
LED_InitTest();// LED FLASH
UART1DebugPut(0xe0,RCON);// printf RCON
RCON = 0;
#endif
}
else
{
if(app.wdt_flag&0x18 == 0x18)
{
MAIN_Initialize2();
app.wdt_flag = 0;
RCON = 0;//RCON = RCON&(~0x18);
LED_WDT_Wakeup();
}
}
下面是看门狗复位时的初始化
VOID SYSTEM_Init ( VOID )
{
#if 1
TRISCbits.TRISC9 = 0; // LED
TRISAbits.TRISA0 = 0;
TRISAbits.TRISA1 = 0;
TRISCbits.TRISC3 = 1; // BUTTON
TRISCbits.TRISC2 = 1; // USB DET ADC
#else
#endif
ANSELA = 0b0000000000000000;
ANSELB = 0b0000000000000000; //PORTB
#ifdef EN_ADC_LOW_POWER_MODE //没定义的
//ANSELC = 0b0000000000001101; // button ADC RC0 RC2 RC3
#else
ANSELC = 0b0000000000000000;
#endif
SYSTEMConfigWaitStatesAndPB ( SysGetClock ( ) );
SYSTEMConfigPerformance ( SysGetClock ( ) );
CheKseg0CacheOn ( );
INTEnableSystemMultiVectoredInt ( );
while ( ! OSCCONbits.SLOCK )
SYSTEM_SetLedOn ( SYSTEM_LED_ALL );
SYSTEM_SetLedOff ( SYSTEM_LED_ALL );
#if 1
// T1
TMR1 = 0;
T1CON = 0;
PR1 = SysGetPeripheralClock ( ) / 1000;
T1CONbits.TON = 1;
INTSetVectorPriority ( INT_TIMER_1_VECTOR, 2 );
INTSetVectorSubPriority ( INT_TIMER_1_VECTOR, 0 );
INTEnable ( INT_T1, INT_ENABLED );
#endif
}
请各位网友,提提建议,调试方法;或是有使用过PIC32MX WDT的code等;
以帮助我解决这个问题;
谢谢!
|