找回密码
 立即注册
查看: 75|回复: 8

请教32G的RTC时钟的使用 | 已解决

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-17 11:36:41 | 显示全部楼层 |阅读模式
请教大家:RTC时钟的程序是在试验箱9.6的第45例程《45-内部RTC时钟程序》上修改的,暂时使用内部32K时钟源,我期望每1秒产生中断,用P01反转观测,每一分钟产生中断,用P00反转观测。结果波形如下:好像是到1秒后,P00、P01都翻转了,而且瞬间又翻转了一次。程序如下,请各位看看问题出在哪里?谢谢。



void RTC_config(void)
{
    INIYEAR = 21;                                     //Y:2021
    INIMONTH = 12;                                    //M:12
    INIDAY = 31;                                      //D:31
    INIHOUR = 23;                                     //H:23
    INIMIN = 59;                                      //M:59
    INISEC = 50;                                      //S:50
    INISSEC = 0;                                      //S/128:0
                                
    ALAHOUR = 0;                                                        //闹钟小时
    ALAMIN  = 0;                                                        //闹钟分钟
    ALASEC  = 0;                                                        //闹钟秒
    ALASSEC = 0;                                                        //闹钟1/128秒
                        
                IRC32KCR = 0x80;                                   //启动内部32K晶振.
    while (!(IRC32KCR & 1));  //等待时钟稳定
    RTCCFG = 0x03;                                    //选择内部32K时钟源,触发RTC寄存器初始化

    RTCIF = 0x00;                                     //清中断标志
    RTCIEN = 0x18;                                    //中断使能, 0x10:分钟中断, 0x08:秒中断
    RTCCR = 0x01;                                     //RTC使能

    while(RTCCFG & 0x01);                        //等待初始化完成,需要在 "RTC使能" 之后判断
}
/******************** RTC 中断函数 *********************/
void RTC_Isr() interrupt 13
{
        if(RTCIF & 0x08)                        //秒中断
        {
                RTCIF &= ~0x08;        
                P01=!P01;
        }
        
        if(RTCIF & 0x10)                        //分钟中断
        {        RTCIF &= ~0x10;
                P00=!P00;
        }
}

EA在主程序中打开。

IMG_20250717_111911[1].jpg
回复

使用道具 举报 送花

3

主题

247

回帖

-795

积分

等待验证会员

积分
-795
发表于 2025-7-17 11:38:00 | 显示全部楼层
请教STC32G的RTC时钟使用问题,以下为专业回复:

您在使用STC32G的RTC功能时,遇到每秒和每分钟中断同时触发且出现异常翻转的现象,可能与RTC配置、中断使能及处理逻辑有关。以下是对您代码的分析与建议:

1. RTC初始化配置  
   您在RTCconfig()函数中设置了初始时间(如年、月、日、时、分、秒等),并启用了内部32K时钟源。这部分配置基本正确,但需注意以下几点:
IRC32KCR = 0x80;用于启动内部32K晶振,随后通过while (!(IRC32KCR & 1));等待时钟稳定,该逻辑合理。
RTCCFG = 0x03;表示选择内部32K作为时钟源,并触发RTC寄存器初始化。此设置无误。

2. 中断配置问题  
   您在代码中设置了RTCIEN = 0x18;,即同时使能了秒中断(0x10)和分钟中断(0x08)。然而,在实际运行中,若未对中断进行恰当的清除或处理,可能导致中断重复触发或冲突。

   建议:
在每次中断服务程序中,应先清除对应的中断标志位,例如:RTCIF &= ~0x10;(清除秒中断)和RTCIF &= ~0x08;(清除分钟中断)。
若仅希望每秒触发一次P01翻转,而每分钟触发一次P00翻转,可考虑将两个中断分别处理,避免相互干扰。

3. 中断服务程序逻辑问题  
   当前代码未展示中断服务程序(ISR)部分,因此无法判断是否对中断进行了正确响应。若您在同一个ISR中处理两种中断,可能会导致逻辑混乱,从而引发异常翻转现象。

   建议:
分别编写秒中断和分钟中断的处理函数,确保每个中断只执行对应的操作。
在中断服务程序中,首先检查中断标志位,再执行相应操作,并及时清除标志位,防止重复触发。

4. 硬件与时钟稳定性问题  
   内部32K时钟源虽然方便,但其精度可能略低于外部晶振。若系统运行环境存在较大温度波动或电源不稳定,可能影响RTC的准确性,进而导致中断频率异常。

   建议:
如条件允许,可尝试使用外部32K晶振以提高时钟精度。
确保电路设计合理,避免因电源噪声或其他干扰导致时钟不稳定。

5. 调试建议  
使用示波器或逻辑分析仪观察P00和P01的实际翻转情况,确认是否为软件逻辑错误或硬件问题。
添加调试输出(如LED闪烁、串口打印等),帮助定位中断触发频率和顺序。
参考STC官方提供的例程(如《45-内部RTC时钟程序》),对比您的代码,查找差异点。

综上所述,您当前的问题可能源于中断配置不当、中断处理逻辑不清晰或时钟稳定性不足。建议按照上述建议逐一排查,并确保中断标志位被正确清除和处理。如仍有疑问,可提供更多代码细节以便进一步分析。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-17 11:38:35 | 显示全部楼层
瞬间翻转的图片
IMG_20250717_111625[1].jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:281
  • 最近打卡:2025-07-31 15:01:42
已绑定手机

12

主题

176

回帖

1720

积分

金牌会员

积分
1720
发表于 2025-7-17 11:52:24 | 显示全部楼层
IO口初始化了吗?默认是高阻态
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-17 12:12:55 来自手机 | 显示全部楼层
C_wolf 发表于 2025-7-17 11:52
IO口初始化了吗?默认是高阻态

已经初始化为准双向。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-17 13:06:56 | 显示全部楼层
搞明白了,是中断向量次序错了,void RTC_Isr() interrupt 13 其中13应该是36 ,谢谢各位的回复。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-17 14:28:46 | 显示全部楼层
继续请各位:选择内部32K时钟源,程序达到了预期的目的,但改外部选择外部32K时钟源,又不行了。例程中选择内部32K时钟源运行以下语句:
        IRC32KCR = 0x80;                                   //启动内部32K晶振.
        while (!(IRC32KCR & 1));                    //等待时钟稳定
       RTCCFG = 0x03;                                    //选择内部32K时钟源,触发RTC寄存器初始化

启动外部32K晶振,使用以下语句:
    X32KCR = 0x80 + 0x40;                        //启动外部32K晶振, 低增益+0x00, 高增益+0x40.
    while (!(X32KCR & 1));                          //等待时钟稳定
    RTCCFG = 0x01;                                  //选择外部32K时钟源,触发RTC寄存器初始化
在程序中,将使用内部32K时钟源改为使用外部时钟源后,RTC就不工作了。请问各位,使用外部时钟源,还需要修改哪里?谢谢。实验箱用的是32G实验箱9.6。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-17 14:29:59 | 显示全部楼层
IO口模式,P1.6,P1.7已设定为准双向。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 2025-7-18 09:32:33 | 显示全部楼层
已经搞定,没有想到手头居然2个晶振都是坏的,第三个才可以。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-31 22:56 , Processed in 0.128326 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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