青穗三三 发表于 2023-2-17 11:30:14

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

电路图如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;
      }
    }
}

青穗三三 发表于 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;
}

青穗三三 发表于 2023-2-17 11:53:18

本帖最后由 青穗三三 于 2023-2-17 11:57 编辑

目前被卡住的问题看来是有2个问题,第1个是软件问题,第2个是硬件问题,硬件这个问题最重要了。
1、软件问题,目前发现掉电唤醒专用定时器并未启动似的,在外部供电消失以后的长时间里P36引脚均未变化

国学芯用 发表于 2023-2-17 13:11:30

用这个测试


青穗三三 发表于 2023-2-17 15:07:56

国学芯用 发表于 2023-2-17 13:11
用这个测试

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();//重启
      }
    }

梁工 发表于 2023-2-17 16:00:01

掉电之后,停止运行程序,不能做查询动作,除非你定时醒来去查询。
比较器可以用中断唤醒的。
但是比较器会耗电,我常用外中断上升沿唤醒,基本不多耗电。

乘风飞扬 发表于 2023-2-17 17:40:45

青穗三三 发表于 2023-2-17 15:07
1、用这个软件提供的范例,掉电专用定时器是启动了。我发现我这个软件用的方法不对,参考这个芯片的说明 ...

我参考你的例程做了些修改,查询比较器执行复位或者唤醒闪灯都正常。


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


ADC采集参考电压值如果你没有设置转换结果对齐的话,默认是左对齐模式,需要将采集值右移6位:

青穗三三 发表于 2023-2-18 08:10:19

乘风飞扬 发表于 2023-2-17 17:40
我参考你的例程做了些修改,查询比较器执行复位或者唤醒闪灯都正常。




谢谢,这里从RAM读我改成了从CHIPID里面读,现在正常了

青穗三三 发表于 2023-2-18 08:13:04

这个帖子的问题我现在罗列一下,目前都发现了原因。
1、32K频率从RAM改到了CHIPID那边,掉电专用定时器正常了。
2、仅用电池供电,单片机不启动的原因是先前留的电没有消失,单片机仍处于掉电模式,再以电池供电以不会恢复,因为当时的掉电专用定时器程序有问题。
页: [1]
查看完整版本: STC8H8K64U关于低功耗设计(比较器|掉电模式|掉电专用定时...