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: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:57 编辑
目前被卡住的问题看来是有2个问题,第1个是软件问题,第2个是硬件问题,硬件这个问题最重要了。
1、软件问题,目前发现掉电唤醒专用定时器并未启动似的,在外部供电消失以后的长时间里P36引脚均未变化
用这个测试
国学芯用 发表于 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 15:07
1、用这个软件提供的范例,掉电专用定时器是启动了。我发现我这个软件用的方法不对,参考这个芯片的说明 ...
我参考你的例程做了些修改,查询比较器执行复位或者唤醒闪灯都正常。
从RAM读取32K频率方法建议参考我们的例程:
ADC采集参考电压值如果你没有设置转换结果对齐的话,默认是左对齐模式,需要将采集值右移6位:
乘风飞扬 发表于 2023-2-17 17:40
我参考你的例程做了些修改,查询比较器执行复位或者唤醒闪灯都正常。
谢谢,这里从RAM读我改成了从CHIPID里面读,现在正常了 这个帖子的问题我现在罗列一下,目前都发现了原因。
1、32K频率从RAM改到了CHIPID那边,掉电专用定时器正常了。
2、仅用电池供电,单片机不启动的原因是先前留的电没有消失,单片机仍处于掉电模式,再以电池供电以不会恢复,因为当时的掉电专用定时器程序有问题。
页:
[1]