STC_STC 发表于 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



STC_STC 发表于 2023-5-12 07:59:09

下图中,黄色低电平表示进入掉电模式,为高表示唤醒。
蓝色表示INT1脚的电平。
当定时唤醒后,再进入掉电模式,第一次的INT1脚上升沿可以触发,退出唤醒模式,再次进入掉电模式后,后面2次不能唤醒。
等第2次的定时唤醒后,再进入掉电模式,第一次的INT1脚上升沿可以触发。

不明白为什么会这样。

STC_STC 发表于 2023-5-12 08:00:45

如果取消掉电唤醒定时器,那INT1每次都可以唤醒。

乘风飞扬 发表于 2023-5-12 10:23:43

我刚在STC8H芯片上测了一下是正常的。
示波器黄线连接MCU状态指示脚,MCU工作时低电平,休眠时高电平;
示波器蓝线连接INT1脚,按一次INT1按键拉低一次电平。





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

STC_STC 发表于 2023-5-12 11:02:11

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

非常感谢,等下回去后看看哪里不同,谢谢。{:4_196:}

梁工 发表于 2023-5-12 11:09:51

能贴完整的程序吗?
睡眠唤醒都简单,每个唤醒源都是独立的,互不相干。

STC_STC 发表于 2023-5-12 11:47:04

参考了乘风飞扬的程序,现在可以了。如果 掉电唤醒定时 只在初始化时设置一次,功能正常。

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

STC_STC 发表于 2023-5-12 11:48:46

梁工 发表于 2023-5-12 11:09
能贴完整的程序吗?
睡眠唤醒都简单,每个唤醒源都是独立的,互不相干。 ...

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

STC_STC 发表于 2023-5-12 11:50:10

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

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

梁工 发表于 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;
}


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

页: [1] 2
查看完整版本: 掉电唤醒定时器请教