4083|5

256

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

PIC32MX250128D A1 打开WDT后sleep,唤醒后要再次init [复制链接]

本帖最后由 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等;
以帮助我解决这个问题;
谢谢!

最新回复

我们也用这款单片机做产品的,你这个问题没用过,我现在在调读写flash,有个问题想问你下,擦除flash的物理首地址是1D01F000麽?为什么我有时候对,有时候程序在flash那块老是跑飞。你有这块程序可以参考下麽,我们用的都是汇编  详情 回复 发表于 2017-3-17 20:21
点赞 关注
 

回复
举报

664

帖子

108

TA的资源

纯净的硅(中级)

沙发
 
PIC用的人不多,靠自己摸索吧。
但是看门狗估计无法实现你要的功能,看门狗复位后,会直接跑到复位中断向量处。几乎所有的MCU都是这么玩的。

点评

谢谢回答 1 我有在文档里看到过,说是可以实现的; 在分讲看门狗定时器那章节 第9章,microchip 网址 http://www.microchip.com.cn/community/Uploads/Download/Library/60001114h_cn.pdf [attachimg]288398[/a  详情 回复 发表于 2017-3-13 10:04
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

板凳
 
gs001588 发表于 2017-3-11 21:54
PIC用的人不多,靠自己摸索吧。
但是看门狗估计无法实现你要的功能,看门狗复位后,会直接跑到复位中断向 ...

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

 
 
 

回复

664

帖子

108

TA的资源

纯净的硅(中级)

4
 
学习了,真有这功能的话,那真是方便不少
 
 
 

回复

256

帖子

0

TA的资源

一粒金砂(高级)

5
 
通过这几天的调试与测试;总结下:
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();的调用;以至于程序不对;
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

6
 
我们也用这款单片机做产品的,你这个问题没用过,我现在在调读写flash,有个问题想问你下,擦除flash的物理首地址是1D01F000麽?为什么我有时候对,有时候程序在flash那块老是跑飞。你有这块程序可以参考下麽,我们用的都是汇编
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表