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

[复制链接]
 楼主| viphotman 发表于 2017-3-14 12:13 | 显示全部楼层 |阅读模式
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.    
  30. #if 1   
  31.     // T1
  32.     TMR1 = 0;
  33.     T1CON = 0;
  34.     PR1 = SysGetPeripheralClock ( ) / 1000;
  35.     T1CONbits.TON = 1;

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

  40. }

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




 楼主| viphotman 发表于 2017-3-16 17:43 | 显示全部楼层
本帖最后由 viphotman 于 2017-3-16 17:45 编辑

自己回复下,结了
bbs.
eeworld.
com.
cn/
thread-522938-1-1.
html
同一个问题
(发不了链接)
chengfgc 发表于 2022-3-2 17:15 | 显示全部楼层
我也是这款单片机,遇到能写进程序,但是不能跑起来,用的内部时钟FRCPLL,不知道怎么解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

35

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部