- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2025-04-10 09:51:49
注册会员
- 积分
- 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; //中断方式读取比较器比较结果
}
|
|