找回密码
 立即注册
查看: 2404|回复: 16

掉电唤醒定时器请教

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

积分
243
发表于 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



回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

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


1.png


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

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

7.29 KB, 下载次数: 121

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

积分
243
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:287
  • 最近打卡:2025-03-27 14:28:57

24

主题

79

回帖

243

积分

中级会员

积分
243
发表于 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
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 2023-5-12 13:09:37 | 显示全部楼层
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, 2025-5-2 06:29 , Processed in 0.142375 second(s), 113 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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