PIC32MX250128D A1 打开WDT后sleep,唤醒后要再次init

2019-03-25 18:53发布

本帖最后由 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的程序下一条语句;请问有这样的方法吗?
或是这里有什么问题
  1. if( (RCON & 0X18) ==0X18 ) // WDT wake up from sleep mode
  2.     {
  3.         __asm__ __volatile__ ("eret");
  4. //        RCON = RCON&(~0x18);
  5.         app.wdt_flag |= 0x01 ;
  6.     }
复制代码
2 上面方法不行,我就自己判断RCON来确定要不要开机初始化,但是,看门狗还是不正常;
  所以,我初始化了MCU部分设置;但是,还是存在问题,问题是时有过一次看门狗超时唤醒后,
  之后用电平或UART唤醒MCU,LED指示不正常了(只有唤醒的LED,没有运行时的LED),
  并且,之后,看门狗复位也没有了;LED一直关;
  1. if(app.wdt_flag == 0)
  2.     {
  3.         MAIN_Initialize ( );    // initialize
  4.         MAIN_DeviceInterfaceDetect();   
  5. #ifdef SYS_DEBUG_TEST  //定义的
  6.         LED_InitTest();// LED FLASH
  7.         UART1DebugPut(0xe0,RCON);// printf RCON
  8.         RCON = 0;
  9. #endif
  10.     }
  11.     else
  12.     {
  13.         if(app.wdt_flag&0x18 == 0x18)
  14.         {
  15.             MAIN_Initialize2();
  16.             app.wdt_flag = 0;
  17.             RCON = 0;//RCON = RCON&(~0x18);
  18.             LED_WDT_Wakeup();
  19.         }
  20.     }
复制代码
  
下面是看门狗复位时的初始化
  1. VOID SYSTEM_Init ( VOID )
  2. {
  3.    
  4. #if 1
  5.     TRISCbits.TRISC9 = 0; // LED
  6.     TRISAbits.TRISA0 = 0;
  7.     TRISAbits.TRISA1 = 0;
  8.    
  9.     TRISCbits.TRISC3 = 1;   // BUTTON
  10.     TRISCbits.TRISC2 = 1;   // USB DET  ADC   
  11. #else
  12. #endif
  13.    
  14.     ANSELA  = 0b0000000000000000;
  15.     ANSELB  = 0b0000000000000000;       //PORTB
  16. #ifdef EN_ADC_LOW_POWER_MODE        //没定义的
  17.     //ANSELC  = 0b0000000000001101;       // button ADC RC0  RC2  RC3
  18. #else
  19.    ANSELC  = 0b0000000000000000;
  20. #endif
  21.     SYSTEMConfigWaitStatesAndPB ( SysGetClock ( ) );
  22.     SYSTEMConfigPerformance ( SysGetClock ( ) );
  23.     CheKseg0CacheOn ( );
  24.     INTEnableSystemMultiVectoredInt ( );

  25.     while ( ! OSCCONbits.SLOCK )
  26.         SYSTEM_SetLedOn ( SYSTEM_LED_ALL );
  27.     SYSTEM_SetLedOff ( SYSTEM_LED_ALL );

  28.    
  29. #if 1   
  30.     // T1
  31.     TMR1 = 0;
  32.     T1CON = 0;
  33.     PR1 = SysGetPeripheralClock ( ) / 1000;
  34.     T1CONbits.TON = 1;

  35.     INTSetVectorPriority ( INT_TIMER_1_VECTOR, 2 );
  36.     INTSetVectorSubPriority ( INT_TIMER_1_VECTOR, 0 );
  37.     INTEnable ( INT_T1, INT_ENABLED );
  38. #endif

  39. }
复制代码

请各位网友,提提建议,调试方法;或是有使用过PIC32MX WDT的code等;
以帮助我解决这个问题;
谢谢!

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
gs001588
1楼-- · 2019-03-26 00:38
PIC用的人不多,靠自己摸索吧。
但是看门狗估计无法实现你要的功能,看门狗复位后,会直接跑到复位中断向量处。几乎所有的MCU都是这么玩的。
viphotman
2楼-- · 2019-03-26 02:09
gs001588 发表于 2017-3-11 21:54
PIC用的人不多,靠自己摸索吧。
但是看门狗估计无法实现你要的功能,看门狗复位后,会直接跑到复位中断向 ...

谢谢回答
1 我有在文档里看到过,说是可以实现的; 在分讲看门狗定时器那章节 第9章,microchip 网址
http://www.microchip.com.cn/community/Uploads/Download/Library/60001114h_cn.pdf

wdt wakeup later to wait.PNG
gs001588
3楼-- · 2019-03-26 03:54
学习了,真有这功能的话,那真是方便不少
viphotman
4楼-- · 2019-03-26 09:40
通过这几天的调试与测试;总结下:
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();的调用;以至于程序不对;
Doctor夫妇
5楼-- · 2019-03-26 12:42
我们也用这款单片机做产品的,你这个问题没用过,我现在在调读写flash,有个问题想问你下,擦除flash的物理首地址是1D01F000麽?为什么我有时候对,有时候程序在flash那块老是跑飞。你有这块程序可以参考下麽,我们用的都是汇编

一周热门 更多>