找回密码
 立即注册
查看: 1300|回复: 15

掉电唤醒定时器请教

[复制链接]
  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
    发表于 2023-5-11 19:09:21 | 显示全部楼层 |阅读模式
    请教下,
    芯片:STC81H1K08 TSSOP20

    应用:
    掉电模式下,1,设置INT1 上升下降沿触发退出唤醒,2,唤醒定时器10多秒退出唤醒。

    现在2个都能正常唤醒。但当INT1唤醒后,再进入掉电模式,必须等唤醒定时器唤醒一次后,才能唤醒。
    如果取消唤醒定时器唤醒,则INT1唤醒正常。

    不明白哪里出错,我尝试过唤醒定时器在唤醒后赋值0X00也不行。附上该部分代码帮忙指点下,谢谢。

    //      P33 (INT1)  DC_IN:Raising edge
            IT1 = 0;                                    //使能INT1上升沿和下降沿中断
            // IT1 = 1;                                    //使能INT1下降沿中断
            EX1 = 1;                                    //使能INT1中断
                                                    
    //      P36(INT2)   Sensor_In
            INTCLKO |= EX2;                              //使能INT2下降沿中断

    //      P37 (INT3)  Signal_In
            INTCLKO |= EX3;                             //使能INT3下降沿中断

            // P30(INT4)
            // INTCLKO |= EX4;                          //使能INT4下降沿中断

            //P30(RXD)

            EA = 1;
            //WakeUp Timer
            // WKTCL = 0xff;                               //设定掉电唤醒时钟约为1秒钟
            // WKTCH = 0x87;
            WKTCL = 0xf0;                                   //设定掉电唤醒时钟约为16秒钟
            WKTCH = 0xff;

            PCON = 0x02;                                //MCU进入掉电模式
            _nop_();                                    //掉电模式被唤醒后,MCU首先会执行此语句
                                                        //然后再进入中断服务程序
            _nop_();
            _nop_();
            _nop_();
            //wakeup
            Pin_Test_o  =   1;
            // WKTCH        =   0x00;                   //disable Wakeup Timer



    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
     楼主| 发表于 2023-5-12 07:59:09 | 显示全部楼层
    下图中,黄色低电平表示进入掉电模式,为高表示唤醒。
    蓝色表示INT1脚的电平。
    当定时唤醒后,再进入掉电模式,第一次的INT1脚上升沿可以触发,退出唤醒模式,再次进入掉电模式后,后面2次不能唤醒。
    等第2次的定时唤醒后,再进入掉电模式,第一次的INT1脚上升沿可以触发。

    不明白为什么会这样。
    微信图片_20230512075516.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
     楼主| 发表于 2023-5-12 08:00:45 | 显示全部楼层
    如果取消掉电唤醒定时器,那INT1每次都可以唤醒。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    8 小时前
  • 签到天数: 142 天

    [LV.7]常住居民III

    27

    主题

    1338

    回帖

    4173

    积分

    论坛元老

    积分
    4173
    发表于 2023-5-12 10:23:43 | 显示全部楼层
    我刚在STC8H芯片上测了一下是正常的。
    示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
    示波器蓝线连接INT1脚,按一次INT1按键拉低一次电平。


    1.png


    通过示波器观察,MCU进休眠后每次按下INT1按键都能唤醒MCU。
    附件是测试例程,请参考。

    睡眠-唤醒定时器-外部中断唤醒.zip

    7.29 KB, 下载次数: 33

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
     楼主| 发表于 2023-5-12 11:02:11 | 显示全部楼层
    乘风飞扬 发表于 2023-5-12 10:23
    我刚在STC8H芯片上测了一下是正常的。
    示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
    示 ...

    非常感谢,等下回去后看看哪里不同,谢谢。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3022

    回帖

    6813

    积分

    超级版主

    积分
    6813
    发表于 2023-5-12 11:09:51 | 显示全部楼层
    能贴完整的程序吗?
    睡眠唤醒都简单,每个唤醒源都是独立的,互不相干。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
     楼主| 发表于 2023-5-12 11:47:04 | 显示全部楼层
    参考了乘风飞扬的程序,现在可以了。如果 掉电唤醒定时 只在初始化时设置一次,功能正常。

    而我之前的程序,在每次进入掉电模式之前都有设置一次,导致不正常。

    点评

    请问怎么解决的,能帮忙看下我的帖子吗?https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3921&page=1&extra=#pid25980  发表于 2023-8-22 11:09
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
     楼主| 发表于 2023-5-12 11:48:46 | 显示全部楼层
    梁工 发表于 2023-5-12 11:09
    能贴完整的程序吗?
    睡眠唤醒都简单,每个唤醒源都是独立的,互不相干。 ...

    现在可以了,但这里奇怪的是,我每次进掉电模式会重新设置掉电定时唤醒,这样就会导致问题。如果只在上电时初始化一次,则正常。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 149 天

    [LV.7]常住居民III

    17

    主题

    62

    回帖

    383

    积分

    中级会员

    积分
    383
     楼主| 发表于 2023-5-12 11:50:10 | 显示全部楼层
    乘风飞扬 发表于 2023-5-12 10:23
    我刚在STC8H芯片上测了一下是正常的。
    示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
    示 ...

    现在可以了,问题在于我每次进掉电模式都设置了掉电唤醒定时器一次,可以看我帖子里程序截图。
    你可以试试象我那样,每次进入掉电模式时设置掉电唤醒定时器一次,看看是不是同我测试一样。谢谢。

    点评

    我都是每次进掉电模式前都设置掉电唤醒定时器,没有问题。 #define MAIN_Fosc 11059200L //定义主时钟 #include "..\..\STC8Hxxx.h" /************* 本地函数声明 **************/ void delay_ms(u8 ms); void  详情 回复 发表于 2023-5-12 13:09
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3022

    回帖

    6813

    积分

    超级版主

    积分
    6813
    发表于 2023-5-12 13:09:37 | 显示全部楼层
    STC_STC 发表于 2023-5-12 11:50
    现在可以了,问题在于我每次进掉电模式都设置了掉电唤醒定时器一次,可以看我帖子里程序截图。
    你可以试 ...

    我都是每次进掉电模式前都设置掉电唤醒定时器,没有问题。

    #define MAIN_Fosc                11059200L        //定义主时钟

    #include        "..\..\STC8Hxxx.h"

    /*************        本地函数声明        **************/
    void          delay_ms(u8 ms);
    void        SetWakeUpTime(u16 SetTime);

    //========================================================================
    // 函数: void main(void)
    // 描述: 主函数.
    // 参数: none.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-25
    // 备注:
    //========================================================================
    void main(void)
    {
            //IO口设置, 用户可根据自己具体情况设置
            P0M1 = 0x00;        P0M0 = 0x00;        //P0设置为准双向口
            P1M1 = 0x00;        P1M0 = 0x00;        //P1设置为准双向口
            P2M1 = 0x00;        P2M0 = 0x00;        //P2设置为准双向口
            P3M1 = 0x00;        P3M0 = 0x00;        //P3设置为准双向口
            P4M1 = 0x00;        P4M0 = 0x00;        //P4设置为准双向口
            P5M1 = 0x00;        P5M0 = 0x00;        //P5设置为准双向口
            P6M1 = 0x00;        P6M0 = 0x00;        //P6设置为准双向口
            P7M1 = 0x00;        P7M0 = 0x00;        //P7设置为准双向口
           
            while(1)
            {

                    SetWakeUpTime((3000 * 2048L) / 1000);        //定时值 n = T * (Fwkt/16) / 1000, T单位为ms, 最大值16000.
                   
                    PCON |= 0x02;        //Sleep
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                   
                    P32 = 0;        //点亮一个LED指示醒来
                    delay_ms(10);        //delay 10 ms
                    P32 = 1;        //灭LED
            }

    }

    //========================================================================
    // 函数: void        SetWakeUpTime(u16 SetTime)
    // 描述: 唤醒定时器设置时间值函数。
    // 参数: SetTime: 要设置的时间值(睡眠的时间), 单位为ms.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-25
    // 备注:
    //========================================================================
    void        SetWakeUpTime(u16 SetTime)
    {
            if(SetTime > 0)        SetTime--;
            WKTCL = (u8)SetTime;
            WKTCH = (u8)(SetTime >> 8) | 0x80;
    }


    //========================================================================
    // 函数: void  delay_ms(u8 ms)
    // 描述: 延时函数。
    // 参数: ms,要延时的ms数.
    // 返回: none.
    // 版本: VER1.0
    // 日期: 2018-4-25
    // 备注:
    //========================================================================
    void  delay_ms(u8 ms)
    {
            u16 i;
            do
            {
                    i = MAIN_Fosc / 10000L;
                    while(--i)        ;
            }while(--ms);
    }

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-16 18:13 , Processed in 0.072788 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表