找回密码
 立即注册
查看: 118|回复: 10

关于STC8H休眠后,RTC闹钟唤醒因外部中断而失败的问题 | 已解决

[复制链接]
  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    回帖

    54

    积分

    注册会员

    积分
    54
    发表于 2024-4-22 16:09:12 | 显示全部楼层 |阅读模式
      单片机型号: STC8H4K64TL

      固件版本号: 7.4.3U

      硬件电路:触摸按键 + 外部32.768晶振驱动RTC + 低功耗深度休眠  + IO口P51中断;


      休眠进入条件:按键连续30秒空闲;

      休眠唤醒条件:触摸按键唤醒、RTC闹钟唤醒、P51中断唤醒;

      




    休眠前的动作:
    1、设置IO状态使其保持最小电流;
    2、设置闹钟唤醒时间;
    3、检查P51中断标志是否为0;
    4、打开P51中断:P5INTE|=(1<<1);

    5、_nop_();_nop_();_nop_();_nop_();_nop_();PCON=0x02;
    6、退出低功耗;

    奇怪的是在4、5中间,如果PCON=0x02前P51发生了中断,此时RTC的中断唤醒就是失效了,只有P51中断和触摸按键可以唤醒,是配置流程那里不对,还是说芯片本上就是这么设计的?即休眠前发生IO中断和RTC闹钟中断时,RTC唤醒会失效?



    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 87 天

    [LV.6]常住居民II

    13

    主题

    330

    回帖

    758

    积分

    荣誉版主

    热心市民

    积分
    758
    发表于 2024-4-22 16:40:37 | 显示全部楼层
    如果有用到IO中断将单片机从掉电模式唤醒的应用,考虑使用专用的IO中断唤醒使能寄存器P51WKUE。
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    回帖

    54

    积分

    注册会员

    积分
    54
     楼主| 发表于 2024-4-22 17:10:07 | 显示全部楼层
    晓飛飛 发表于 2024-4-22 16:40
    如果有用到IO中断将单片机从掉电模式唤醒的应用,考虑使用专用的IO中断唤醒使能寄存器P51WKUE。 ...

    P5INTE|=(1<<1);
    P5WKUE|=(1<<1);
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    PCON = 0x02;

    把代码修改成上面的内容,预想的流程是:

    1、只要打开了P51WKUE中断唤醒,哪怕是真的休眠前触发了IO中断,

    2、那么也会被立刻唤醒,然后再次进入休眠流程,

    3、而实际是只要休眠前有IO中断那么RTC闹钟唤醒就会失效。

    4、(在P5INT_VECTOR中断函数中添加一个自增变量,进入休眠前清零,退出休眠打印,实测当RTC唤醒失败后变量有增加)

    点评

    如果遇到IO中断没有达成预想的功能,除了检查代码逻辑正确性以外,可以尝试使用INT0~INT4这些专用的外部中断代替普通IO中断。  详情 回复 发表于 2024-4-22 20:06
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 87 天

    [LV.6]常住居民II

    13

    主题

    330

    回帖

    758

    积分

    荣誉版主

    热心市民

    积分
    758
    发表于 2024-4-22 20:06:52 | 显示全部楼层

    如果遇到IO中断没有达成预想的功能,除了检查代码逻辑正确性以外,可以尝试使用INT0~INT4这些专用的外部中断代替普通IO中断。
    睁开眼睛做场梦~~~
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2934

    回帖

    6617

    积分

    超级版主

    积分
    6617
    发表于 2024-4-24 10:37:39 | 显示全部楼层
    各个唤醒源都独立的。睡眠前,要允许闹钟中断。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    回帖

    54

    积分

    注册会员

    积分
    54
     楼主| 发表于 2024-4-24 20:02:28 | 显示全部楼层
    梁工 发表于 2024-4-24 10:37
    各个唤醒源都独立的。睡眠前,要允许闹钟中断。

    梁工,您好,附件中的截图是进入休眠前的闹钟设置情况:

    1、在19:47:08时,设置了闹钟时间为19:48:00;

    2、在进入休眠前,再次打印了RTCIE、ALAHOUR、ALAMIN、ALASEC寄存器,内容分别是
          RTCIE = 0xc0(闹钟中断 + 天中断)
          ALAHOUR = 0x13(19时)
          ALAMIN = 0x30(48分)
          ALASEC = 0x00(00秒)
          (PS:通过打印信息,确认闹钟设置正确)

    3、在19:48:00时,闹钟没有唤醒,持续等待到19:48:50依然没有唤醒;
    bff2937a510d3f8f03229291d265c09.png

    点评

    PCON=0x02; _nop_(); //至少3个NOP _nop_(); _nop_();  详情 回复 发表于 2024-4-24 23:22
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2934

    回帖

    6617

    积分

    超级版主

    积分
    6617
    发表于 2024-4-24 23:22:00 | 显示全部楼层
    miaoyahan 发表于 2024-4-24 20:02
    梁工,您好,附件中的截图是进入休眠前的闹钟设置情况:

    1、在19:47:08时,设置了闹钟时间为19:48:00;

    PCON=0x02;
    _nop_();  //至少3个NOP
    _nop_();
    _nop_();
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    回帖

    54

    积分

    注册会员

    积分
    54
     楼主| 发表于 2024-4-24 23:55:02 | 显示全部楼层
    梁工 发表于 2024-4-24 23:22
    PCON=0x02;
    _nop_();  //至少3个NOP
    _nop_();

    PCON = 0x02;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();

    刚试了下,在下面添加了6个nop,还是只要P51的中断打开,就会出现RTC闹钟偶尔唤不醒的情况。

    难道卡死在了P51的中断函数里面了?可是已经做了只要进入中断函数就立刻清中断标志,按说也不应该卡死的
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2934

    回帖

    6617

    积分

    超级版主

    积分
    6617
    发表于 2024-4-25 11:02:45 | 显示全部楼层
    miaoyahan 发表于 2024-4-24 23:55
    PCON = 0x02;
    _nop_();
    _nop_();

    专门改了个程序测试你的应用,没有问题的。各个中断都是相互独立的。请直接下载HEX文件测试,主频11.0592MHz,串口115200,8,n,1。

    程序上电默认时间11:59:55",闹铃12:00:30"。
    上电后串口提示“STC8H RTC Test Prgramme!”,然后睡眠。
    5秒后分唤醒,串口返回“24-04-25 12:00:00”。
    再30秒后闹铃唤醒,串口返回:“滴滴滴! 闹铃!  24-04-25 12:00:30”。
    MCU睡眠时,随时可以按下P5.1唤醒,串口返回:“P5.1下降沿中断”。

    测试界面截图2.JPG

    测试界面截图1.JPG

    04-RTC分唤醒-闹钟唤醒-串口1设置返回时间-普通IO中断唤醒.rar (220.2 KB, 下载次数: 2)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    7 天前
  • 签到天数: 1 天

    [LV.1]初来乍到

    4

    主题

    22

    回帖

    54

    积分

    注册会员

    积分
    54
     楼主| 发表于 2024-4-25 12:24:03 | 显示全部楼层
    梁工 发表于 2024-4-25 11:02
    专门改了个程序测试你的应用,没有问题的。各个中断都是相互独立的。请直接下载HEX文件测试,主频11.0592M ...

    收到,谢谢梁工,这就试下
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-4 16:48 , Processed in 0.076601 second(s), 73 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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