fs_man2023 发表于 2025-3-17 09:06:22

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

32G12K128: RTC,睡眠时候用外部时钟32.768KHz,RTC运行,外部中断唤醒后使用内部24Mhz时钟运行吗?

_奶咖君_ 发表于 2025-3-17 10:13:46

RTC不需要切换时钟源,就一直使用外部低速晶振就行。。

_奶咖君_ 发表于 2025-3-17 10:14:14

系统时钟可以设置为24M ,,

DebugLab 发表于 2025-3-17 10:39:01

RTC使用外部32768晶振,一直打开不关闭
CPU使用内部24M时钟,睡眠时自动关闭,唤醒后自动打开

fs_man2023 发表于 2025-3-27 08:42:05

外部晶振,32.768K,电容20pF,现在睡眠电流是7uA左右,运行13个小时,STC32G12K128RTC时间比电脑时间快了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;                     //中断方式读取比较器比较结果
}
页: [1]
查看完整版本: 32G,RTC,睡眠时候用外部时钟32.768KHz时钟,唤醒后使用内部24Mhz时钟运行?