找回密码
 立即注册
查看: 1214|回复: 5

请教RTC中断能否唤醒主时钟停振/省电模式?【已解决】

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-02 09:05:39

45

主题

176

回帖

1735

积分

金牌会员

积分
1735
发表于 2024-1-25 16:30:06 | 显示全部楼层 |阅读模式
本帖最后由 乐此不疲 于 2024-1-25 21:10 编辑

如题!数据手册中掉电唤醒方式中并没有录入RTC中断唤醒方式,我在使用时也就没有考虑这个方案,今天翻看帖子看到有说RTC中断可以唤醒,详见:RTC中断可以唤醒[主时钟停振/省电模式]https://www.stcaimcu.com/forum.php?mod=viewthread&tid=3759(出处: 国芯论坛-STC全球32位8051爱好者互助交流社区))
于是我就用开天斧实验板试了一下,测试代码如下(3.3V供电、RTC使用外部晶振):
  1. //----------------------------------------------------------------
  2. void RTC_config(void)
  3. {
  4.     X32KCR = 0xc0; //启动外部 32K 晶振
  5.     while (!(X32KCR & 0x01)); //等待时钟稳定
  6.     RTCCFG &= ~0x02; //选择外部 32K 作为 RTC 时钟源
  7.     INIYEAR = 21; //Y:2023
  8.     INIMONTH = 12; //M:11
  9.     INIDAY = 31; //D:16
  10.     INIHOUR = 23; //H:8
  11.     INIMIN = 59; //M:15
  12.     INISEC = 50; //S:50
  13.     INISSEC = 0; //S/128:0
  14.     RTCCFG |= 0x01; //触发 RTC 寄存器初始化
  15.     RTCIF = 0; //清中断标志
  16.         RTCIEN =0x10;        //使能 RTC 分中断
  17.     //RTCIEN = 0x10;        //使能 RTC 秒中断
  18.     RTCCR = 0x01; // RTC 使能
  19. }
  20. //----全部I/O准双向工作模式-----------------------
  21. void set_IO()
  22. {
  23.     P1M0 = 0x00;
  24.     P1M1 = 0x00;
  25.     P2M0 = 0x00;
  26.     P2M1 = 0x00;
  27.     P3M0 = 0x00;
  28.     P3M1 = 0x00;
  29.     P4M0 = 0x00;
  30.     P4M1 = 0x00;
  31.     P5M0 = 0x00;
  32.     P5M1 = 0x00;
  33.     P6M0 = 0x00;
  34.     P6M1 = 0x00;
  35.     P7M0 = 0x00;
  36.     P7M1 = 0x00;
  37. }
  38. //----I/O数字输入通道开/管控制---------------------
  39. void Digital_input_SW(u8 n)
  40. {
  41.     if(n == 1) //全部关闭
  42.     {
  43.         P1IE = 0x00;
  44.         P2IE = 0x00;
  45.         P3IE = 0x00;
  46.         P4IE = 0x00;
  47.         P5IE = 0x00;
  48.         P6IE = 0x00;
  49.         P7IE = 0x00;
  50.     }
  51.     if(n == 2) //开启
  52.     {
  53.         P3IE = 0xef; //P34开启数字输入(BUSY)
  54.     }
  55. }
  56. //----------------------------------------------
  57. void main(void)
  58. {
  59.     P_SW2 |= 0x80; //使能 XFR 访问
  60.     set_IO();
  61.     RTC_config();
  62.     UartInit();
  63.     IT0 = 1;//使能INT0下降沿中断
  64.     EX0 = 1;//使能INT0中断
  65.     EA = 1;
  66.     Digital_input_SW(1);//关闭所有I/O的数字输入
  67.     led = 1;
  68. //printf("RTC Test Programme!\r\n"); //UART 发送一个字符串
  69.     while (1)
  70.     {
  71.         PCON = 0x02;//MCU 进入掉电模式
  72.         NOP15();
  73. //掉电唤醒后串口发送数据
  74.         if(B1S_Flag)
  75.         {
  76.             B1S_Flag = 0;
  77.             printf("Year=20%bd ", YEAR);
  78.             printf("Month=%bd ", MONTH);
  79.             printf("Day=%bd ", DAY);
  80.             printf("Hour=%bd ", HOUR);
  81.             printf("Minute=%bd ", MIN);
  82.             printf("Second=%bd ", SEC);
  83.             printf("\r\n");
  84.         }
  85.     }
  86. }
  87. //----------------------------------------------------------------
  88. void RTC_Isr() interrupt 36
  89. {
  90.     if(RTCIF & 0x10) //判断是否秒中断
  91.     {
  92.         RTCIF &= ~0x10; //清中断标志0x08
  93.         B1S_Flag = 1;
  94.         led = ~led;
  95.     }
  96. }
复制代码

我的测试方法是,在程序正常运行的情况下RTC每分钟中断控制P25端的led闪烁,同时串口发送时间到串口助手窗口,测试结果完全正常。
但如果加入启动休眠的控制PCON = 0x02;这行代码后,无论是下载完成或者重新上电后程序都不能运行,不亮灯、不发送数据。

接下来我加入了P32引脚的外部中断程序,此后,在休眠状态下如果首先按下P32的按键触发一次掉电唤醒则接下来程序就会自主运行起来了,灯可以闪烁、可见到串口发送的数据了,此后如果保持供电就会维持RTC中断的唤醒模式不再需要P32的参与了。

综上,貌似这个RTC中断唤醒模式需要外部中断来启动一下才能进入状态,这似乎不太靠谱,我不知道是我的测试方法有毛病还我的测试代码有问题,请各位指点一下。

我是想做一个真正省电的日历牌,MCU每天24小时只在凌晨启动工作一次,运行一分钟刷新EPD显示器,一直在摸索实现方法但总是没能实现真正的低功耗稳定运行。诚心请梁工或其他工程师能点拨一下,,先谢了!

本帖被以下淘专辑推荐:

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2024-1-25 18:16:12 | 显示全部楼层
RTC中断能否唤醒主时钟停振/省电模式
==可以,见 STC8H实验箱程序

截图202401251815561514.jpg
深圳国芯人工智能有限公司-实验箱 (stcai.com)

点评

借楼淘理由:帖中楼主遇到了RTC功能不正常的情况,原因是代码中没有等待RTC模块初始化完成.具体在5#中有描述  发表于 2024-1-26 00:23
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2024-1-25 18:18:18 | 显示全部楼层

第51个演示程序
截图202401251817572552.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-02 09:05:39

45

主题

176

回帖

1735

积分

金牌会员

积分
1735
发表于 2024-1-25 21:16:37 | 显示全部楼层

多谢,已经可以实现掉电唤醒了,我原本就是以你指出的这个程序为蓝本去除了低电压判断部分代码后进行测试的,惭愧的是作业没有抄全,RTC初始化代码的最后一行的等待这句没抄上,就出现了上述的奇怪现象,测试的问题找到了,目标功能的实现也指日可待了,快乐中
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-05-02 09:05:39

45

主题

176

回帖

1735

积分

金牌会员

积分
1735
发表于 2024-1-25 21:22:03 | 显示全部楼层
本帖最后由 乐此不疲 于 2024-1-25 21:23 编辑

问题解决了,是测试的例程代码没抄全,少了最后一句的等待初始化完成语句,导致RTC初始化不完全,加上这句就一切正常了,也请用到这些的新手注重这个问题!


    X32KCR = 0x80 + 0x40;   //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
    while (!(X32KCR & 1));  //等待时钟稳定
    RTCCFG = 0x01;    //选择外部32K时钟源,触发RTC寄存器初始化


    RTCIF = 0x00;     //清中断标志
    RTCIEN = 0x08;    //中断使能, 0x80:闹钟中断, 0x40:日中断, 0x20:小时中断, 0x10:分钟中断, 0x08:秒中断, 0x04:1/2秒中断, 0x02:1/8秒中断, 0x01:1/32秒中断
    RTCCR = 0x01;     //RTC使能


   while(RTCCFG & 0x01);        //等待初始化完成,需要在 "RTC使能" 之后判断.

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:55 , Processed in 0.143199 second(s), 73 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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