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

STC8H8K64U关于低功耗设计(比较器|掉电模式|掉电专用定时...

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-24 08:05:57

7

主题

19

回帖

457

积分

中级会员

积分
457
发表于 2023-2-17 11:30:14 | 显示全部楼层 |阅读模式
电路图如STC8H参考手册中27.2【RTC实战线路图】
外部供电消失后,确实进入了比较器中断,证据:指示灯引脚有变成高电平。并且成功进入了掉电模式,证据:电池耗电电流2.75uA。
但是恢复供电以后,没有重启。应该是查询比较器结果那块出了问题,掉电唤醒专用定时器应是起了作用的。证据:多次插拔外部供电,P36引脚变化。
1、请教一下关于查询电量恢复那块,是有什么问题。
2、发现若整个系统没有外部供电,单以电池供电,一上电的话,单片机程序没有启动,然后电池以mA级的电流消耗,有哪些可能的原因,是发生了什么问题。证据:若单片机程序启动,P36引脚会有200ms的电平变化。

void CMP_ISR(void) interrupt INTERRUPT_CMP
{
    CMPCR1 &= ~CMPIF;  //清除比较器中断标志位
    //处理语句
    //关耗电设备
    P54 = 1;  //关闭传感器
    P33 = 0;  //停用阀
    P35=P36=1;  //关闭指示灯
    CMPCR1 &= ~CMPEN;  //关闭比较器
    ADC_CONTR = 0;  //关闭ADC
    EA = 0;
    //掉电记录
    RecordAdd(RECORD_TYPE_POWER_DOWN);
    //置不为高阻模式的IO口为高阻模式
    GPIO_Init(IO_P1,0xFF,IO_GZ,1);  //高阻模式
    GPIO_Init(IO_P3,0xFF,IO_GZ,1);  //高阻模式
    GPIO_Init(IO_P5,0xFF,IO_GZ,1);  //高阻模式

    SYSTEM_PD();  //进入掉电模式

    while (1)
    {
        CMPCR1 |= CMPEN;  //使能比较器
        //延时15us
        Delay15us();
        if (CMPCR1 & CMPRES)  //若电量恢复
        {
            SYSTEM_RESET_USER();  //重启
        } else {
            CMPCR1 &= ~CMPEN;  //关闭比较器。期间等待掉电专用定时器唤醒
            SYSTEM_PD();  //进入掉电模式
            _nop_();_nop_();_nop_();_nop_();
          P36 = !P36;
        }
    }
}

微信qsssuv
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-24 08:05:57

7

主题

19

回帖

457

积分

中级会员

积分
457
发表于 2023-2-17 11:48:30 | 显示全部楼层
本帖最后由 青穗三三 于 2023-2-17 11:51 编辑

//CMPCR1寄存器指示位
#define CMPEN 0x80  //比较器模块使能位
#define CMPIF 0x40  //比较器中断标志位
#define CMPOE 0x02  //比较器结果输出控制位
#define CMPRES 0x01  //比较器的比较结果

/********************************
功能描述:软件复位后从用户区开始执行代码
参数说明:无
返回值:无
********************************/
void SYSTEM_RESET_USER(void)
{
    IAP_CONTR = 0x20;
}

/********************************
功能描述:进入掉电模式
参数说明:无
返回值:无
********************************/
void SYSTEM_PD(void)
{
    PCON |= 0x02;
}


void main(void)
{
    TargetIOInit();  //目标板的IO口初始化

    CMP_Init();  //比较器初始化
    WKT_Init(5000);  //初始化掉电专用定时器
    WKT_Open();  //开启掉电专用定时器
   
    EA = 1;  //开启总中断

   
    while (1)
    {
        ;
    }
}



//WKTCH 掉电唤醒定时器计数寄存器,高8位
#define WKTEN 0x80  //掉电唤醒定时器的使能控制位
#define WKT_CLOCK_FRE (*(volatile u16 idata *)0xF8)  //内部掉电唤醒定时器专用定时器出厂时钟频率

/********************************
功能描述:初始化掉电唤醒定时器
参数说明:ms:定时唤醒时间
返回值:0-成功;1-失败
********************************/
u8 WKT_Init(u16 ms)
{
    WKT_Close();  //关闭掉电唤醒定时器
    ms = (ms*(u32)WKT_CLOCK_FRE+8000UL)/16000UL;  //计算要设置的计数次数
    ms -= 1;  //要写入的值需比实际值少1
    if (!ms || ms>=32767)  //若计算后的值为内部使用值,或者过大,是不允许的
    {
        return 1;
    }
   
    WKTCL = ms;
    WKTCH = ms>>8;
   
    return 0;
}

/********************************
功能描述:打开掉电唤醒定时器
参数说明:无
返回值:无
********************************/
void WKT_Open(void)
{
    WKTCH |= WKTEN;
}

微信qsssuv
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-24 08:05:57

7

主题

19

回帖

457

积分

中级会员

积分
457
发表于 2023-2-17 11:53:18 | 显示全部楼层
本帖最后由 青穗三三 于 2023-2-17 11:57 编辑

目前被卡住的问题看来是有2个问题,第1个是软件问题,第2个是硬件问题,硬件这个问题最重要了。
1、软件问题,目前发现掉电唤醒专用定时器并未启动似的,在外部供电消失以后的长时间里P36引脚均未变化
微信qsssuv
  • 打卡等级:常住居民III
  • 打卡总天数:172
  • 最近打卡:2025-04-28 08:49:07
已绑定手机

90

主题

961

回帖

2318

积分

超级版主

积分
2318
QQ
发表于 2023-2-17 13:11:30 | 显示全部楼层
用这个测试

1.png
热线19952583534
www.STCAI.com
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-24 08:05:57

7

主题

19

回帖

457

积分

中级会员

积分
457
发表于 2023-2-17 15:07:56 | 显示全部楼层

1、用这个软件提供的范例,掉电专用定时器是启动了。我发现我这个软件用的方法不对,参考这个芯片的说明书上掉电专用定时器部分,188页,写的频率存储的位置不对,说明书上提供信息和软件提供的信息不一致,建议修改一下说明书。
2、  现在修复一下程序之后,掉电专用定时器启动了。但是在比较器中断这里一直在死循环里面,恢复外部供电出不来,这里检测参考电压一直在0x3FF0左右,是什么问题?
  while (1)
    {
        SYSTEM_PD();  //进入掉电模式,期间
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        P35 = !P35;
        ADC_CONTR |= 0x80;  //开启ADC
        Delay1ms();
        
        ADC_CONTR &= ~0x20;  //清除转换完成标志位
        ADC_CONTR = ADC_CONTR&~0x0F|15;  //选择ADC的通道
        ADC_CONTR |= 0x40;  //开始转换
        while (!(ADC_CONTR&0x20));  //等待转换完成
        if (((u16)ADC_RES<<8|ADC_RESL) < 1059)  //若电压高于4.6V
        {
            SYSTEM_RESET_USER();  //重启
        }
    }
微信qsssuv
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2023-2-17 16:00:01 | 显示全部楼层
掉电之后,停止运行程序,不能做查询动作,除非你定时醒来去查询。
比较器可以用中断唤醒的。
但是比较器会耗电,我常用外中断上升沿唤醒,基本不多耗电。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-2-17 17:40:45 | 显示全部楼层
青穗*** 发表于 2023-2-17 15:07
1、用这个软件提供的范例,掉电专用定时器是启动了。我发现我这个软件用的方法不对,参考这个芯片的说明 ...

我参考你的例程做了些修改,查询比较器执行复位或者唤醒闪灯都正常。
睡眠-唤醒定时器唤醒.zip (8.34 KB, 下载次数: 173)

从RAM读取32K频率方法建议参考我们的例程:
1.png

ADC采集参考电压值如果你没有设置转换结果对齐的话,默认是左对齐模式,需要将采集值右移6位:
2.png
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-24 08:05:57

7

主题

19

回帖

457

积分

中级会员

积分
457
发表于 2023-2-18 08:10:19 | 显示全部楼层
乘风*** 发表于 2023-2-17 17:40
我参考你的例程做了些修改,查询比较器执行复位或者唤醒闪灯都正常。

谢谢,这里从RAM读我改成了从CHIPID里面读,现在正常了
微信qsssuv
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-04-24 08:05:57

7

主题

19

回帖

457

积分

中级会员

积分
457
发表于 2023-2-18 08:13:04 | 显示全部楼层
这个帖子的问题我现在罗列一下,目前都发现了原因。
1、32K频率从RAM改到了CHIPID那边,掉电专用定时器正常了。
2、仅用电池供电,单片机不启动的原因是先前留的电没有消失,单片机仍处于掉电模式,再以电池供电以不会恢复,因为当时的掉电专用定时器程序有问题。
微信qsssuv
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-2 22:15 , Processed in 0.146221 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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