本帖最后由 viphotman 于 2017-3-10 17:17 编辑
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等;
以帮助我解决这个问题;
谢谢!
此帖出自
小平头技术问答
但是看门狗估计无法实现你要的功能,看门狗复位后,会直接跑到复位中断向量处。几乎所有的MCU都是这么玩的。
谢谢回答
1 我有在文档里看到过,说是可以实现的; 在分讲看门狗定时器那章节 第9章,microchip 网址
http://www.microchip.com.cn/community/Uploads/Download/Library/60001114h_cn.pdf
1 __asm__ __volatile__ ("eret"); 这个代码确实无效,包含plib.h后,只在main里测试WDT
EnableWDT();
ClearWDT();
PowerSaveSleep();
LED_Test();
发现WDT每次唤醒后从LED_Test(); 开始执行;
2 第二点,看门狗不正常的问题,应该是在系统函数
VOID TIME_Delay1ms ( UINT16 delay )
{
delay += time1ms + 1;
while ( delay - time1ms < 0x8000u )
{
// SYSTEM_Idle ();
}
}
这SYSTEM_Idle (); 有对wait();的调用;以至于程序不对;
一周热门 更多>