📄 power_module.c
字号:
/*===========================================================================
* 2006年。三星仪表SOC芯片开发项目
*
*
* 文件名称:Power_Module.c
* 文件标识:
* 摘 要:
*
*
* 当前版本:Ver 1.0
* 作 者:罗冬生
* 修改内容:
* 修改日期:
* 完成日期:
===============================================================================================*/
#ifndef _Power_Module_
#define _Power_Module_
//===============================================================================================
#include "includes.h"
//===============================================================================================
void GotoSleep(void)
{
// LCDCON =0;
/*
PINMAP0 = 0xFF;
PINMAP1 = 0xFF;
PINMAP2 = 0xFF;
*/
IE_bit.EA = 0;
IPSMF = 0;
//todo:shut down the core
KYREG = 0xa7;
POWCON = 0x10;
asm(" NOP ");
asm(" NOP ");
asm(" NOP ");
}
// 电源中断管理程序
#pragma vector=0x43
__interrupt void PSM_ISR(void)
{
if (IPSMF_bit.FVDC)
{
IPSME_bit.EVDCIN =0; //关闭Vin(+12v)检测中断
if (!E2_Op_Flg) //如果E2PROM正在操作
{
SaveData(); //掉电数据保存
SaveData_Flg = 1;
}
}
if (IPSMF_bit.FPSR)
{ //恢复220v供电
IPSMF_bit.FPSR = 0;
}
IPSMF=0;
}
//-------------------------------------------------------------------------------------------------------
void SaveData(void)
{
rPKwhPwrSum_Dtr[0]=DataSum(rPPwrKwh_Dtr,20);
rNKwhPwrSum_Dtr[0]=DataSum(rNPwrKwh_Dtr,20);
rPKvarhPwrSum_Dtr[0]=DataSum(rPPwrKvarh_Dtr,20);
MoveData_Api((unsigned int)(&rUpDownPowerDataBuf[0])+iRAM_Adr,eUpDownPowerDataBuf+e2RAM_Adr,UpSaveDataLen); //装载掉电时的数据
}
// 正常工作模式RunPSM0(外电源供电)
// 1、
//
//
//
//
void RunPSM0(void)
{
// unsigned char i;
ClearWatchDog();
BATPR = 0; //Battery switchover was enabled on low Vdd.
Timer0_Init(); //BUZHIDAO 用来做什么?
RTC_Init(); //RTC初始化
LcdInit(); //LCD初始化
I2C_Init(); //I2C初始化
ClearWatchDog(); //喂狗
SysData_Init();
MeasurementInit();
UartInit();
Disp_Flg = 0; // 置停显标志
LcdSetDisplay(0xff); // 清显示屏 (也可以置lcd不使能)
Disp_Time = 3;
EnergyModuleInit(); //能量模块已复位,初始化模块
IPSMF = 0; //电源模块所有中断标志清零
IPSME = 0; //电源模块所有中断使能都关闭
//IPSME_bit.EVDCIN =1; //Vin(+12v)检测中断使能
//IEIP2_bit.EPSM =1; //电源模块中断使能(FVDC中断,PSR中断为不可屏蔽)
// PS_FVDC =0; //清 CT 供电标志
IPSMF = 0; //电源模块所有中断标志清零
IPSME = 0; //电源模块所有中断使能都关闭
if (SCON != 0xD0)
G_LED = 0;
IE_bit.EA=1;
// DelayMs(255); //延时10ms
P_LED = 1;
while(PERIPH_bit.VSWSOURCE)
{
// P_LED = 1;
ClearWatchDog();
if(IPSMF_bit.FVDC) //VDCIN falling detected (状态位)
{
//todo: backup data and then shut down the core if battery swithover occurs.
//IPSMF_bit.FVDC = 0;
//EnergySave();
P_LED = 0;
DelayMs(255);
IE_bit.EA = 0;
if (!SaveData_Flg)
SaveData(); //掉电数据保存
while(IPSMF_bit.FVDC) //12V input test
{
if(IPSMF_bit.FBSO) //电池供电否?
{
IPSMF = 0; //software clear the flag
//BATPR = 0x01;//Battery switchover on low VDD and low VDCIN
//FlagPSM_bit.FlagBSO = 0;
//RTCAlarmDisable();
//LcdBlinkEnable();
// LcdDisplay();
GotoSleep();
}
else if(IPSMF_bit.FPSR) //外电源VDD供电恢复检测
{
IPSMF_bit.FPSR = 0;
//SoftReset();
}
//G_LED = 0;
}
SaveData_Flg = 0;
IPSME_bit.EVDCIN =1; //开启Vin(+12v)检测中断
IE_bit.EA = 1;
}
else
{ //以下是正常电源下的工作程序
TimeModule();
CommModule();
SecModule();
KeyDispModule();
/*
TimeModule();
LcdDispModule();
CommModule();
*/
}
}
}
/*
while (!Run_Mode) // Run_Mode=0(正常工作模式)
{
ClearWatchDog();
if (PERIPH_bit.VSWSOURCE) //判断供电方式,220V供电,内循环,电池供电推出模块
{
if (IPSMF_bit.FVDC) //12v电源是否降低?
{
if (PowerDown_Flg)
{
; //掉电数据处理
PowerDown_Flg = 0;
}
// 此处插入电源工作在低电压区模式(12V已低,但VDD5v还有又没有进入电池供电)
}
else
{ //以下是正常电源下的工作程序
ClearWatchDog();
TimeModule();
LcdDisp_Module();
}
}
else
{
Run_Mode = 1; //Run_Mode = 1,置电池供电工作模式
if (PowerDown_Flg)
{
; //掉电数据处理
PowerDown_Flg = 0;
}
if (PERIPH_bit.VSWSOURCE)
{
ShowXH(Disp_XH_Buffer[0]); //刷新显示缓冲区的数据
GotoSleep();
}
}
}
}
*/
void RunPSM1(void)
{
ClearWatchDog();
RTC_Init();
TIMECON = (TIMECON & 0x84) | 0x51; // 24小时,
// Timer0_Init();
// LcdInit();
Disp_Flg = 0; // 置停显标志
LcdSetDisplay(0x07); // 清显示屏 (也可以置lcd不使能)
Disp_Time = 3;
PINMAP0 = 0xFF;
PINMAP1 = 0xFF;
PINMAP2 = 0xFF;
// I2C_Read (I2C_SlvAdr,0x10,(unsigned int)&TimeBuffer[3]+iRAM_Adr,4);
TCON_bit.IT0 = 1; //外部输入0为边沿触发
TCON_bit.IE0 = 1; //外部输入0中断使能
INTPR =0;
IPSMF = 0; //电源模块所有中断标志清零
IPSME = 0; //电源模块所有中断使能都关闭
// IPSME_bit.EVDCIN =0;// 1; //Vin(+12v)检测中断使能
// IEIP2_bit.EPSM = 0; //电源模块中断使能(FVDC中断,PSR中断为不可屏蔽)
// PS_FVDC =0; //清 CT 供电标志
IE_bit.EA=1;
GotoSleep();
}
//=======================================================================================
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -