找回密码
 立即注册
查看: 248|回复: 6

睡眠模式下在多种唤醒方式,怎么样区分

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-02-07 14:22:26
已绑定手机

4

主题

4

回帖

26

积分

新手上路

积分
26
发表于 2026-1-28 00:13:59 | 显示全部楼层 |阅读模式
如果需要延时开机这种类型,但是中途使用了其他方式唤醒需要及时回复然后继续睡。我应该怎么样区分是哪种唤醒呢
例如我延时开机的单位是分钟,我设置了5分钟,我掉电唤醒定时器每次定10s的周期,每6次为一分钟,串口中断我只把收到数据写入buf,然后在主函数解析并回复,然后继续睡眠,那这样子会打乱开机时间,导致不准确。
如果不行的话,那只能使用一个定时器了,有中断标志,好判断。

static void Sys_PowerTask(void)
{
    static uint8_t status = 0;
    static bit Wakeup_Tim_F = 0;
    static uint8_t tick_10s = 0;


    if (g_sys.state == SYS_OFF && status == 0)
    {
        status = 1;
        __disable_isr();
        TR0 = 0;            //关闭定时器0
        /* 清除中间变量 */
        tick.tick_1ms = 0;
        tick.tick_10ms = 0;
        tick.tick_100ms = 0;
        tick.tick_1000ms = 0;
        tick.tick_1min = 0;


        if (g_sys.Delau_OnTime != 0)
        {
            Wakeup_Tim_F = 1;
            //wake up freq set 10s
        }else{
            Wakeup_Tim_F = 0;
        }
        //开启按键外部中断
        
            EX1 = 1;                        //使能INT1中断
        __enable_isr();
    }else if (g_sys.state == SYS_OFF && status == 1)        //如果串口唤醒会影响
    {
        if (Wakeup_Tim_F != 0 && g_sys.Delau_OnTime != 0)
        {
            g_sys.Delau_OnTime--;
            if (g_sys.Delau_OnTime == 0)
            {
                Wakeup_Tim_F = 0;
                g_sys.state = SYS_ON;
            }
        }


        if (fifo_get_occupy_size(&Rx_fifo))
        {
            fifo_read(&BT_Rx_fifo, &Rx_Data, 1);
            BT_DispatchByte(Rx_Data);
        }
        
    }else if (g_sys.state == SYS_ON && status == 1)
    {
        //执行开机流程
    }
}

截图202601280004121968.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:712
  • 最近打卡:2026-07-03 09:07:06
已绑定手机

50

主题

2691

回帖

9338

积分

论坛元老

积分
9338
发表于 2026-1-28 09:03:21 | 显示全部楼层
除了掉电唤醒定时器,其他唤醒都需要通过中断,所以可以在中断里面加标志来判断唤醒源,例如:
  1.                 WakeUpSource = 0;
  2.                 PrintString1("MCU进入休眠状态!\r\n");
  3.                 PD = 1;                //Sleep
  4.                 _nop_();
  5.                 _nop_();
  6.                 _nop_();
  7.                 _nop_();
  8.                 _nop_();
  9.                 _nop_();
  10.                 _nop_();
  11.                 _nop_();
  12.                
  13.                 if(WakeUpSource == 1)        PrintString1("外中断INT0唤醒  ");
  14.                 if(WakeUpSource == 2)        PrintString1("外中断INT1唤醒  ");
  15.                 if(WakeUpSource == 3)        PrintString1("外中断INT2唤醒  ");
  16.                 if(WakeUpSource == 4)        PrintString1("外中断INT3唤醒  ");
  17.                 if(WakeUpSource == 5)        PrintString1("外中断INT4唤醒  ");
复制代码
  1. u8 WakeUpSource;
  2. //========================================================================
  3. // 函数: INT0_ISR_Handler
  4. // 描述: INT0中断函数.
  5. // 参数: none.
  6. // 返回: none.
  7. // 版本: V1.0, 2020-09-23
  8. //========================================================================
  9. void INT0_ISR_Handler (void) interrupt INT0_VECTOR                //进中断时已经清除标志
  10. {
  11.         // TODO: 在此处添加用户代码
  12. //        P00 = ~P00;
  13.         WakeUpSource = 1;
  14. }
  15. //========================================================================
  16. // 函数: INT1_ISR_Handler
  17. // 描述: INT1中断函数.
  18. // 参数: none.
  19. // 返回: none.
  20. // 版本: V1.0, 2020-09-23
  21. //========================================================================
  22. void INT1_ISR_Handler (void) interrupt INT1_VECTOR                //进中断时已经清除标志
  23. {
  24.         // TODO: 在此处添加用户代码
  25. //        P01 = ~P01;
  26.         WakeUpSource = 2;
  27. }
  28. //========================================================================
  29. // 函数: INT2_ISR_Handler
  30. // 描述: INT2中断函数.
  31. // 参数: none.
  32. // 返回: none.
  33. // 版本: V1.0, 2020-09-23
  34. //========================================================================
  35. void INT2_ISR_Handler (void) interrupt INT2_VECTOR                //进中断时已经清除标志
  36. {
  37.         // TODO: 在此处添加用户代码
  38. //        P02 = ~P02;
  39.         WakeUpSource = 3;
  40. }
  41. //========================================================================
  42. // 函数: INT3_ISR_Handler
  43. // 描述: INT3中断函数.
  44. // 参数: none.
  45. // 返回: none.
  46. // 版本: V1.0, 2020-09-23
  47. //========================================================================
  48. void INT3_ISR_Handler (void) interrupt INT3_VECTOR                //进中断时已经清除标志
  49. {
  50.         // TODO: 在此处添加用户代码
  51. //        P03 = ~P03;
  52.         WakeUpSource = 4;
  53. }
  54. //========================================================================
  55. // 函数: INT4_ISR_Handler
  56. // 描述: INT4中断函数.
  57. // 参数: none.
  58. // 返回: none.
  59. // 版本: V1.0, 2020-09-23
  60. //========================================================================
  61. void INT4_ISR_Handler (void) interrupt INT4_VECTOR                //进中断时已经清除标志
  62. {
  63.         // TODO: 在此处添加用户代码
  64. //        P04 = ~P04;
  65.         WakeUpSource = 5;
  66. }
复制代码
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-02-07 14:22:26
已绑定手机

4

主题

4

回帖

26

积分

新手上路

积分
26
发表于 2026-1-28 12:30:15 | 显示全部楼层
乘风*** 发表于 2026-1-28 09:03
除了掉电唤醒定时器,其他唤醒都需要通过中断,所以可以在中断里面加标志来判断唤醒源,例如:

...

感谢推荐的方法,这种方法可以,但是我还有一个问题,睡眠的时候已经设置了唤醒定时器,在掉电专用定时器开始计数,那么我中途使用其他方式唤醒一下在睡眠,那么这个定时器的计数值会置0吧,从最新一次睡眠开始计数
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:697
  • 最近打卡:2026-07-04 21:56:03

33

主题

3007

回帖

6880

积分

论坛元老

积分
6880
发表于 2026-1-28 13:43:47 | 显示全部楼层
fzwd*** 发表于 2026-1-28 12:30
感谢推荐的方法,这种方法可以,但是我还有一个问题,睡眠的时候已经设置了唤醒定时器,在掉电专用定时器 ...

确实如此。

如果再一次掉电唤醒定时器 定时睡眠期间,被其他的中断唤醒。再此进入睡眠时,就会重新开始计数。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:697
  • 最近打卡:2026-07-04 21:56:03

33

主题

3007

回帖

6880

积分

论坛元老

积分
6880
发表于 2026-1-28 13:45:51 | 显示全部楼层
fzwd*** 发表于 2026-1-28 12:30
感谢推荐的方法,这种方法可以,但是我还有一个问题,睡眠的时候已经设置了唤醒定时器,在掉电专用定时器 ...

https://www.stcaimcu.com/forum.p ... =9945&pid=97850

这个是我对掉电唤醒定时器的测试总结。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-02-07 14:22:26
已绑定手机

4

主题

4

回帖

26

积分

新手上路

积分
26
发表于 2026-1-28 20:23:13 | 显示全部楼层
_奶*** 发表于 2026-1-28 13:43
确实如此。

如果再一次掉电唤醒定时器 定时睡眠期间,被其他的中断唤醒。再此进入睡眠时,就会重新开始 ...

好的,感谢提供的思路,学到了,没想到RTC还可以这样子使用
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:697
  • 最近打卡:2026-07-04 21:56:03

33

主题

3007

回帖

6880

积分

论坛元老

积分
6880
发表于 2026-1-29 09:33:32 | 显示全部楼层
fzwd*** 发表于 2026-1-28 20:23
好的,感谢提供的思路,学到了,没想到RTC还可以这样子使用

掉电唤醒定时器不是RTC哦,,用带RTC的单片机就没有这么多的问题了。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-7-5 14:04 , Processed in 0.086662 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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