找回密码
 立即注册
查看: 109|回复: 4

32G,RTC,睡眠时候用外部时钟32.768KHz时钟,唤醒后使用内部24Mhz时钟运行?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-10 09:51:49

4

主题

2

回帖

54

积分

注册会员

积分
54
发表于 2025-3-17 09:06:22 | 显示全部楼层 |阅读模式
32G12K128: RTC,睡眠时候用外部时钟32.768KHz,RTC运行,外部中断唤醒后使用内部24Mhz时钟运行吗?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-3-17 10:13:46 | 显示全部楼层
RTC不需要切换时钟源,就一直使用外部低速晶振就行。。
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-3-17 10:14:14 | 显示全部楼层
系统时钟可以设置为24M ,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-3-17 10:39:01 | 显示全部楼层
RTC使用外部32768晶振,一直打开不关闭
CPU使用内部24M时钟,睡眠时自动关闭,唤醒后自动打开
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-10 09:51:49

4

主题

2

回帖

54

积分

注册会员

积分
54
发表于 2025-3-27 08:42:05 | 显示全部楼层
外部晶振,32.768K,电容20pF,现在睡眠电流是7uA左右,运行13个小时,STC32G12K128  RTC时间比电脑时间快了10S



//========================================================================
// 函数: void CMP_config(void)
// 描述: 比较器初始化函数。
// 参数: 无.
// 返回: 无.
// 版本: V1.0, 2022-10-10
//========================================================================
void CMP_config(void)
{
    CMPEXCFG = 0x00;
//  CMPEXCFG |= 0x40;                           //比较器DC迟滞输入选择,0:0mV; 0x40:10mV; 0x80:20mV; 0xc0:30mV

//  CMPEXCFG &= ~0x04;                          //P3.6为CMP-输入脚
    CMPEXCFG |= 0x04;                           //内部1.19V参考电压为CMP-输入脚

    CMPEXCFG &= ~0x03;                          //P3.7为CMP+输入脚
//  CMPEXCFG |= 0x01;                           //P5.0为CMP+输入脚
//  CMPEXCFG |= 0x02;                           //P5.1为CMP+输入脚
//  CMPEXCFG |= 0x03;                           //ADC输入脚为CMP+输入脚


    CMPCR2 = 0x00;
    INVCMPO = 0;                                //比较器正向输出
//  INVCMPO = 1;                                //比较器反向输出
    DISFLT = 0;                                 //使能0.1us滤波
//  DISFLT = 1;                                 //禁止0.1us滤波
    CMPCR2 &= ~0x3f;                            //比较器结果直接输出
//  CMPCR2 |= 0x10;                             //比较器结果经过16个去抖时钟后输出

    CMPCR1 = 0x00;
    PIE = 0;                                    //禁止比较器上升沿中断
//  PIE = 1;                                    //使能比较器上升沿中断
    NIE = 0;                                    //禁止比较器下降沿中断
//  NIE = 1;                                    //使能比较器下降沿中断

    CMPOE = 0;                                  //禁止比较器输出
//  CMPOE = 1;                                  //使能比较器输出

    CMPO_S = 0;                                 //选择P3.4作为比较器输出脚
//  CMPO_S = 1;                                 //选择P4.1作为比较器输出脚
    CMPEN = 1;                                  //使能比较器模块
               
               
                /*PCMPH=1;
                PCPMP=1;
                PRTCH=1;
                PRTC=1;//
                */
                IP2=0x20;//比较中断最高
                IP2H=0x20;
               
                IP3=0x04;//RTC最高
                IP3H=0x04;
}

//========================================================================
// 函数: void RTC_config(void)
// 描述: RTC初始化函数。
// 参数: 无.
// 返回: 无.
// 版本: V1.0, 2022-10-10
//========================================================================
void RTC_config(void)
{
    INIYEAR = 23;     //Y:2025
    INIMONTH = 02;    //M:03
    INIDAY = 20;      //D:24
    INIHOUR = 17;     //H:23
    INIMIN = 48;      //M:59
    INISEC = 30;      //S:50
    INISSEC = 0;      //S/128:0

    ALAHOUR = 0;        //闹钟小时
    ALAMIN  = 0;        //闹钟分钟
    ALASEC  = 0;        //闹钟秒
    ALASSEC = 0;        //闹钟1/128秒

    //STC32G 芯片使用内部32K时钟,休眠无法唤醒
//    IRC32KCR = 0x80;   //启动内部32K晶振.
//    while (!(IRC32KCR & 1));  //等待时钟稳定
//    RTCCFG = 0x03;    //选择内部32K时钟源,触发RTC寄存器初始化

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


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

    RTCCR = 0x01;     //RTC使能

    while (RTCCFG & 0x01);        //等待初始化完成,需要在 "RTC使能" 之后判断.
    //设置RTC时间需要32768Hz的1个周期时间,大约30.5us. 由于同步, 所以实际等待时间是0~30.5us.
    //如果不等待设置完成就睡眠, 则RTC会由于设置没完成, 停止计数, 唤醒后才继续完成设置并继续计数.
}

/******************** RTC中断函数 *********************/

void RTC_Isr() interrupt 13
{
    if (RTCIF & 0x80)   //闹钟中断
    {
//                P01 = !P01;
        RTCIF &= ~0x80;
        RTCB_Alarm = 1;
    }

    if (RTCIF & 0x08)   //秒中断
    {
//                P00 = !P00;
        RTCIF &= ~0x08;
        RTCB_1s = 1;

    }
}




//如果开启了比较器中断就需要编写对应的中断函数
void CMP_Isr() interrupt 21
{
    CMPIF = 0;                        //清中断标志
//  P10 = CMPRES;                     //中断方式读取比较器比较结果
}
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:31 , Processed in 0.138604 second(s), 69 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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