📄 foreground.c
字号:
/********************************************************************************
* 杭州利尔达 *
* MSP430FE42X单相防窃电多功能电表平台 *
* ----- ESP SD16实现 *
* *
* *
* 说明:本软件为杭州利尔达单相防窃电多功能电表DEMO软件 *
* 软件功能:FE42X,ESP SD16模块实现单相电表防窃电多功能功能 *
* 版本:V1.2 *
* 编辑:周震宇 *
* 修改: *
* 修改日期:2005.7.20 *
* 修改说明:测试频率一致性,测试结果频率一致性理想 *
* 备注:未经利尔达公司同意,不得随意传播 *
* 编译器要求:AQ430 V2.0.6.5及以上版本 *
* *
*********************************************************************************/
#include "msp430xe42x.h"
#include "globe.h"
#include "extern_function.h"
#include "emeter_cfg.h"
extern uint32 ul_actensper1;
extern uint32 ul_actensper2;
struct phase_parms_s phase_nv;
struct phase_parms_s *phase = &phase_nv;
struct emeter_var emeter;
/*******************************************************************************
* 初始化时钟 *
********************************************************************************/
static __inline__ void init_fll(void)
{
FLL_CTL0 |= XCAP14PF; /* 配置电容 */
SCFI0 = FLLD_1; /* Freq = 1.024MHz */
SCFQCTL = 32 - 1;
FLL_CTL0 |= DCOPLUS;
} // End of fll_init()
/*******************************************************************************
* 提升主频到 8MHz *
********************************************************************************/
static __inline__ void goto_high_freq(void)
{
/* 提升主频前,应确认电源电压是合适跑高频 */
SVSCTL |= (SVSON | 0x60);
/* 等待电源电压到适合跑高频 */
while ((SVSCTL & SVSOP));
/* 电源电压已适合CPU跑高频,SVS进入低电压检测复位状态 */
SVSCTL |= PORON;
/* 提升主频到 8MHz */
SCFI0 = FN_3 | FLLD_4;
SCFQCTL = 64 - 1;
} // End of goto_high_freq()
/*******************************************************************************
* 初始化基本定时器 *
********************************************************************************/
static __inline__ void init_bt(void)
{
/* 初始化LCD控制器 */
LCDCTL = 0x03D; // 4mux LCD, segs16-23 = outputs
/* 设置中断频率为 1/64s, 液晶时钟原32分频 */
BTCTL = BT_fLCD_DIV32 | BT_fCLK2_DIV8 | BT_fCLK2_ACLK_DIV256;
/* 1s 中断使能 */
IE2 |= BTIE;
} // End of init_bt()
/********************************************************************************
* 初始化定时器A和TIMERA CCR0 *
* *
* 说明:定时器工作模式,增计数模式,计数到CCR0,再清零计数。 *
* 作用:定时检查能量累计,判断是否输出校表脉冲。 *
*********************************************************************************/
static __inline__ void init_TA(void)
{
TACTL = TACLR | TASSEL_1;
TACTL |= MC_2;
TACCR0 = SAMPLE_PERIOD;
TACCTL0 = CCIE;
} //End of init_TA()
/*******************************************************************************
* 系统初始化 *
********************************************************************************/
static __inline__ void init_sys(void)
{
/* 初始化内部时钟寄存器 */
if (!check_rtc_sumcheck())
{
rtc.second = 1;
rtc.minute = 1;
rtc.hour = 1;
rtc.day = 1;
rtc.month = 1;
rtc.year = 5;
set_rtc_sumcheck();
}
// P1.7中断设置
P1SEL &= ~(BIT0+BIT1);
P1IES |= BIT0+BIT1;
P1DIR &= ~(BIT0+BIT1);
P1IFG = 0;
P1IE |= BIT0+BIT1;
} //End of init_sys()
static __inline__ void DefaultSetting(void)
{
if((emeter.ucFlashOperated[0] != 0x55) || (emeter.ucFlashOperated[1] != 0x55))
{
emeter.ucFlashOperated[0] = 0x55;
emeter.ucFlashOperated[1] = 0x55;
// 校表寄存器初始化
emeter.f_Cz1 = CURRENT_CH1_100_Cz;
emeter.f_Cz2 = CURRENT_CH2_100_Cz;
emeter.l_PowerOffset1 = 0;
emeter.l_PowerOffset2 = 0;
emeter.f_PhaseCorr1 = 0;
emeter.f_PhaseCorr2 = 0;
emeter.ui_GainCorr1 = 0x4000;
emeter.ui_GainCorr2 = 0x4000;
emeter.ui_SD16_CurrentCorr1 = 2300;
emeter.ui_SD16_CurrentCorr2 = 2228;
emeter.ui_SD16_VoltageCorr1 = 9359;
emeter.ul_TempSampleOffset = TEMPERATURE_OFFSET;
store_flash_var((char *)0x1010,(char *)&emeter.ucFlashOperated[0], STORE_IN_FLASH_NUM);
}
}
static __inline__ void ReadDataFromFlash(void)
{
char * flash_ptr;
char * ram_ptr;
uint8 i;
flash_ptr = (char *)0x1010;
ram_ptr = (char *)&emeter.ucFlashOperated[0];
for(i=0;i<STORE_IN_FLASH_NUM;i++)
{
* ram_ptr++ = * flash_ptr++;
}
}
////////////////////////////////////////////
void main (void)
{
WDTCTL = WDTPW + WDTHOLD;
init_sys();
ReadDataFromFlash(); // 从flash 中恢复数据,初始化
DefaultSetting();
init_bt(); // 初始化基本定时器
init_TA(); // 初始化TA,为校表脉冲用
init_fll(); // 初始化时钟,锁相环
goto_high_freq(); // 提升主频到 8MHz
clr_lcd_display(); // 清LCD显示
//_BIS_SR(LPM3_bits);
emeter.ucCalibrationOption = 1;
emeter.ui_meter_status |= REQUIRE_LCD_UPDATE;
_EINT();
while (1)
{
if((emeter.ui_anti_tamperring_status & IN_ONLY_RTC_MODE) == IN_ONLY_RTC_MODE)
_BIS_SR(LPM3_bits); //低功耗模式3
else
_BIS_SR(LPM0_bits); //低功耗模式0
if((emeter.ui_anti_tamperring_status & EXTERN_VOLTAGE_SENSOR) == EXTERN_VOLTAGE_SENSOR)
{
if(emeter.ui_voltage_V1RMS < 8000)
{
SwitchToSD16Measure();
}
else
{
SwitchToESPMeasure();
}
}
else
{
OnlyRTCMode();
}
if(((emeter.ui_anti_tamperring_status & IN_SD16_MEASURE_MODE) == IN_SD16_MEASURE_MODE)
&& ((emeter.ui_anti_tamperring_status & IN_ESP_MEASURE_MODE) == 0))
{
// In SD16 Measure Mode
if((emeter.ui_anti_tamperring_status & SD16_MEASURE_NEW_LOG) == SD16_MEASURE_NEW_LOG)
{
log_parameters();
if(++emeter.uc_switch_delay_counter >= 2)
{
emeter.ui_voltage_V1RMS = voltage();
emeter.ui_current_IRMS = current()/10;
emeter.uc_switch_delay_counter = 2;
}
emeter.ui_anti_tamperring_status &= ~SD16_MEASURE_NEW_LOG;
}
}
else if(((emeter.ui_anti_tamperring_status & IN_ESP_MEASURE_MODE) == IN_ESP_MEASURE_MODE)
&& ((emeter.ui_anti_tamperring_status & IN_SD16_MEASURE_MODE) == 0))
{
//In ESP Measure Mode
#ifndef ENERGY_1SEC
if((emeter.ui_meter_status & ENSPER_INT_OCCUR)== ENSPER_INT_OCCUR)
{
emeter.ui_meter_status &= ~ENSPER_INT_OCCUR;
ActensperReadyIntMapping();
}
#endif
// 若在后台按键中断传递了调整ESP参数的信息,则重设ESP参数
if((emeter.ui_meter_status & REQUIRE_MODIFY_ESP_PARAM) == REQUIRE_MODIFY_ESP_PARAM)
{
init_esp_parameter(); // 初始化ESP参数寄存器
start_measurement(); // 进入测量模式
emeter.ui_meter_status &= ~REQUIRE_MODIFY_ESP_PARAM;
}
if((emeter.ui_meter_status & ENRDY_INT_OCCUR) == ENRDY_INT_OCCUR)
{
// 新一秒的能量准备好
if(++emeter.uc_switch_delay_counter >= 2)
{
EnergyReadyIntMapping();
emeter.uc_switch_delay_counter = 2;
}
emeter.ui_meter_status &= ~ENRDY_INT_OCCUR;
}
}
else
{
// In Only RTC Mode of In Error Mode, Correcting
emeter.ui_anti_tamperring_status &= ~IN_ESP_MEASURE_MODE;
emeter.ui_anti_tamperring_status &= ~IN_SD16_MEASURE_MODE;
}
if((emeter.ui_meter_status & REQUIRE_RTC_CORRENT) == REQUIRE_RTC_CORRENT)
{
correct_rtc();
emeter.ui_meter_status &= ~REQUIRE_RTC_CORRENT;
}
if((emeter.ui_meter_status & REQUIRE_FLASH_OP) == REQUIRE_FLASH_OP)
{
store_flash_var((char *)0x1010,(char *)&emeter.ucFlashOperated[0], STORE_IN_FLASH_NUM);
emeter.ui_meter_status &= ~REQUIRE_FLASH_OP;
}
if((emeter.ui_meter_status & BT_1SEC_INT_OCCUR) == BT_1SEC_INT_OCCUR)
{
BasicTimerIntMapping();
emeter.ui_meter_status &= ~BT_1SEC_INT_OCCUR;
}
if((emeter.ui_meter_status & REQUIRE_LCD_UPDATE) == REQUIRE_LCD_UPDATE)
{
update_display();
emeter.ui_meter_status &= ~REQUIRE_LCD_UPDATE;
}
} // End of while (1)
} // End of main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -