打印

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

[复制链接]
1092|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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的程序下一条语句;请问有这样的方法吗?
或是这里有什么问题
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等;
以帮助我解决这个问题;
谢谢!




沙发
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

粉丝